什么是容器数据卷
docker的理念回顾
使用数据卷
方式一:直接用命令挂载 -v
docker run -v 主机目录:容器目录
#测试
docker run -it -v /home/ceshi:/home centos /bin/bash
#查看容器挂载情况
docker inspect b5d89da9ec01
测试数据是否同步
容器退出后,修改主机的同步目录下的东西,一样可以同步到容器中
实战:安装MySQL
#获取镜像
docker pull mysql:5.7
#运行容器,需要数据挂载!
#安装启动mysql,需要配置密码的,这是注意点
#官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动并挂载mysql配置目录和数据目录到本地
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
#启动成功后,我们本地使用navicat工具连接数据库
#在本地连接的数据库上创建数据库和表,测试主机挂载的目录数据是否挂载成功
具名挂载和匿名挂载
#匿名挂载
[root@wise ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx #匿名挂载nginx01容器的/etc/nginx目录到本地
8be0810dda8d944fd0824464540dbbe97e735016bef164017803e3988a56193a
[root@wise ~]# docker volume ls #查看卷的信息(得到匿名卷名)
DRIVER VOLUME NAME
local 154a0daea7f7a93c7ebffe21e1213f892af8fa0eb1d870905eafa55e1c39a6aa
#具名挂载
[root@wise ~]# docker run -d -P --name nginx03 -v nginx03:/etc/nginx nginx #具名挂载nginx03容器/etc/nginx目录到本地(卷名nginx03)
31fa291f376305dd950c10b34ed9689f4e2d1b989517a47f3face404eadaada0
[root@wise ~]# docker volume ls #查看卷的信息(得到具名卷名)
DRIVER VOLUME NAME
local 5ff0c8f210b4e99fc60f6e74c8e11dd776de37cb3cb2e39011a675d4993bcda9
local 154a0daea7f7a93c7ebffe21e1213f892af8fa0eb1d870905eafa55e1c39a6aa
local 515f03843e5682d8fef890885324596eecbe7c21f737fcdc936e19cc2469da01
local nginx03 #具名卷名
#通过 -v 卷名:容器内路径
#查看卷挂载情况
所有docker容器的卷,没有指定主机路径的情况下,所有容器目录挂载在/var/lib/docker/volumes/xxx下
通过具名挂载方便找到我们的一个卷,大多数情况使用具名挂载
#匿名挂载 具名挂载 指定路径挂载
-v 容器内路径 #匿名挂载
-v 容器名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展:
#通过 -v 容器内路径 ro rw 改变读写权限
#ro read only 只读
#rw readwrite 可读写
#一旦设置了容器权限,容器对我们挂载出来的内容就有了限定!(对容器内容来说)
docker run -d -P --name nginx03 -v nginx03:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v nginx03:/etc/nginx:rw nginx
#ro 即容器内部不能对这个路径进行写操作,这个路径只能在宿主机上操作
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个命令,每个命令就是一层!
#
[root@wise home]# ls
ceshi mysql wise
[root@wise home]# mkdir docker-teat-volume #创建测试目录
[root@wise home]# cd docker-teat-volume/
[root@wise docker-teat-volume]# vim dockerfile #在测试目录下编辑dockerfile(镜像创建脚本)
[root@wise docker-teat-volume]# cat dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-------"
CMD /bin/bash
#docker build -f [docerfile文件目录] -t [生成的镜像名] . #最后的.注意
[root@wise docker-teat-volume]# docker build -f dockerfile -t wise/centos . #利用镜像创建脚本创建镜像
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 097824ceba71
Removing intermediate container 097824ceba71
---> 32fbbb6db1a7
Step 3/4 : CMD echo "-----end-------"
---> Running in 47ca999b5d93
Removing intermediate container 47ca999b5d93
---> d17fa7b9605c
Step 4/4 : CMD /bin/bash
---> Running in b9758e5f26e2
Removing intermediate container b9758e5f26e2
---> f3b2157173ae
Successfully built f3b2157173ae
Successfully tagged wise/centos:latest
[root@wise docker-teat-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wise/centos latest f3b2157173ae 11 seconds ago 215MB #自己创建的镜像
tomcat latest f796d3d2c195 30 hours ago 647MB
nginx latest 7e4d58f0e5f3 6 days ago 133MB
mysql 5.7 ef08065b0a30 6 days ago 448MB
centos latest 0d120b6ccaa8 5 weeks ago 215MB
#启动自己创建的镜像
docker run -it f3b2157173ae /bin/bash
这个卷的目录和外部一定有个同步的目录
[root@wise ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01fd9626dc99 f3b2157173ae "/bin/bash" 3 minutes ago Up 3 minutes priceless_pasteur
[root@wise ~]# docker inspect 01fd9626dc99 #查看容器的挂载情况
测试一下刚才的文件是否同步出去
这种方式我们未来使用的十分多,因为我们通常会自己构建镜像!
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器名
数据卷容器
多个mysql同步数据
#启动3个容器,通过我们自己刚才写的镜像启动
#启动容器1并进入
run -it --name docker01 wise/centos
#启动容器2并用--volumes-from和容器1数据卷实现同步
docker run -it --name docker02 --volumes-from docker01 wise/centos
#启动容器2并用--volumes-from和容器1数据卷实现同步
docker run -it --name docker03 --volumes-from docker01 wise/centos
测试:
#docker02和docker03都挂载了docker01的数据卷,所有如何删除容器docker01
#测试发现docker02和docker03和宿主机直接的数据卷目录数据依然能正常双向绑定
我所理解的容器间的数据卷同步
注意
如果需要同步的目录时,容器中这个目录本来以后存在文件,则需要把这些文件先拷贝到宿主机对应的同步目录下,再使用挂载,否则容器内此目录的所有文件会被清空