Docker 数据管理

3.1 Docker容器的分层

image-20240216154204280

Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层

如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,即:写时复制(COW copy on write)机制

如果将正在运行中的容器修改生成了新的数据,那么新产生的数据将会被复制到读写层,这个读写层也就是容器的工作目录,也为写时复制(COW) 机制。

COW机制节约空间,但会导致性低下,虽然关闭重启容器,数据不受影响,但会随着容器的删除,其对应的可写层也会随之而删除;即数据也会丢失,如果容器需要持久保存数据,并不影响性能可以用数据卷技术实现

容器的数据分层目录

  • LowerDir: image 镜像层,即镜像本身,数据只读
  • UpperDir: 容器的可读写层,容器变化的数据存放在此处
  • MergedDir 容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和 upperdir 合并完成后给容器使用,最终呈现给用户的统一视图
  • WorkDir: 容器在宿主机的工作目录,挂载后内容会被清空,且在使用过程中其内容用户不可见

范例:查看容器分层结构

[root@ubuntu1804 ~ ]# docker run -td --rm --name alpine alpine:3.11
[root@ubuntu1804 ~ ]# docker inspect alpine
"GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365-init/diff:/var/lib/docker/overlay2/53b98078aabeecfc96ffd931c7260d2d57c077109e30f98fda1c5911a0bdabbe/diff",
                "MergedDir": "/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/merged",
                "UpperDir": "/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/diff",
                "WorkDir": "/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/work"
            },
            "Name": "overlay2"

#查看容器分层挂载情况
[root@ubuntu1804 ~ ]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/merged
[root@ubuntu1804 ~ ]# mount
/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/merged type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/FZRPQZL2LGE6UMKKQT6ZDPASHG:/var/lib/docker/overlay2/l/EHLQWK2AOY5XM4WLLQFZUSZPVA,upperdir=/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/diff,workdir=/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/work)

#容器创建文件数据
[root@ubuntu1804 ~ ]# docker exec -it alpine sh
/ # touch test.txt

#查看宿主机上的可写层目录数据下
[root@ubuntu1804 ~ ]# tree /var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/diff
/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/diff
├── root
└── test.txt

1 directory, 1 file

#当容器删除时,容器对应的可写层目录不存在
[root@ubuntu1804 ~ ]# docker rm -f alpine
alpine

[root@ubuntu1804 ~ ]# ll /var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/merged/
ls: cannot access '/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/merged/': No such file or directory

#当可写层目录数据不存在,导致容器的联合挂载目录数据也不存在
[root@ubuntu1804 ~ ]# ll /var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/merged/
ls: cannot access '/var/lib/docker/overlay2/572adb0415e627b40762068cec501bad39278bbca49fbb4c162e885a9f34e365/merged/': No such file or directory

3.2 容器数据持久保存方式

docker通过镜像启动一个容器,会把文件系统和镜像联合挂载形成一个只读层,当对容器写入数据,在只读层之上形成一个读写层进行数据读写。一旦删除容器,就会把只读层删除,从而数据的读写层同时删除。

数据卷作用:把宿主机的目录挂载到容器指定目录,从而在容器中读写数据,实际数据存在于宿主机上。容器销毁时,虽然只读层也会销毁,挂载目录下数据依旧存在。

image-20240216154231231

3.3 数据卷(data volume)

3.3.1 数据卷使用场景

数据卷实际上就是宿主机上的目录或者是文件,可以被直接mount到容器当中使用

实际生产环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划,最终保证服务的可扩展性、稳定性以及数据的安全性

  • 日志输出
  • 静态web页面
  • 应用配置文件
  • 多容器间目录或文件共享

3.3.2 数据卷的特点

  • 数据卷是目录或者文件,并且可以在多个容器之间共同使用
  • 对数据卷更改数据在所有容器里面会立即更新
  • 数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响
  • 依赖于宿主机目录,宿主机出问题,上面容器会受影响,当宿主机较多时,不方便统一管理

3.3.3 数据卷命令说明

启动容器时,可以指定使用数据卷实现容器数据的持久化,数据卷有三种

  • 数据卷:指定宿主机的具体路径和容器路径的挂载关系
  • 匿名卷:不指定数据名称,只指定容器内目录路径充当挂载点,docker自动指定宿主机的路径进行挂载
  • 命名卷:指定匿名卷的名称和容器路径的挂载关系

docker run 命令的以下格式可以实现数据卷

docker run -v, --volume=[host-src:]container-dest[:<options>]

