Docker使用记录(三)
前天电脑出现了bug,
Docker Desktop
里所有的
container
和
image
都消失了。万幸今天它们又都出现了,还是提醒了我将
container
映射到本地的重要性。学习了docker volume的使用方法,特此记录。
1. 创建和管理volume
这里我的volume
命名为 zoe-volume
,并在 window11
的 WSL2-Ubuntu22.04
上操作。
# 创建volume
docker volume create zoe-volume
# 查看volume list
docker volume ls
DRIVER VOLUME NAME
local zoe-volume
# 检查volume
docker volume inspect zoe-volume
[
{
"CreatedAt": "2024-04-23T07:22:56Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/zoe-volume/_data",
"Name": "zoe-volume",
"Options": null,
"Scope": "local"
}
]
# 移除volume
docker volume rm zoe-volume
# 清理无用的 volume(不包含任何container的那种)
docker volume prune
默认创建的volume
是没有compose.yaml
,可以自行创建。
2. 创建一个container挂载至本地volume
这个是最简单、方便的,在创建 container
初期就确定挂载 volume
。
注意,其中target
参数是(相对于容器根目录)容器内挂载点的路径,而不是针对宿主机的绝对路径。
docker run --mount source=<volume_name>,target=<mount_path> <image_name>
示例如下:
(base) zoe@MSI:~$ docker run -it --name kinetic_t1 --mount source=zoe-volume,target=/home/zoe/volume ubuntu-16.04:kinetic bash
root@84bb2071e59f:/#
多个 container
可以连接到同一个 volume
中。如下图所示。
# 添加readonly参数,只读 volume
(base) zoe@MSI:~$ docker run -it --name kinetic_t5 --mount source=zoe-volume,target=/app,readonly ubuntu-16.04:kinetic bash
root@84bb2071e59f:/#
3. docker -v和–mount的区别
docker run -it --name kinetic_t2 -v zoe-volume:/data ubuntu-16.04:kinetic bash
docker run -it --name kinetic_t4 --volume zoe-volume:/app ubuntu-16.04:kinetic bash
-v
和--mount
功能几乎一致,--mount
参数指代(key=value结构)要更明确些,-v
用:
分割参数;此外,service
功能只可用--mount
。
4. volume driver
volume driver 用于管理 volume的拓展机制,允许用户使用不同的存储后端来管理卷。例如,
- 支持不同的储存后端:云储存。
- 提供更多功能性和性能优化:加密SSH。
- 集成第三方存储服务:NFS(Network File System)。
- 提高可拓展性和弹性。
5. container间共享内容
几个container
挂载在同一个volume
中是可以共享文件的。
当前有三个container
:kinetic_t2
、kinetic_t4
、kinetic_t1
,挂载在同一个volume
:zoe-volume
中
(base) zoe@MSI:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1d3a23fcb36 ubuntu-16.04:kinetic "bash" 10 hours ago Up 10 hours 22/tcp kinetic_t2
a86b996add5c ubuntu-16.04:kinetic "bash" 11 hours ago Up 11 hours 22/tcp kinetic_t4
84bb2071e59f ubuntu-16.04:kinetic "bash" 18 hours ago Up 18 hours 22/tcp kinetic_t1
在 kinetic_t2
中挂载点创建多个文件:
cd /data
touch test.txt
touch a{1..10}.txt
# 在 kinetic_t2 挂载点可见
root@c1d3a23fcb36:/data# ls
a1.txt a10.txt a2.txt a3.txt a4.txt a5.txt a6.txt a7.txt a8.txt a9.txt test.txt
可以在其他两个container
中找到
# 在 kinetic_t1 挂载点可见
root@84bb2071e59f:/home/zoe/volume# ls
a1.txt a10.txt a2.txt a3.txt a4.txt a5.txt a6.txt a7.txt a8.txt a9.txt test.txt
# 在 kinetic_t4 挂载点可见
root@a86b996add5c:/app# ls
a1.txt a10.txt a2.txt a3.txt a4.txt a5.txt a6.txt a7.txt a8.txt a9.txt test.txt
在Docker Desktop
上也可以看到
6. 从volume 中恢复container 数据
这是我最看重的功能。但之前我有误解,我认为备份是备份一个完整的container
,但其实是备份指定文件夹内的数据。
恢复的本质是用image
新建一个container
并把原来container
备份的数据复制过去。
所以,我认为完整备份一个container
的办法依然是及时将其commit
成image
,然后将image
打包成tar
文件并下载到本地,具体操作可以看这篇。
以下就是我新建一个container
:kinetic_t6
,并在其中恢复 kinetic_t2
中的数据
# 创建一个可交互的 kinetic_t6 容器
docker run -it --name kinetic_t6 --volumes-from kinetic_t2 -v $(pwd):/backup ubuntu-16.04:kinetic bash
# 在打开的容器中 把 kinetic_t2的/data中的内容 打包至 kinetic_t6de /backup/backup.tar中
tar cvf /backup/backup.tar /data
# 解压
tar xvf /backup/backup.tar
解压后会得到kinetic_t2
的 /data
文件夹和对应的数据,如下所述。
root@017b80fe129d:/backup/data# ls
a1.txt a10.txt a2.txt a3.txt a4.txt a5.txt a6.txt a7.txt a8.txt a9.txt test.txt