docker的理念:将应用和环境打包成一个镜像!通过镜像启动容器运行
问题:在容器中存储的程序数据是需要持久化的,不能容器删了数据也随之删除。比如,安装一个MySQL容器,在其中存储了大量数据,结果把容器删了数据也没了,就相当于删库跑路,这是不可能发生的
数据卷技术的引入:我们希望Docker容器产生的数据可以自动同步到本地,这样容器删了数据并不会丢失;同时数据也可在容器之间共享。这就是卷技术,也就是目录的挂载,将容器内的目录挂载到linux上
总结:容器的持久化和同步操作!容器间也可以实现数据共享!
使用数据卷
docker run -it -v 主机目录:容器内目录
测试:
# docker run -it -v /home/test:/home centos /bin/bash
启动之后可以用docker inspect查看容器详细信息,可以看到挂载的信息
# docker inspect 3e7c547f28bf
我们开两个窗口分别进入相对应挂载的目录,在容器内/home目录下新建一个文件,在主机/home/test目录下同步出现该文件
然后我们去编辑linux系统目录下的cxz.text文件 可以看到容器里面的文件也跟着一起编辑了 这就是挂载的作用
实战:安装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端口
我们再新建一个testcxz库
可以看到在宿主机上的data目录上也新建了testcxz库
具名和匿名挂载
匿名挂载
# 匿名挂载: -v:容器内路径(没有写容器外路径)
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有volume的情况
docker volume ls
具名挂载(常用)
# 具名挂载: -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下
拓展
# 通过 容器内路径: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 镜像的构建文件,就是一段命令脚本,通过这个脚本可以生成一个镜像
通过这个脚本可以生成镜像,镜像是一层一层的,脚本中就是一个个命令,每个命令对应一层
基础知识:
每个保留关键字(指令)都必须是大写字母
执行顺序从上往下顺序执行
#代表注释
每条指令都会创建并提交一个新的镜像层
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
#构建自己的容器
[root@ecs-98457 docker-test-volume]# docker build -f dockerfile2 -t cxz/centos:1.0 .
下面就显示我们的容器构建成功了
#我们来通过自己创建的镜像启动容器,查看其中的内容,可以看到生成镜像时自动挂载的数据卷目录volume01和volume02
[root@ecs-98457 /]# docker run -it cxz/centos:1.0 /bin/bash
这两个数据卷一定与外部有一个同步的目录!且我们设置的是匿名挂载
[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
数据卷容器
实现多个容器之间同步数据
启动3个容器,通过我们自己创建的镜像启动
[root@ecs-98457 ~]# docker run -it --name docker01 cxz/centos:1.0
#Ctrl+P+Q 退出容器
#将docker02和docker01容器实现数据挂载卷数据同步
[root@ecs-98457 ~]# docker run -it --name docker02 --volumes-from docker01 cxz/centos:1.0
可以看到数据卷同步过来了
然后我们再docker02容器里面的volume01目录下新建cesi01文件
我们再进入到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]#