#参数
ro 		#从容器内对此数据卷是只读,不写此项默认为可读可写
rw 		#从容器内对此数据卷可读可写,此为默认值

数据卷容器创建

#将宿主机目录挂载容器目录,两个目录都可自动创建
docker run -v <宿主机绝对路径的目录或文件>:<容器目录或文件>[:ro] .......

匿名卷容器创建

#匿名卷,只指定容器内路径,没有指定宿主机路径信息,宿主机自动生成/var/lib/docker/volumes/<卷ID>/_data目录,并挂载至容器指定路径
docker run -v <容器内路径> .......

命名卷容器创建

#命名卷将固定的存放在/var/lib/docker/volumes/<卷名>/_data
docker run -v <卷名>:<容器内路径> ............

注意:宿主机上匿名卷的 <卷ID>是随机生成的,与容器本身没有任何联系,docker默认删除容器不会删除数据卷,docker rm的 ``-v` 选项可以删除容器时,同时删除相关联的匿名卷,不会删除命名卷数据

docker rm -fv <容器ID>

查看所有匿名卷和命名卷

docker volume ls -q

清理没有被容器使用的匿名卷和命名卷

docker volume prune -f

删除所有匿名卷和命名卷 (容器正在运行使用的卷无法删除)

docker volume rm `docker volume ls -q`

3.3.4 案例: 目录数据卷

以nginx容器为例:把容器的站点目录和宿主机上数据目录挂载,实现访问nginx容器页面持久化保存

3.3.4.1 查看 nginx 容器站点路径

[root@ubuntu1804 ~ ]# docker pull nginx:1.21.1-alpine
[root@ubuntu1804 ~ ]# docker run --rm -it nginx:1.21.1-alpine sh
~ # cat /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
    location / {
    	#站点目录
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

3.3.4.2 宿主机创建站点页面数据

[root@ubuntu1804 ~ ]# mkdir /data/nginx
[root@ubuntu1804 ~ ]# echo "nginx page on host" > /data/nginx/index.html

3.3.4.3 启动容器挂载宿主机数据

#启动多个容器
docker run -d -P -v /data/nginx:/usr/share/nginx/html --name volume_nginx1 nginx:1.21.1-alpine
docker run -d -P -v /data/nginx:/usr/share/nginx/html --name volume_nginx2 nginx:1.21.1-alpine

#访问nginx容器页面
[root@ubuntu1804 ~ ]# docker port volume_nginx1
80/tcp -> 0.0.0.0:32768
[root@ubuntu1804 ~ ]# curl 10.0.0.100:32768
nginx page on host

[root@ubuntu1804 ~ ]# docker port volume_nginx2
80/tcp -> 0.0.0.0:32769
[root@ubuntu1804 ~ ]# curl 10.0.0.100:32769
nginx page on host

#查看容器挂载情况
[root@ubuntu1804 ~ ] #df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 899M     0  899M    0% /dev
tmpfs                    910M     0  910M    0% /dev/shm
tmpfs                    910M  9.6M  901M    2% /run
tmpfs                    910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root   62G  6.0G   57G   10% /
/dev/sr0                 4.4G  4.4G     0  100% /test
/dev/sda1               1014M  189M  826M   19% /boot
/dev/mapper/centos-home  2.0G   33M  2.0G    2% /home
/dev/mapper/centos-var    10G  4.4G  5.7G   44% /var
tmpfs                    182M     0  182M    0% /run/user/0
overlay                   10G  4.4G  5.7G   44% /var/lib/docker/overlay2/6abcdd74d139515bdacf1caae1b648fa7dedf949f3a6f286597aca7d62d568f6/merged
overlay                   10G  4.4G  5.7G   44% /var/lib/docker/overlay2/1458662d1a27c3d90d2264d882c70a0f5f2763df1c4de00214fbc30a06b98072/merged

3.3.4.4 修改页面数据测试

第一步:修改宿主机上页面文件,nginx容器上页面文件也会随之变化

#修改宿主机上页面文件
[root@ubuntu1804 ~ ]# echo "nginx page on host v1" > /data/nginx/index.html

#访问容器页面
[root@ubuntu1804 ~ ]# curl 10.0.0.100:32768
nginx page on host v1
[root@ubuntu1804 ~ ]# curl 10.0.0.100:32769
nginx page on host v1

第二步:由于挂载数据卷没有指定只读参数,修改任意容器页面数据,其他容器访问也会随之变化,包括宿主机上数据也会被修改

[root@ubuntu1804 ~ ]# docker exec -it volume_nginx1 sh
/ # echo "nginx page on docker" > /usr/share/nginx/html/index.html

#访问nginx容器页面
[root@ubuntu1804 ~ ]# curl 10.0.0.100:32768
nginx page on docker
[root@ubuntu1804 ~ ]# curl 10.0.0.100:32769
nginx page on docker

#查看宿主机上页面数据
[root@ubuntu1804 ~ ]# cat /data/nginx/index.html
nginx page on docker

3.3.4.5 挂载只读数据卷

默认数据卷为可读可写,加ro选项,可以实现只读挂载,对于不希望容器修改的数据,比如: 配置文 件,脚本等,可以用此方式挂载

#启动新的nginx容器
docker run -d -P -v /data/nginx:/usr/share/nginx/html:ro --name volume_nginx3 nginx:1.21.1-alpine

[root@ubuntu1804 ~ ]# docker port volume_nginx3
80/tcp -> 0.0.0.0:32770

[root@ubuntu1804 ~ ]# curl 10.0.0.100:32770
nginx page on docker

#无法修改容器的数据卷下的文件数据
[root@ubuntu1804 ~ ]# docker exec -it volume_nginx3 sh
/ # echo "nginx test page" > /usr/share/nginx/html/index.html
sh: can't create /usr/share/nginx/html/index.html: Read-only file system

3.3.5 案例: MySQL 使用的数据卷

[root@ubuntu1804 ~ ]# docker pull mysql:5.7.30

#查看数据库数据存放目录路径
[root@ubuntu1804 ~ ]# docker run --rm -it mysql:5.7.30 bash
root@33047e1049fa:/# cat /etc/mysql/my.cnf
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

root@33047e1049fa:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql		#数据目录

#创建数据库变量文件
[root@ubuntu1804 ~ ]# vim env.list
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=wordpress
MYSQL_USER=testuser
MYSQL_PASSWORD=testuser

#利用数据卷创建容器,把数据库数据持久保存(注意:数据库mysql不允许挂载时目录下有数据)
[root@ubuntu1804 ~ ]# mkdir -p /data/mysql/data

#利用数据卷创建容器,把数据库配置文件持久保存
[root@ubuntu1804 ~ ]# mkdir /data/mysql/conf.d
[root@ubuntu1804 ~ ]# vim /data/mysql/conf.d/mysqld.cnf
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /data/mysql
character_set_server = utf8mb4

#创建容器
docker run -d -p 3306:3306 --env-file=./env.list -v /data/mysql/data/:/var/lib/mysql/ -v /data/mysql/conf.d/:/etc/mysql/mysql.conf.d/ --name volume_mysql1 mysql:5.7.30

[root@ubuntu1804 ~ ]# docker port volume_mysql1
3306/tcp-> 0.0.0.0:3306

#进入容器查看数据
[root@ubuntu1804 ~ ]# docker exec -it volume_mysql1 bash
root@f9fd5b3d7dad:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /data/mysql
character_set_server = utf8mb4

root@1ce9d0868041:/# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)

#查看宿主机上数据
[root@ubuntu1804 ~ ]# ll /data/mysql/data/
total 188488
drwxr-xr-x 6  999 root       4096 Aug 31 04:13 ./
drwxr-xr-x 3 root root         18 Aug 31 04:06 ../
-rw-r----- 1  999 docker       56 Aug 31 04:12 auto.cnf
-rw------- 1  999 docker     1680 Aug 31 04:12 ca-key.pem
-rw-r--r-- 1  999 docker     1112 Aug 31 04:12 ca.pem
-rw-r--r-- 1  999 docker     1112 Aug 31 04:12 client-cert.pem
-rw------- 1  999 docker     1680 Aug 31 04:12 client-key.pem
-rw-r----- 1  999 docker     1346 Aug 31 04:13 ib_buffer_pool
-rw-r----- 1  999 docker 79691776 Aug 31 04:13 ibdata1
-rw-r----- 1  999 docker 50331648 Aug 31 04:13 ib_logfile0
-rw-r----- 1  999 docker 50331648 Aug 31 04:12 ib_logfile1
-rw-r----- 1  999 docker 12582912 Aug 31 04:13 ibtmp1
drwxr-x--- 2  999 docker     4096 Aug 31 04:12 mysql/
drwxr-x--- 2  999 docker     8192 Aug 31 04:12 performance_schema/
-rw------- 1  999 docker     1676 Aug 31 04:12 private_key.pem
-rw-r--r-- 1  999 docker      452 Aug 31 04:12 public_key.pem
-rw-r--r-- 1  999 docker     1112 Aug 31 04:12 server-cert.pem
-rw------- 1  999 docker     1680 Aug 31 04:12 server-key.pem
drwxr-x--- 2  999 docker     8192 Aug 31 04:12 sys/
drwxr-x--- 2  999 docker       20 Aug 31 04:13 wordpress/

3.3.6 匿名数据卷

匿名数据卷是指创建容器只指定容器内部数据目录,而不指定宿主机挂载目录,由docker自动分配一个宿主机上目录实现数据持久化保存,docker会在宿主机自动生成 /var/lib/docker/volumes/<卷ID>/_data目录,并挂载至容器指定路径

匿名数据卷缺点:只能对一个容器数据持久化保存,创建多个容器就自动生成多个匿名卷目录

#创建匿名卷容器
[root@ubuntu1804 ~ ]# docker run -d -P -v /usr/share/nginx/html --name volume_nginx4 nginx:1.21.1-alpine
978035b7736e9c520f4151c203d315c805d0e7599ebe38e74b6b4b1984868eee
[root@ubuntu1804 ~ ]# docker port volume_nginx4
80/tcp -> 0.0.0.0:32771
[root@ubuntu1804 ~ ]# curl  10.0.0.100:32771
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
....................
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

#查看匿名卷目录路径
[root@ubuntu1804 ~ ]# docker inspect volume_nginx4
        "Mounts": [
            {
            	#挂载类型
                "Type": "volume",
                "Name": "65e7014140c961bfce558418925a514ac0eab61a320282b30bc237bbdfa151ca",
                #宿主机上匿名卷路径
                "Source": "/var/lib/docker/volumes/65e7014140c961bfce558418925a514ac0eab61a320282b30bc237bbdfa151ca/_data",
                #匿名卷挂载容器的路径
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

#修改宿主机上匿名卷页面文件
[root@ubuntu1804 ~ ]# ls /var/lib/docker/volumes/65e7014140c961bfce558418925a514ac0eab61a320282b30bc237bbdfa151ca/_data
50x.html  index.html
[root@ubuntu1804 ~ ]# echo "nginx test page" > /var/lib/docker/volumes/65e7014140c961bfce558418925a514ac0eab61a320282b30bc237bbdfa151ca/_data/index.html

#再次访问nginx容器首页页面
[root@ubuntu1804 ~ ]# curl  10.0.0.100:32771
nginx test page

3.3.7 命名数据卷

命名数据卷:创建匿名卷手动指定匿名卷名,而不使用docker自动分配的 <卷ID>,命名卷将固定的存放在

/var/lib/docker/volumes/<卷名>/_data

范例:

#step1:创建命名的匿名卷容器
#方法一:先创建命名卷.再创建容器挂载命名卷
docker volume create volume_nginx1
docker run -d -p 80:80 -v volume_nginx1:/usr/share/nginx/html --name volume_nginx1 nginx:1.21.1-alpine

#方法二:docker run -v 自动创建命名卷
docker run -d -p 81:80 -v volume_nginx2:/usr/share/nginx/html --name volume_nginx2 nginx:1.21.1-alpine

#step2:查看命名卷列表
[root@ubuntu1804 ~ ]# docker volume ls
DRIVER              VOLUME NAME
local               volume_nginx1
local               volume_nginx2

#step3:查看命名卷详细虚新
[root@ubuntu1804 ~ ]# docker volume  inspect volume_nginx2
[
    {
        "CreatedAt": "2021-08-31T07:03:45Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/volume_nginx2/_data",
        "Name": "volume_nginx2",
        "Options": null,
        "Scope": "local"
    }
]

#step4:修改命名卷的index文件
[root@ubuntu1804 ~ ]# ls /var/lib/docker/volumes/volume_nginx2/_data
50x.html  index.html
[root@ubuntu1804 ~ ]# echo "volume_nginx2 page" > /var/lib/docker/volumes/volume_nginx2/_data/index.html

[root@ubuntu1804 ~ ]# curl 10.0.0.100:81
volume_nginx2 page

#step5:利用现在的命名数据卷再创建新容器,可以和原有容器共享同一个命名数据卷的数据
docker run -d -p 82:80 -v volume_nginx2:/usr/share/nginx/html --name volume_nginx3 nginx:1.21.1-alpine

[root@ubuntu1804 ~ ]# curl 10.0.0.100:82
volume_nginx2 page


#step6:删除容器docker rm -fv 不会删除命名卷
[root@ubuntu1804 ~ ]# docker rm -fv volume_nginx1
volume_nginx1

[root@ubuntu1804 ~ ]# docker volume ls
DRIVER              VOLUME NAME
local               volume_nginx1
local               volume_nginx2

#step7:docker volume prune 清理没有被容器使用命名卷
[root@ubuntu1804 ~ ]# docker volume prune -f
Deleted Volumes:
volume_nginx1

Total reclaimed space: 1.106kB

3.4 数据卷容器

3.4.1 数据卷容器介绍

image-20240216154258159

生产业务中为了数据持久化保存到宿主机,可能运行一个容器需要挂载多个数据卷,就会使得 docker run创建启动容器命令超级长,尤其是匿名卷复用

数据卷容器:首先创建一个容器 volume server将所需数据卷目录通过 docker run -v方式挂载到容器中,其余容器通过 docker run --volumes-from指定 volume server容器,间接的把宿主机上数据卷目录挂载自己容器中;相当于告诉 client容器照着 volume server容器数据卷挂载情况抄一遍

注意点:前提是指定的数据卷容器必须存在,和数据卷容器状态无关(运行状态,停止状态,挂起状态),一旦数据卷容器删除,无法利用数据卷容器创建新的 client容器;数据卷容器删除不会影响到已经创建的 client容器

3.4.2 数据卷命令

docker run命令启动容器时,指定使用数据卷容器

docker run --volumes-from <数据卷容器>     # Mount volumes from the specified container(s)

3.4.3 实战案例: 数据卷容器

3.4.3.1 创建数据卷容器 volume server

#准备数据卷目录
[root@ubuntu1804 ~ ]# mkdir /data/nginx
[root@ubuntu1804 ~ ]# echo "nginx page on host v1" > /data/nginx/index.html

#创建数据卷容器
docker run -d -p 80:80 -v /data/nginx:/usr/share/nginx/html --name volume_server nginx:1.21.1-alpine

3.4.3.2 创建client容器

#指定数据卷容器
docker run -d -p 81:80 --volumes-from=volume_server --name volume_client1 nginx:1.21.1-alpine
docker run -d -p 82:80 --volumes-from=volume_server --name volume_client2 nginx:1.21.1-alpine

#测试访问
[root@ubuntu1804 ~ ]# curl 10.0.0.100:80
nginx page on host v1
[root@ubuntu1804 ~ ]# curl 10.0.0.100:81
nginx page on host v1
[root@ubuntu1804 ~ ]# curl 10.0.0.100:82
nginx page on host v1

3.4.3.4 进入容器测试读写

数据卷读写权限依赖于源数据卷 volume_server容器

#进入 Server 容器修改数据
[root@ubuntu1804 ~ ]# docker exec  -it volume_server sh
/ # echo "nginx page on host v2" > /usr/share/nginx/html/index.html

[root@ubuntu1804 ~ ]# curl 10.0.0.100:81
nginx page on host v2
[root@ubuntu1804 ~ ]# curl 10.0.0.100:82
nginx page on host v2

#进入 Client 容器修改数据
[root@ubuntu1804 ~ ]# docker exec  -it volume_client1 sh
/ # echo "nginx page on host v3" > /usr/share/nginx/html/index.html

[root@ubuntu1804 ~ ]# curl 10.0.0.100:80
nginx page on host v3
[root@ubuntu1804 ~ ]# curl 10.0.0.100:81
nginx page on host v3
[root@ubuntu1804 ~ ]# curl 10.0.0.100:82
nginx page on host v3

3.4.3.5 关闭卷容器Server测试能否启动新容器

关闭卷容器 volume_server,仍然可以创建新的client容器及访问旧的client容器

[root@ubuntu1804 ~ ]# docker stop volume_server
volume_server

#创建容器
docker run -d -p 83:80 --volumes-from=volume_server --name volume_client3 nginx:1.21.1-alpine

#测试访问
[root@ubuntu1804 ~ ]# curl 10.0.0.100:83
nginx page on host v3

3.4.3.6 删除源卷容器Server,访问client和创建新的client容器

删除数据卷容器后,旧的client 容器仍能访问,但无法再创建新的client容器

[root@ubuntu1804 ~ ]# docker rm -f volume_server
volume_server

[root@ubuntu1804 ~ ]# docker run -d -p 84:80 --volumes-from=volume_server --name volume_client4 nginx:1.21.1-alpine
docker: Error response from daemon: No such container: volume_server.