Docker 容器数据卷

注:本文是本人根据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版权协议,转载请附上原文出处链接和本声明。