docker的理念:将应用和环境打包成一个镜像!通过镜像启动容器运行

问题:在容器中存储的程序数据是需要持久化的,不能容器删了数据也随之删除。比如,安装一个MySQL容器,在其中存储了大量数据,结果把容器删了数据也没了,就相当于删库跑路,这是不可能发生的

数据卷技术的引入:我们希望Docker容器产生的数据可以自动同步到本地,这样容器删了数据并不会丢失;同时数据也可在容器之间共享。这就是卷技术,也就是目录的挂载,将容器内的目录挂载到linux上

docker容器中curl Docker容器中绑定装载_docker容器中curl


总结:容器的持久化和同步操作!容器间也可以实现数据共享!

使用数据卷

docker run -it -v 主机目录:容器内目录

测试:

# docker run -it -v /home/test:/home centos /bin/bash

启动之后可以用docker inspect查看容器详细信息,可以看到挂载的信息

# docker inspect 3e7c547f28bf

docker容器中curl Docker容器中绑定装载_数据_02


我们开两个窗口分别进入相对应挂载的目录,在容器内/home目录下新建一个文件,在主机/home/test目录下同步出现该文件

docker容器中curl Docker容器中绑定装载_nginx_03


然后我们去编辑linux系统目录下的cxz.text文件 可以看到容器里面的文件也跟着一起编辑了 这就是挂载的作用

docker容器中curl Docker容器中绑定装载_nginx_04


docker容器中curl Docker容器中绑定装载_docker_05

实战:安装MySQL

