[云原生之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容器的存储与迁移的主要内容,如果未能解决你的问题,请参考以下文章

云原生-Dockerdocker容器自定义DNS解析

云原生|DockerDocker镜像操作

云原生 • DockerDocker常用命令总结(值得收藏)

云原生大趋势下的容器化技术现状与发展

申通的云原生实践之路:如何实现应用基于容器的微服务改造?

云原生存储详解:容器存储与 K8s 存储卷