[云原生之DockerDocker容器的存储与迁移
Posted 江湖有缘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生之DockerDocker容器的存储与迁移相关的知识,希望对你有一定的参考价值。
[[云原生之Docker】Docker容器的存储与迁移
一、容器存储介绍
1.容器存储方式
1.默认:数据保存在运行的容器中,容器删除后,数据也随之删除;
2.volumes:数据卷,数据存放在主机文件系统/var/lib/docker/volumes/目录下,该目录由docker管理,其它进程不允许修改,推荐该种方式持久化数据;
3.Bind mounts:直接挂载主机文件系统的任何目录或文件,类似主机和容器的共享目录,主机上任何进程都可以访问修改,容器中也可以看到修改,这种方式最简单。
4.tmpfs:数据暂存在主机内存中,不会写入文件系统,重启后,数据删除。
2.docker数据卷的挂载方式
docker提供数据卷来实现数据共享与持久化。
1.挂载主机目录(Bind mounts)
2.数据卷容器(Data Volumes)
3.数据卷的特性
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
1.数据卷可以在容器之间共享和重用。
2.对数据卷的修改会立马生效。
3.对数据卷的更新不会影响镜像。
4.卷会一直存在,直到没有容器使用。
4.容器的存储图示
二、挂载主机目录方式运行容器
1.下载nginx镜像
docker pull nginx:latest
2.查看nginx镜像
[root@master ~]# docker images |grep nginx
nginx latest 605c77e624dd 6 months ago 141MB
3.为容器内部生成一个目录
①创建一个测试容器
[root@master ~]# docker run -d --name web_01 -v /datadir nginx:latest
1d0bfa9e70c01d2e0dfb98fd22a2e11f828bc6bc92581ea237f53739a632d69f
选项解释:
-d:将容器放入后台运行
-P:将容器中的端口暴露到宿主机的一个随机端口
-v:创建一个数据卷,这个数据卷会自动映射到宿主机的某个目录,一般在/var/lib/docker/overlay2下
②.进入容器内部
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d0bfa9e70c0 nginx:latest "/docker-entrypoint.…" 45 seconds ago Up 44 seconds 80/tcp web_01
6cb5cc09916b celaraze/chemex "/docker-entrypoint.…" 10 days ago Up About an hour 0.0.0.0:8059->80/tcp, :::8059->80/tcp objective_brown
b9376a622ab3 registry.aliyuncs.com/openspug/spug "/entrypoint.sh" 12 days ago Up About an hour 0.0.0.0:8091->80/tcp, :::8091->80/tcp spug
994524e2cdac rancher/agent:v1.2.11 "/run.sh run" 13 days ago Up About an hour rancher-agent
[root@master ~]# docker exec -it 1d0bfa9e70c0 /bin/bash
root@1d0bfa9e70c0:/#
③.查看内部创建的目录
root@1d0bfa9e70c0:/# cd /datadir/
root@1d0bfa9e70c0:/datadir# pwd
/datadir
④.宿主机的磁盘挂载情况
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 15G 12G 3.2G 79% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 13M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda3 1014M 33M 982M 4% /home
/dev/sda1 1014M 174M 841M 18% /boot
overlay 15G 12G 3.2G 79% /var/lib/docker/overlay2/09639d88dd8ab350338f1c23e7092f21271c43b93170cd980630b4ad48ce344a/merged
overlay 15G 12G 3.2G 79% /var/lib/docker/overlay2/18974f4518e953a40ab8867e97f297b56d4d2848583375cc008e04dcb9beafcd/merged
overlay 15G 12G 3.2G 79% /var/lib/docker/overlay2/4c1cc2149efae6dc78dbf672a287fa1885c212dcd7a3fdc4689fcfd4a41840eb/merged
shm 64M 0 64M 0% /var/lib/docker/containers/994524e2cdac5336ec16c0e521ecec892f565459b6938d293535247018d6e8b9/mounts/shm
tmpfs 378M 0 378M 0% /run/user/0
overlay 15G 12G 3.2G 79% /var/lib/docker/overlay2/cb438612464acf4c30698303849cc4fb3ec43e043a5e0fc912e61232a4696a7c/merged
⑤.容器内部磁盘挂载情况
[root@master ~]# docker exec -it 1d0bfa /bin/bash
root@1d0bfa9e70c0:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 15G 12G 3.2G 79% /
tmpfs 64M 0 64M 0% /dev
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
shm 64M 0 64M 0% /dev/shm
/dev/sda2 15G 12G 3.2G 79% /datadir
tmpfs 1.9G 0 1.9G 0% /proc/asound
tmpfs 1.9G 0 1.9G 0% /proc/acpi
tmpfs 1.9G 0 1.9G 0% /proc/scsi
tmpfs 1.9G 0 1.9G 0% /sys/firmware
4.挂载一个宿主机目录作为数据卷
#将宿主机的/webdata目录挂载至容器的/centos/data目录
#docker挂载数据卷的默认为权限为读写(rw),用户也可以通过ro指定为只读
docker run -d --name web03 -v /webdata:/centos/data docker.io/nginx:latest
5.容器持久存储的场景
三、创建数据卷目录用来关联容器
1.数据卷图示
2.单独创建一个数据卷
[root@master ~]# docker volume create myvol
myvol
3.查看所有数据卷信息
[root@master ~]# docker volume ls
DRIVER VOLUME NAME
local 0c2cecc14d95354dfc0401b3b062581596aab0dcf5e83dd4cbcbd12bd04ff11a
local 0ea3298c532dfa098978e6a2d36ecf8195a536db5746438d4b9329905825c636
local 2f027d2526af1e4d0da279eebebfd96469e82641d54d7b2fbb958164d224ce8f
local 6e72518840d74c52983529cdfecf376cd6061e75b00f169f61d8aeda3dc6cd1f
local 7aac29e4d8eeb1465bea571e775153ecfccbf8bee97641aa73273eb56d6f5245
local 9beb71df7cc6af271ead2f735b4af038b8094b835b414217726ab4175e9bae0e
local 19ce836303787cc0b360b819adba8217d034621dfdd5f56a13ba96c1aeb00a28
local 52bb396685f613a311e87848871689ff11326125dfb4595cc13d1dc229c446de
local 77b1fd43910b9c0a92b44dc29e693c3eb324a38aac397faae18284876e3e0f86
local 244d862ddceb928e71ffe0e3477475698a9420da82e05f58caeb2ad1dbbbff4a
local 453a3d77eb1a81a7ef3bb1cc124cb8281fd610e29489f46b629bb27b2a31ff81
local 616c26188563865cea78c1316d3cb1300fcb6a8bcad65b9216c258dc4a2e34b8
local 926f3ba2cf98b6c37dfe38b32f025f2427fad9ffd7b41eb1c3944ca9d24a22a0
local 1859beaf9f8a11916d86a1b3ddb145ea2d19a3ee219125249688e7fdabf20313
local 29304c098ff665d418eee86d0ff0df34adcfc79a2c45a86e2a3403b93d604c05
local 82030b75593a704e5ea8d279ed04d7c8965bd9d8089952556c25fe8267ef275e
local 898265128d6ecff431ca4a69df91f9fa3e2463900779b2f619c813a8df1cd2f3
local c8901fd51d9fdc4fd9cc441e5877684dda650a78ebda122501517529b3bd45d3
local db3b2982bb6ace4842702a6462e8fe63ef515c64912c458ef66fde9253cacc40
local e5c597e879844904de1105e602b1a5c7ef2c9bd1eef668ca443447a972739292
local e20059f864389c7fa6061e28dcc0bb8a47074ebd717909f922f4c3b8f5dd6c5b
local fac01b41eb97e60b3984ff57b1ab00b0b1fa95ceb933db29c8e9e92532b8440e
local myvol
local rancher-agent-state
local rancher-cni
local rancher-cni-driver
4.查看单个数据卷详细信息
[root@master ~]# docker volume inspect myvol
[
"CreatedAt": "2022-07-10T20:13:37+08:00",
"Driver": "local",
"Labels": ,
"Mountpoint": "/var/lib/docker/volumes/myvol/_data",
"Name": "myvol",
"Options": ,
"Scope": "local"
]
5.在数据卷创建测试文件
[root@master ~]# cd /var/lib/docker/volumes/myvol/_data/
[root@master _data]# ls
[root@master _data]# echo "hello" >> test.txt
[root@master _data]# ls
test.txt
6.将数据卷挂载到容器
[root@master ~]# docker run -d --name web20 --mount source=myvol,target=/datatest nginx:latest
2bd22b886cf458f92a1c3572e7b00915c6c3fcf4da7d0aabe61947ae54282282
7.检查测试文件
[root@master ~]# docker exec -it 2bd22 /bin/bash
root@2bd22b886cf4:/# cd /datatest/
root@2bd22b886cf4:/datatest# ls
test.txt
root@2bd22b886cf4:/datatest# cat test.txt
hello
8.删除数据卷
docker volume rm name_vol
四、创建数据卷容器
1.创建数据卷容器
docker run -d --name web30 -v /share/data nginx:latest
2.新建容器关联数据卷容器
docker run -di --name web50 --volumes-from web30 nginx:latest
3.检测文件内容
[root@master ~]# docker exec -it web30 /bin/bash
root@8cbc6ab1b1a6:/# cd /share/data/
root@8cbc6ab1b1a6:/share/data# echo "web30 file" >> file30.txt
root@8cbc6ab1b1a6:/share/data# exit
exit
[root@master ~]# docker exec -it web50 /bin/bash
root@7a442cec28b1:/# cd /share/data/
root@7a442cec28b1:/share/data# ls
file30.txt
root@7a442cec28b1:/share/data# cat file30.txt
web30 file
五、利用数据卷容器迁移容器
1.创建容器
docker run -d --volumes-from web30 -v /backup:/backup --name web70 nginx:latest
2.备份容器
[root@master ~]# docker exec -it web70 /bin/bash
root@25f376eb085d:/# tar -zcf /backup/backup.tar.gz /share/data/
tar: Removing leading `/' from member names
root@25f376eb085d:/# ls /backup/
backup.tar.gz dir dir.bak
3.还原容器
①重新创建一个新容器
[root@master ~]# docker run -d --name web80 -v /share/data nginx:latest
c13f3c3111cfe03053644e85c1f08d5dbd1c83ceec4cd2bff64cf4557896f941
②还原容器
#创建一个新容器,并用-v参数挂载本地的备份目录,然后执行解压操作,将备份文件解压至/share/data目录
[root@master ~]# docker run -it --volumes-from web80 -v /backup:/backup nginx:latest tar xf /backup/backup.tar.gz
[root@master ~]# docker exec -it web80 /bin/bash
root@c13f3c3111cf:/# ls /share/data/
file30.txt
六、使用镜像迁移容器
1.查看需要迁移的容器
[root@master ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
654f8008e7a4 nginx "/docker-entrypoint.…" 22 seconds ago Up 21 seconds 0.0.0.0:8055->80/tcp, :::8055->80/tcp web02
cadaf2488002 f652ca386ed1 "/docker-entrypoint.…" 8 hours ago Up 8 hours 0.0.0.0:8121->80/tcp, :::8121->80/tcp web01
2.导出容器成镜像
[root@master ~]# docker export 654f8008e7a4 > ngixn.bak.tar
3.查看导出的镜像文件
[root@master ~]## ll
total 373644
-rw-------. 1 root root 2635 Dec 1 2020 anaconda-ks.cfg
-rw------- 1 root root 238581248 Dec 9 22:52 centos_7.4.tar
-rw------- 1 root root 853 Jun 2 2021 dead.letter
drwxr-xr-x. 2 root root 6 Jan 30 2021 Desktop
drwxr-xr-x. 2 root root 6 Jan 30 2021 Documents
drwxr-xr-x. 2 root root 6 Jan 30 2021 Downloads
drwxr-xr-x. 2 root root 6 Jan 30 2021 Music
-rw-r--r-- 1 root root 144014848 Dec 10 23:15 ngixn.bak.tar
-rw-------. 1 root root 2055 Dec 1 2020 original-ks.cfg
drwxr-xr-x. 2 root root 6 Jan 30 2021 Pictures
drwxr-xr-x. 2 root root 6 Jan 30 2021 Public
drwxr-xr-x. 2 root root 6 Jan 30 2021 Templates
drwxr-xr-x. 2 root root 6 Jan 30 2021 Videos
4.将打包的镜像文件导入到新服务器
[root@master ~]# cat ngixn.bak.tar |docker import - nginx:3.0
sha256:e2e3b214206138fb5cc23414160b2605cc91e3560625db5f26fcb7c1db8b5390
5.查看导入的镜像
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 3.0 e2e3b2142061 8 seconds ago 140MB
124.71.216.10:5000/busybox 1.2 ffe9d497c324 2 days ago 1.24MB
busybox latest ffe9d497c324 2 days ago 1.24MB
nginx latest f652ca386ed1 8 days ago 141MB
124.71.216.10:5000/it_test_hello-world 1.0.0 feb5d9fea6a5 2 months ago 13.3kB
hello-world
6.启动迁移后的容器
[root@master ~]# docker run -it nginx:3.0 /bin/bash
root@f0847953b1e6:/# pwd
/
root@f0847953b1e6:/# ls /
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@f0847953b1e6:/#
以上是关于[云原生之DockerDocker容器的存储与迁移的主要内容,如果未能解决你的问题,请参考以下文章