[root@ecs-98457 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete
启动mysql容器
	-d 后台运行
	-p 端口映射
	-v 卷挂载
	-e 环境配置
	--name 容器名字
[root@ecs-98457 ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

启动之后,我们本机连接一下试试,记得打开阿里云服务器安全组设置的3310端口

docker容器中curl Docker容器中绑定装载_docker_06


我们再新建一个testcxz库

docker容器中curl Docker容器中绑定装载_nginx_07


可以看到在宿主机上的data目录上也新建了testcxz库

具名和匿名挂载

匿名挂载

# 匿名挂载: -v:容器内路径(没有写容器外路径)
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有volume的情况
docker volume ls

docker容器中curl Docker容器中绑定装载_nginx_08

具名挂载(常用)

# 具名挂载: -v 卷名:容器内路径
docker run -d -P --name nginx02 -v specific-nginx:/etc/nginx nginx

# 查看所有volume的情况
docker volume ls

# 查specific-nginx卷的具体信息
docker volume inspect specific-nginx

所有docker容器内的卷,没有指定目录情况下都是在/var/lib/docker/volumes/卷名/_data下

docker容器中curl Docker容器中绑定装载_docker_09

拓展

# 通过 容器内路径:ro/rw 限制读写权限
ro:read only 	只读,该路径文件只能通过宿主机来操作,容器内无法操作
rw:read write	可读可写

docker run -d -P --name nginx02 -v specific-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v specific-nginx:/etc/nginx:rw nginx

Dockerfile

Dockerfile就是用来构建 docker 镜像的构建文件,就是一段命令脚本,通过这个脚本可以生成一个镜像

通过这个脚本可以生成镜像,镜像是一层一层的,脚本中就是一个个命令,每个命令对应一层

docker容器中curl Docker容器中绑定装载_docker_10

基础知识:

每个保留关键字(指令)都必须是大写字母

执行顺序从上往下顺序执行

#代表注释

每条指令都会创建并提交一个新的镜像层

docker容器中curl Docker容器中绑定装载_数据_11


DockerFile是面向开发的,逐渐成为企业交付的标准,以后发布项目就是打包成一个镜像,就需要编写dockerfile文件,十分简单!

dockerFile:构建文件,定义了一切步骤,源代码

dockerImages:通过dockerFile构建生成的镜像,最终发布的运行的产品

docker容器:容器就是镜像运行起来提供服务器

构建步骤:
编写一个dockerfile文件
docker build 构建成一个镜像
docker run 运行镜像
docker push 发布镜像(DockerHub、阿里云镜像仓库)
dockerHub:https://hub.docker.com/

#home目录下创建docker-test-volume目录
[root@ecs-98457 home]# mkdir docker-test-volume

#进入 docker-test-volume 编辑dockerfile2脚本文件
[root@ecs-98457 home]# ls
docker-test-volume  mysql  test  test.java
[root@ecs-98457 home]# cd docker-test-volume/
[root@ecs-98457 docker-test-volume]# vim dockerfile2
# 创建一个dockerfile文件

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

docker容器中curl Docker容器中绑定装载_docker容器中curl_12

#构建自己的容器
[root@ecs-98457 docker-test-volume]# docker build -f dockerfile2 -t cxz/centos:1.0 .

docker容器中curl Docker容器中绑定装载_docker_13


下面就显示我们的容器构建成功了

docker容器中curl Docker容器中绑定装载_docker容器中curl_14

#我们来通过自己创建的镜像启动容器,查看其中的内容,可以看到生成镜像时自动挂载的数据卷目录volume01和volume02
[root@ecs-98457 /]# docker run -it cxz/centos:1.0 /bin/bash

docker容器中curl Docker容器中绑定装载_数据_15


这两个数据卷一定与外部有一个同步的目录!且我们设置的是匿名挂载

[root@ecs-98457 ~]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
7563349b292c   cxz/centos:1.0   "/bin/bash"              6 seconds ago   Up 6 seconds                                                          dazzling_shannon
552f5b1eadf5   nginx            "/docker-entrypoint.…"   4 hours ago     Up 4 hours     0.0.0.0:49154->80/tcp, :::49154->80/tcp                nginx03
d96c768cb1d3   nginx            "/docker-entrypoint.…"   5 hours ago     Up 5 hours     0.0.0.0:49153->80/tcp, :::49153->80/tcp                nginx05
7fdc601d7b79   mysql:5.7        "docker-entrypoint.s…"   5 hours ago     Up 5 hours     33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01
6ebe0e25bb5f   tomcat:9.0       "catalina.sh run"        47 hours ago    Up 47 hours    0.0.0.0:3305->8080/tcp, :::3305->8080/tcp              tomcat05
5964e6762cca   nginx            "/docker-entrypoint.…"   47 hours ago    Up 47 hours    0.0.0.0:3344->80/tcp, :::3344->80/tcp                  nginx02
[root@ecs-98457 ~]# docker inspect 7563349b292c

docker容器中curl Docker容器中绑定装载_docker_16

数据卷容器

实现多个容器之间同步数据

docker容器中curl Docker容器中绑定装载_nginx_17


启动3个容器,通过我们自己创建的镜像启动

[root@ecs-98457 ~]# docker run -it --name docker01 cxz/centos:1.0

docker容器中curl Docker容器中绑定装载_docker容器中curl_18

#Ctrl+P+Q 退出容器
#将docker02和docker01容器实现数据挂载卷数据同步
[root@ecs-98457 ~]# docker run -it --name docker02 --volumes-from docker01 cxz/centos:1.0

docker容器中curl Docker容器中绑定装载_nginx_19


可以看到数据卷同步过来了

然后我们再docker02容器里面的volume01目录下新建cesi01文件

docker容器中curl Docker容器中绑定装载_数据_20


我们再进入到docker01容器中的volume01文件 可以看到同样生成了cesi01文件

[root@ecs-98457 /]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
77e0f7603156   cxz/centos:1.0   "/bin/sh -c /bin/bash"   5 minutes ago    Up 5 minutes                                                           docker02
fcdc642792d4   cxz/centos:1.0   "/bin/sh -c /bin/bash"   9 minutes ago    Up 9 minutes                                                           docker01
7563349b292c   cxz/centos:1.0   "/bin/bash"              14 minutes ago   Up 14 minutes                                                          dazzling_shannon
552f5b1eadf5   nginx            "/docker-entrypoint.…"   4 hours ago      Up 4 hours      0.0.0.0:49154->80/tcp, :::49154->80/tcp                nginx03
d96c768cb1d3   nginx            "/docker-entrypoint.…"   5 hours ago      Up 5 hours      0.0.0.0:49153->80/tcp, :::49153->80/tcp                nginx05
7fdc601d7b79   mysql:5.7        "docker-entrypoint.s…"   6 hours ago      Up 6 hours      33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01
6ebe0e25bb5f   tomcat:9.0       "catalina.sh run"        47 hours ago     Up 47 hours     0.0.0.0:3305->8080/tcp, :::3305->8080/tcp              tomcat05
5964e6762cca   nginx            "/docker-entrypoint.…"   47 hours ago     Up 47 hours     0.0.0.0:3344->80/tcp, :::3344->80/tcp                  nginx02
[root@ecs-98457 /]#  docker attach fcdc642792d4
[root@fcdc642792d4 /]# cd volume01
[root@fcdc642792d4 volume01]# ls
cesi01
[root@fcdc642792d4 volume01]#