docker容器与容器、容器和宿主机共享、容器数据复制

1.宿主机和容器之间共享数据

一.运行docker run命令时,通过-v选项将宿主机的卷挂载到容器上:

docker run --name "mysql" -ti -v /data:/data mysql bash
#共享了宿主机的data目录,默认读写权限

在这里插入图片描述
容器删除之后数据卷数据还在:
在这里插入图片描述
在这里插入图片描述

2.容器之间共享数据:

2.1 容器共享数据卷的介绍

多个容器之间共享一个容器中定义的数据卷,就是让docker去负责管理卷。
docker run -v参数如果不指定宿主机的目录,就是创建了一个可以共享数据的数据卷容器,由docker去管理它。

[root@ligen ~]# docker run -it -v /data  mysql bash
root@53bb5fc005db:/# ls /data/    #这是共享目录
root@53bb5fc005db:/# touch /data/test.txt   
root@53bb5fc005db:/# ls /data/
test.txt   #在共享目录上创建了test.txt文件
root@53bb5fc005db:/# exit
exit
[root@ligen ~]# 

有了一个容器共享卷后(docker会在/var/lib/docker/volumes下为这个卷创建对应的文件夹),如何在本地查看呢:

[root@ligen ~]# docker inspect -f {
    
    {.Mounts}} 53bb5fc005   #查看容器详情,截取共享目录路径
[{
    
    volume ec705e8062f6eac09282b0c0cc75b01ac653c036c1fe3b8b383d89ae176bbd76 /var/lib/docker/volumes/ec705e8062f6eac09282b0c0cc75b01ac653c036c1fe3b8b383d89ae176bbd76/_data /data local  true } {
    
    volume 1b24e9205749a0af07d0225f5c52d02cec43d109c5ccab0a530fc1660c8d35a5 /var/lib/docker/volumes/1b24e9205749a0af07d0225f5c52d02cec43d109c5ccab0a530fc1660c8d35a5/_data /var/lib/mysql  
[root@ligen ~]# ls /var/lib/docker/volumes/ec705e8062f6eac09282b0c0cc75b01ac653c036c1fe3b8b383d89ae176bbd76/_data
test.txt   #能看到在容器上创建的test.txt文件

任何对共享目录的修改都会被记录下来,重启了共享容器,或者共享容器处于stop状态,重启后也能看到修改后的内容:
(刚才把测试的容器删除了,为连贯起来,我重新创建一下):

----重新创建部分
[root@ligen ~]# docker run -it -v /data/ -d mysql bash
531f293d0c04c904ec826c48d838b9e77f229449c685f88ba1594fce5b4f6229
[root@ligen ~]# docker exec -it 531 bash
root@531f293d0c04:/# ls /data/
root@531f293d0c04:/# touch /data/test.txt
root@531f293d0c04:/# ls /data/
test.txt
[root@ligen ~]# docker inspect -f {
    
    {.Mounts}} 531f
[{
    
    volume f9c8b96dea063ee57317a1ae6aa2dc2c6a9a53a54e7f2f5518cdece94622ddcb /var/lib/docker/volumes/f9c8b96dea063ee57317a1ae6aa2dc2c6a9a53a54e7f2f5518cdece94622ddcb/_data /data local  true } {
    
    volume cfaa024ddc45b46b8c44f755783e7d6ddbd00a30121cf6611dec3621d5cf9a98 /var/lib/docker/volumes/cfaa024ddc45b46b8c44f755783e7d6ddbd00a30121cf6611dec3621d5cf9a98/_data /var/lib/mysql local  true }]
[root@ligen ~]# ls /var/lib/docker/volumes/f9c8b96dea063ee57317a1ae6aa2dc2c6a9a53a54e7f2f5518cdece94622ddcb/_data
test.txt
-----------------------

停止容器,本地在数据卷里创建文件

[root@ligen ~]# docker stop 531
531
[root@ligen ~]# ls /var/lib/docker/volumes/f9c8b96dea063ee57317a1ae6aa2dc2c6a9a53a54e7f2f5518cdece94622ddcb/_data
test.txt
[root@ligen ~]# touch /var/lib/docker/volumes/f9c8b96dea063ee57317a1ae6aa2dc2c6a9a53a54e7f2f5518cdece94622ddcb/_data/local.xt
[root@ligen ~]# ls /var/lib/docker/volumes/f9c8b96dea063ee57317a1ae6aa2dc2c6a9a53a54e7f2f5518cdece94622ddcb/_data   
local.xt  test.txt  #创建了local.xt

重启容器查看:

[root@ligen ~]# docker start 531
531
[root@ligen ~]# docker exec -it 531 bash
root@531f293d0c04:/# ls /data/
local.xt  test.txt   #可以看到有local.xt
root@531f293d0c04:/# 

2.2 其他容器挂载共享容器卷
再用另一个容器去挂载它:

[root@ligen ~]# docker run -it --volumes-from 531f mysql bash  #--volumes-from后面接容器名
root@f8042c925998:/# ls /data/
local.xt  test.txt

删除共享卷:

[root@ligen ~]# docker volume ls -q
[root@ligen ~]# docker volume rm f9c8b96dea063ee57317a1ae6aa2dc2c6a9a53a54e7f2f5518cdece94622ddcb  #这个是卷id

#或者方法二:
[root@ligen ~]# docker rm -v f8042c   #容器名称或卷id

3.对容器进行数据复制

使用场景:有一个运行中的容器,没有设置任何数据卷,想从容器复制数据出来或者复制数据进去。
3.1从容器复制数据到宿主机上:

#容器数据位置
root@143150f95334:/# ls file.txt 
file.txt
root@143150f95334:/# pwd       
/
#复制操作
#在宿主机上执行
[root@ligen ~]# docker cp mysql:/file.txt .
#mysql:/file.txt . 前面是容器名称和路径 后面是宿主机文件存放路径

3.2从宿主机复制到容器

[root@ligen ~]# docker cp local.file mysql:/root/ #就是调换下位置

猜你喜欢

转载自blog.csdn.net/qq_37369726/article/details/121249022