3-Docker 数据管理
Docker 数据管理
3.1 Docker容器的分层
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通过镜像启动一个容器,会把文件系统和镜像联合挂载形成一个只读层,当对容器写入数据,在只读层之上形成一个读写层进行数据读写。一旦删除容器,就会把只读层删除,从而数据的读写层同时删除。
数据卷作用:把宿主机的目录挂载到容器指定目录,从而在容器中读写数据,实际数据存在于宿主机上。容器销毁时,虽然只读层也会销毁,挂载目录下数据依旧存在。
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 数据卷容器介绍
生产业务中为了数据持久化保存到宿主机,可能运行一个容器需要挂载多个数据卷,就会使得 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.
- 感谢你赐予我前进的力量