注:本文是本人根据B站【狂神说Java】Docker视频所写,仅供学习参考。
容器数据卷
使用数据卷
方式一:直接使用命令进行挂载 -v
docker run -it -v 主机目录:容器目录
#测试
[root@MiWiFi-R3600-srv home]# docker run -it -v /home/centos:/home centos /bin/bash
#启动起来之后可以通过 docker inspect 容器ID 查看
[root@MiWiFi-R3600-srv ~]# docker inspect f07d53fa8401
测试文件的同步
#docker容器内操作
[root@7f3b54088827 /]# cd home/
[root@7f3b54088827 home]# ls
[root@7f3b54088827 home]# touch test.java
[root@7f3b54088827 home]# ls
test.java
#宿主机内操作
[root@MiWiFi-R3600-srv home]# ls
centos
[root@MiWiFi-R3600-srv home]# cd centos/
[root@MiWiFi-R3600-srv centos]# ls
test.java
#停止容器进行测试
[root@MiWiFi-R3600-srv home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f3b54088827 centos "/bin/bash" 17 minutes ago Exited (0) 4 minutes ago exciting_gould
b540d74fb885 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
#修改宿主机文件
[root@MiWiFi-R3600-srv centos]# vim test.java
[root@MiWiFi-R3600-srv centos]# cat test.java
hello centos!
#启动容器 容器内数据依旧是同步的
[root@MiWiFi-R3600-srv home]# docker start 7f3b54088827
7f3b54088827
[root@MiWiFi-R3600-srv home]# docker attach 7f3b54088827
[root@7f3b54088827 /]# cd home/
[root@7f3b54088827 home]# ls
test.java
[root@7f3b54088827 home]# cat test.java
hello centos!
好处:我们以后修改只需要在本地修改挂载文件即可,容器内会自动同步!
实战:安装MySQL
思考:MySQL数据的持久化问题
#获取镜像
[root@MiWiFi-R3600-srv centos]# docker pull mysql:5.7
#运行容器,需要做数据挂载。需要配置爱密码的,这是要注意的点!
#官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动我们的MySQL
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@MiWiFi-R3600-srv centos]# docker run -d -p 3306:3306 -v /data/docker/mysql/conf:/etc/mysql/conf.d -v /data/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
d4aa7b3846511a65bdbd6aa790b009cca58766c6950dc2039416fbdafa8e4bda
此时数据库已经启动成功,使用数据库工具测试是否可以成功连接,我这里使用的是Navicat工具
使用数据库工具创建test数据库
此时发现宿主机出现了test文件,说明docker容器中数据同步到宿主机挂载的卷中。
测试删除MySQL容器宿主机数据是否存在
[root@MiWiFi-R3600-srv data]# docker rm -f d4aa7b384651
d4aa7b384651
[root@MiWiFi-R3600-srv data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f3b54088827 centos "/bin/bash" 4 hours ago Exited (0) 4 hours ago exciting_gould
b540d74fb885 nginx "/docker-entrypoint.…" 5 hours ago Up 16 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
[root@MiWiFi-R3600-srv data]#
数据依然存在,这就实现了数据持久化功能!
具名和匿名挂载
# 匿名挂载
-v 容器内路径
-P(大写) 随机分配映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的卷的情况
[root@MiWiFi-R3600-srv data]# docker volume ls
DRIVER VOLUME NAME
local bb9f6f0ec4fc83582552fba005c60cdce6eb1cd605c52a88feebc6c727ee0087
#这里发现数据名称为随机生成的,这种就是匿名挂载,我们只在 -v 致谢了容器内的路径,没有写容器外的路径!
#具名挂载
[root@MiWiFi-R3600-srv data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
5423ef139954ed705567c713eaf1647b6682fb430f8823dda1f178076be5860b
[root@MiWiFi-R3600-srv data]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
docker volume inspect 卷名
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用 具名挂载
#如何区分具名挂载、匿名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro # readonly 只读
rw # readwrite 可读可写
#一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!
初识DockerFile
DockerFile 就是用来构建docker镜像的构建文件!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!
方式二:通过dockerfile生成镜像
# 创建一个dockerfile文件,名字可以随机 建议 Dockerfile
# 文件中内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 创建dockerfile01文件 并编写内容
[root@MiWiFi-R3600-srv docker-test-voluem]# vim dockerfile01
[root@MiWiFi-R3600-srv docker-test-voluem]# cat dockerfile01
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 使用build命令生成镜像
# docker build -f dockerfile文件路径 -t 镜像名:[版本号] .(注意,这里有一个点!!!)
[root@MiWiFi-R3600-srv docker-test-voluem]# docker build -f dockerfile01 -t centostest:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 062c584aade0
Removing intermediate container 062c584aade0
---> d8a313e5834a
Step 3/4 : CMD echo "----end----"
---> Running in d56d86038e02
Removing intermediate container d56d86038e02
---> 7e2e5bfad60c
Step 4/4 : CMD /bin/bash
---> Running in 3bb59a4eefac
Removing intermediate container 3bb59a4eefac
---> 67e4c750976b
Successfully built 67e4c750976b
Successfully tagged centostest:1.0
启动我们创建的镜像
这个卷和外部一定有一个同步的目录!
查看卷挂载路径
[root@MiWiFi-R3600-srv ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbd07304717e 67e4c750976b "/bin/bash" 6 minutes ago Up 6 minutes inspiring_dubinsky
5423ef139954 nginx "/docker-entrypoint.…" 36 minutes ago Up 36 minutes 0.0.0.0:32769->80/tcp nginx02
274a541140bb nginx "/docker-entrypoint.…" 40 minutes ago Up 40 minutes 0.0.0.0:32768->80/tcp nginx01
b540d74fb885 nginx "/docker-entrypoint.…" 6 hours ago Up About an hour 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
[root@MiWiFi-R3600-srv ~]# docker inspect bbd07304717e
# 找到Mounts
测试容器内创建文件是否同步到宿主机挂载卷中
# 在容器内volume01文件夹下创建test文件
[root@bbd07304717e /]# cd volume01
[root@bbd07304717e volume01]# touch test.txt
[root@bbd07304717e volume01]# ls
test.txt
# 进入宿主机volume01挂载卷查看是否存在test文件
[root@MiWiFi-R3600-srv ~]# cd /var/lib/docker/volumes/157f49a101b5f3d2620699ae2799203326d5361e511f584164a18f25adb9661d/_data
[root@MiWiFi-R3600-srv _data]# ls
test.txt
# 同步成功
数据卷容器
多个mysql同步数据!
# 启动3个容器 通过我们自己写的镜像启动
# 启动docker01
docker run -it --name docker01 centostest:1.0
# 启动docker02 利用 --volumes-from 继承docker01
docker run -it --name docker02 --volumes-from docker01 centostest:1.0
#进入docker01
[root@MiWiFi-R3600-srv docker-test-voluem]# docker attach aae3387d25e9
[root@aae3387d25e9 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Nov 13 07:33 dev
drwxr-xr-x. 1 root root 66 Nov 13 07:33 etc
drwxr-xr-x. 2 root root 6 May 11 2019 home
lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------. 2 root root 6 Aug 9 21:40 lost+found
drwxr-xr-x. 2 root root 6 May 11 2019 media
drwxr-xr-x. 2 root root 6 May 11 2019 mnt
drwxr-xr-x. 2 root root 6 May 11 2019 opt
dr-xr-xr-x. 128 root root 0 Nov 13 07:33 proc
dr-xr-x---. 2 root root 162 Aug 9 21:40 root
drwxr-xr-x. 11 root root 163 Aug 9 21:40 run
lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 May 11 2019 srv
dr-xr-xr-x. 13 root root 0 Nov 13 06:19 sys
drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp
drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr
drwxr-xr-x. 20 root root 262 Aug 9 21:40 var
drwxr-xr-x. 2 root root 6 Nov 13 07:33 volume01
drwxr-xr-x. 2 root root 6 Nov 13 07:33 volume02
[root@aae3387d25e9 /]# cd volume01
[root@aae3387d25e9 volume01]# ls
#在volume01中创建docker01文件
[root@aae3387d25e9 volume01]# touch docker01
[root@aae3387d25e9 volume01]# ls
docker01
#在docker02 volume01 中查看是否存在docker01文件
[root@e14b3f2ce53c /]# cd volume01
[root@e14b3f2ce53c volume01]# ls
docker01
# 存在docker01 同步成功
# 创建docker03继承docker01 查看是否存在docker01文件
[root@MiWiFi-R3600-srv ~]# docker run -it --name docker03 --volumes-from docker01 centostest:1.0
[root@4a25a70ad18a /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Nov 13 07:46 dev
drwxr-xr-x. 1 root root 66 Nov 13 07:46 etc
drwxr-xr-x. 2 root root 6 May 11 2019 home
lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------. 2 root root 6 Aug 9 21:40 lost+found
drwxr-xr-x. 2 root root 6 May 11 2019 media
drwxr-xr-x. 2 root root 6 May 11 2019 mnt
drwxr-xr-x. 2 root root 6 May 11 2019 opt
dr-xr-xr-x. 134 root root 0 Nov 13 07:46 proc
dr-xr-x---. 2 root root 162 Aug 9 21:40 root
drwxr-xr-x. 11 root root 163 Aug 9 21:40 run
lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 May 11 2019 srv
dr-xr-xr-x. 13 root root 0 Nov 13 06:19 sys
drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp
drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr
drwxr-xr-x. 20 root root 262 Aug 9 21:40 var
drwxr-xr-x. 2 root root 22 Nov 13 07:41 volume01
drwxr-xr-x. 2 root root 6 Nov 13 07:33 volume02
[root@4a25a70ad18a /]# cd volume01
[root@4a25a70ad18a volume01]# ls
docker01
# 存在 同步成功
# 在docker03中创建docker03文件
[root@4a25a70ad18a volume01]# touch docker03
[root@4a25a70ad18a volume01]# ls
docker01 docker03
#查看docker01是否同步成功
[root@MiWiFi-R3600-srv docker-test-voluem]# docker attach aae3387d25e9
[root@aae3387d25e9 /]# cd volume01
[root@aae3387d25e9 volume01]# ls
docker01 docker03
#查看docker02是否同步成功
[root@MiWiFi-R3600-srv docker-test-voluem]# docker attach e14b3f2ce53c
[root@e14b3f2ce53c /]# cd volume01
[root@e14b3f2ce53c volume01]# ls
docker01 docker03
# 同步成功
测试删除docker01容器 docker02和docker03中的数据是否还存在
#删除docker01容器
[root@MiWiFi-R3600-srv docker-test-voluem]# docker rm -f aae3387d25e9
aae3387d25e9
[root@MiWiFi-R3600-srv docker-test-voluem]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a25a70ad18a centostest:1.0 "/bin/sh -c /bin/bash" 17 minutes ago Up 17 minutes docker03
e14b3f2ce53c centostest:1.0 "/bin/sh -c /bin/bash" 26 minutes ago Up 26 minutes docker02
b540d74fb885 nginx "/docker-entrypoint.…" 6 hours ago Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
# 进入docker02容器查看数据是否存在
[root@MiWiFi-R3600-srv ~]# docker attach docker02
[root@e14b3f2ce53c volume01]# ls
docker01 docker03
# 进入docker03容器查看数据是否存在
[root@MiWiFi-R3600-srv ~]# docker attach docker03
[root@4a25a70ad18a volume01]# ls
docker01 docker03
# 数据存在 备份拷贝机制
多个mysql实现数据共享
[root@MiWiFi-R3600-srv centos]# docker run -d -p 3306:3306 -v /data/docker/mysql/conf:/etc/mysql/conf.d -v /data/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@MiWiFi-R3600-srv centos]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,本地的数据是不会删除的!
版权声明:本文为Devil_Song原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。