文章目录
- 前言
- 什么是docker?!docker的作用是什么?!
- 一、下载docker
- 1.卸载docker
- 2.安装yum环境
- 3.更新yum本地软件源
- 4.安装Docker(参数ce:社区版)
- 5.Docker使用中会涉及到各种端口,为了方便使用最好关闭防火墙
- 6.安装成功!查看docker版本
- 7.配置Docker国内镜像加速
- 8.启动Docker
- 二、对镜像操作示例
- 1.拉取镜像
- 2.删除镜像
- 3.导入镜像
- 三、数据卷操作示例
- 1.创建数据卷:
- 2. 映射挂载数据卷:
- 3.绑定挂载数据卷:
- 4.其他命令:
- 四、挂载nginx容器示例
- 1.拉取nginx镜像:
- 2.创建并启动容器 :
- 3.打开浏览器,访问宿主机的 IP 地址(例如,http://127.0.0.1:80),您应该能看到 Nginx 容器示例网站的内容。
- 4.在nginx容器挂载数据卷:
- 五、挂载mysql容器示例
- 1.创建目录
- 2.将初始化脚本拉进去
- 3.创建并运行新mysql容器,挂载本地目录
- 六、挂载redis容器示例
- 七、自定义镜像
- 1.编写dockerfile文件
- 2.生成镜像
- 3.运行容器
- 八、自定义网络
- 九、部署java应用
- 总结
前言
什么是docker?!docker的作用是什么?!
🤔🤔🤔下面就以通俗易懂的方式讲一下它的用处吧~~~
🤔🤔🤔Docker 就像是快递界的 !!“顺丰”!!,它将应用程序及其依赖打包成一个轻量级的、可移植的容器,确保应用程序在各个环境中都能“异地发货、本地签收”。这样一来,开发者无需担心应用程序在不同服务器、数据中心或云平台上的兼容性问题,省去了大量调试和配置的麻烦。
Docker 的主要优势在于其实现了应用程序和基础设施之间的解耦,从而提高了应用程序的部署速度和可维护性。Docker 容器可以轻松地在集群、数据中心和云平台之间进行迁移,从而实现了高度的可扩展性和灵活性。
总之,Docker 是一种现代化的容器技术,它解决了应用程序的开发、部署和运维方面的诸多问题,使得开发者能够更专注于编写代码,而不用担心底层基础设施的复杂性。
一、下载docker
使用环境:centos7
1.卸载docker
如果之前有下载过docker的话,先把docker删除;
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
那如果小伙伴们是全新服务器的话,则不用执行删除,先安装好yum环境
2.安装yum环境
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
3.更新yum本地软件源
sudo su
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g'
/etc/yum.repos.d/docker-ce.repo
yum makecache fast
4.安装Docker(参数ce:社区版)
yum install -y docker-ce
执行以上命令,运行后-y yes or no 都是填y
5.Docker使用中会涉及到各种端口,为了方便使用最好关闭防火墙
#关闭防火墙
systemctl stop firewalld
#禁止开机启动防火墙
systemctl disable firewalld
6.安装成功!查看docker版本
docker -v
7.配置Docker国内镜像加速
点击此链接,登录自己的阿里云账号,复制自己阿里云的加速地址,如下图
复制图中选中指令并运行
8.启动Docker
systemctl start docker #启动docker服务
systemctl stop docker #停止docker服务
systemctl restart docker #重启docker服务
二、对镜像操作示例
常用操作命令:
docker run 新建并启动容器
docker start/stop/pause/unpause
docker logs 查看容器运行日志
docker ps 查看容器的状态(运行中的)
docker ps -a 查看所有容器的状态(包括停止的)
docker stop 暂停指定容器
docker rm 删除指定容器
下面演示拉取镜像,删除镜像,导出镜像三种示例:
1.拉取镜像
1.拉取镜像: docker pull redis
2.查看本地镜像: docker images
3.将镜像导出到磁盘: docker save -o 文件名称 镜像名称:版本
docker save -o redis.tar redis:latest
如上图导出成功!
2.删除镜像
删除本地镜像: docker rmi 镜像名称/ID
docker rmi redis:latest
3.导入镜像
导入镜像: dockerload -i 文件名称
docker load -i redis.tar
三、数据卷操作示例
什么是数据卷:
数据卷(Data Volume)是 Docker 中的一个重要概念,它允许您在容器内外之间共享数据。挂载数据卷有以下几个原因和优势:
数据持久化:数据卷可以让容器中的数据在容器停止或重新启动时得到保留。当容器被删除时,数据卷中的数据不会丢失,从而提高了数据的安全性。
资源共享:通过挂载数据卷,多个容器可以访问同一组数据,实现资源共享。这在多容器应用中尤为重要,例如,当多个容器需要访问相同的数据存储时,可以使用数据卷实现。
隔离性:数据卷在容器之间提供了一种隔离机制。每个容器可以拥有自己的数据卷,避免数据相互干扰。
灵活性:数据卷可以灵活地调整大小,满足不同场景的需求。在运行时,可以根据实际需要扩展或缩小数据卷的大小。
方便部署:通过挂载数据卷,可以简化部署流程。例如,将应用程序的数据存储在数据卷中,可以使容器快速启动和停止,提高运维效率。
安全性:数据卷可以设置访问权限,确保数据的安全。通过对数据卷设置只读或读写权限,可以控制不同容器对数据卷的访问权限,防止数据泄露。
总之,挂载数据卷有助于提高数据的持久性、安全性和共享性,同时简化部署流程,提高容器应用的灵活性和可扩展性。在实际应用中,根据不同场景选择合适的数据卷策略,可以有效提升 Docker 容器化的优势。
数据卷常用操作命令:
数据卷操作的基本语法为: docker volume [COMMAND],其中COMMAND可选值:
create: 创建一个volume;
inspect: 显示一个或多个volume的信息
ls:列出所有的volume
prune: 删除未使用的volume
rm:删除一个或多个指定的volume
1.创建数据卷:
1.创建数据卷:
docker volume create testA
2.查看数据卷:
docker volume ls
3.查看数据卷详细信息:
docker volume inspect testA
(docker volume inspect 数据卷名)
在linux的docker主机中创建一个卷时,其在宿主机对应的目录(挂载点)路径为/var/lib/docker/volumes/卷名/ data
如下图:
那么讲完怎么创建数据卷,下面来看一下怎么把数据卷挂载到容器上!
2. 映射挂载数据卷:
在创建容器时,可以通过–volume或 -v 参数挂载一个数据卷到某个容器目录
例一:
docker run --name testAcon -v testA:/data -d redis
上述命令表示创建一个名为testAcon的容器,将testA卷映射到testAcon容器的/data目录中
注意: 如果卷映射的目录在容器中不存在时,会自动在容器中创建对应的目录一个容器可以使用多个卷,
只需要多次使用-v选项指定即可
例二:
docker run --name testBcon -v testA:/data -v testB:/var/log -d redis
上述命令是用来在 Docker 中启动一个名为 “testBcon” 的容器,并且将宿主机的 “testA” 目录挂载到容器中的 “/data” 目录,同时将宿主机的 “testB” 目录挂载到容器中的 “/var/log” 目录。容器使用的镜像是 redis,并且以后台(-d)模式运行。
当指定的卷不存在时,docker会自动创建对应的卷,上述命令中的testB数据卷会被自动创建
测试:
到外面映射的数据卷里创建一个文件a.txt
进入容器里面查看是否同步:
结果如下:测试通过!挂载成功!
3.绑定挂载数据卷:
前面创建的数据卷都存放在/var/lib/docker/volumes目录中,这个目录是固定的,它们都能被docker volume命令管理
docker还有一种映射宿主机目录的方法,这种方法被称之为”绑定挂载”,绑定挂载能够将指定的宿主机目录挂载到容器中,只需要将卷名替换成宿主机上的目录路径即可
如下:
docker run -d --name testAcon -v /root/test1:/data1 redis
上述命令将宿主机的/root/test1目录映射到容器的/data1目录中绑定挂载不会生成任何卷,它直接将指定的宿主机目录映射到容器中,所以docker volume命令无法查看或管理到绑定挂载的路径。
4.其他命令:
docker volume ls:查看系统有几个卷
关机后启动docker
四、挂载nginx容器示例
1.拉取nginx镜像:
docker pull nginx
2.创建并启动容器 :
docker run --name mynginx -d -p 80:80 nginx
–name:指定容器名称
-p:将宿主机端口与容器端口映射,格式:宿主机端口:容器端口
-d: 后台运行容器
3.打开浏览器,访问宿主机的 IP 地址(例如,http://127.0.0.1:80),您应该能看到 Nginx 容器示例网站的内容。
以上是最简单的部署;
4.在nginx容器挂载数据卷:
先来解释一下为什么要挂载数据卷:
😱😱😱如果按照上面简单方法部署的nginx容器,其中最重要的一点就是当容器被删除时,容器中的数据就会丢失!这是一个影响很大的问题,没有配置数据卷,数据就不能持久化!
😎😎😎而挂载了数据卷,它可以让容器中的数据在容器停止或重新启动时得到保留,
当容器被删除时,数据卷中的数据不会丢失。
也可以通过挂载数据卷,多个容器可以访问同一组数据,实现资源共享等。
下面演示如何在原有的基础上加上挂载:
1、进入Nginx容器当中
docker exec -it nginx /bin/bash
2、在容器中查询出nginx的相关配置文件存放位置
whereis nginx
3.退出容器
exit
效果图如下:
4、本地创建管理目录
mkdir -p /root/nginx/www /root/nginx/logs /root/nginx/conf
5、将容器中的相应文件复制到刚创建的管理目录中(先复制再把之前的容器删了,之前容器的作用就是用来复制文件出来的)
docker cp mynginx:/etc/nginx/nginx.conf /root/nginx/conf
这里注意自己定义的容器名,我是mynginx,改成自己定义的容器名,和在第一步定义的相同
7、再次创建容器并作目录挂载
注意这里是新容器nginx-web
docker run -d -p 80:80 --name nginx-web -v /root/nginx/www:/usr/share/nginx/html -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx nginx
8.删除之前的容器
先停止容器再删除(如下图):
五、挂载mysql容器示例
1.创建目录
mkdir mysql
cd mysql
mkdir init
mkdir conf
mkdir data
如下图:
2.将初始化脚本拉进去
conf文件夹拉入以下文件:
目的是设置utf-8编码
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
init文件夹拉入以下数据库文件:
这是自己准备的数据库文件,如果一开始没有可以不用或者自己导出个数据库文件
3.创建并运行新mysql容器,挂载本地目录
注意版本要一致!下面是 mysql:8.0.28
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
mysql:8.0.28
如下,挂载成功!
创建并导入数据库成功:
测试连接:初始化成功
六、挂载redis容器示例
1.拉取redis镜像
docker pull redis
创建并启动容器
docker run --name myredis -d -p 6379:6379 redis
2.进入容器:
docker exec -it myredis bash
- it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- bash: 进入容器后执行的命令
- 进入容器后执行: redis-cli,使用redis客户端操作redis
在容器中查询出相关配置文件存放位置
whereis nginx
如下图:
七、自定义镜像
如果只是使用镜像,当然不需要了解镜像的内部结构,直接通过docker命令下载和运行就可以了,
但如果我们想创建自己的镜像,或者想理解Docker为什么是轻量级就非常有必要学习这部分知识了。
下面来个简单的示例:
1.下载官方hello-world镜像:
docker pull hello-world
2.运行:
docker run hello-world
如下图:
以上是简单的运用自定义镜像的示例,那么接下来我们怎么生成属于自己的镜像呢?
1.编写dockerfile文件
编写文件之前,我们先了解一下他的指令:
指定基础镜像:
FROM centos:6
ENV 设置环境变量:
ENV key value
COPY 拷贝本地文件到镜像的指定目录 :
例如 拷贝数据库配置文件到tmp目录:
COPY ./mysql-5.7.rpm /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令:
RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的:
EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用:
ENTRYPOINT java -jar xx.jar
根据以上命令,我们可以来写一个最简单的自定义镜像:
FROM java:8-alpine
COPY ./demo.jar /tmp/app/jar
EXPOSE 8081
ENTRYPOINT java -jar /tmp/app/jar
引入Java的基础镜像:
FROM java:8-alpine
复制我们打包好的Java程序demo.jar到指定目录/tmp/app/jar:
COPY ./demo.jar /tmp/app/jar
暴露自己Java程序的端口8081(你的程序是什么端口就暴露什么端口):
EXPOSE 8081
启动命令:
ENTRYPOINT java -jar /tmp/app/jar
2.生成镜像
在当前dockerfile文件的命令下执行生成镜像命令:
注意最后面有点
docker build -f dockerfile -t myjava:1.0 .
运行结果如下:
执行成功,生成myjava:1.0镜像
3.运行容器
docker run --name myjava -d -p 8081:8081 myjava:1.0
八、自定义网络
Docker 中的自定义网络允许用户在容器之间创建虚拟网络,以便在容器之间进行通信。自定义网络可以帮助解决多容器应用之间的网络通信问题,使容器可以在不同的网络环境中独立运行。只有加入同一个网络,容器之间才可以相互访问!
常用命令如下:
docker network create networktest
docker network ls
docker network connect 网络名 容器名
九、部署java应用
1.导入dockerfile和jar文件
dockerfile文件如下:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
2.移动到当前目录下,构建镜像
docker build -t hmall .
3.运行容器
docker run -d --name hm -p 8080:8080 hmall
4.加入和mysql一样的网络
docker network connect 网络名 容器名
总结
以上内容为记录自己初学docker的一系列操作,如有错误,欢迎指正!
@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!