Docker 提供了三种主要的数据管理方式:
- 默认存储:容器内的数据随容器删除而丢失
- Volumes(卷):由 Docker 管理的持久化存储空间,完全独立于容器的生命周期
- Bind Mounts(绑定挂载):将主机上的目录或文件直接挂载到容器中
方式一:默认存储
容器内的数据随容器删除而丢失
➜ golang_sample git:(main) ✗ docker run -itd nginx #运行Nginx容器
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
1645c1e06f46: Pull complete
1b30016634d5: Pull complete
cd9307c9ecd8: Pull complete
e95a6c7ea7d4: Pull complete
acf093e7a04f: Pull complete
df68ee7e7a00: Pull complete
fcb6fd84b2a0: Pull complete
Digest: sha256:ec4ed8b5299e5e90694af7750eb6dffd2627317d30544d056b0371f8082f7bce
Status: Downloaded newer image for nginx:latest
2605a9580ae579a349306e969c39e84a2dac339e8f8a2debd763c108803cf640
➜ golang_sample git:(main) ✗ df -h #查看默认挂载目录
Filesystem Size Used Avail Use% Mounted on
overlay 256G 69M 256G 1% /
tmpfs 64M 0 64M 0% /dev
shm 8.0G 0 8.0G 0% /dev/shm
/dev/vda1 100G 30G 71G 30% /usr/sbin/docker-init
/dev/bcache0p2 20T 4.7T 15T 24% /workspace
/dev/bcache0p2 20T 4.7T 15T 24% /root/.vscode-server
/dev/bcache0p2 20T 4.7T 15T 24% /run/.git
/dev/bcache0p1 20T 1.9T 18T 10% /etc/hosts
/dev/bcache0p2 20T 4.7T 15T 24% /run/.userdata
tmpfs 557G 0 557G 0% /proc/acpi
tmpfs 557G 0 557G 0% /proc/scsi
tmpfs 557G 0 557G 0% /sys/firmware
overlay 20T 4.7T 15T 24% /var/lib/docker/rootfs/overlayfs/2605a9580ae579a349306e969c39e84a2dac339e8f8a2debd763c108803cf640
➜ golang_sample git:(main) ✗ docker stop 260 #停止容器
260
➜ golang_sample git:(main) ✗ docker rm 260 #删除容器
260
➜ golang_sample git:(main) ✗ cd /var/lib/docker/rootfs/overlayfs/2605a9580ae579a349306e969c39e84a2dac339e8f8a2debd763c108803cf640
# 尝试进入默认挂载目录
cd: no such file or directory: /var/lib/docker/rootfs/overlayfs/2605a9580ae579a349306e969c39e84a2dac339e8f8a2debd763c108803cf640
# 发现目录已经被删了
方式二:数据卷存储
由 Docker 管理的持久化存储空间,完全独立于容器的生命周期
# 创建存储卷
➜ golang_sample git:(main) ✗ docker volume create nginx_data
nginx_data
# 挂载存储卷到Nginx默认页面,运行容器
➜ golang_sample git:(main) ✗ docker run -itd --name volume_nginx -p 81:80 -v volume_nginx:/usr/share/nginx/html nginx
90a96e95d8d159834c1f032f41e33213f9046b6f77af162b6f533989945b6f25
# 写入新的index.html覆盖nginx默认页面
➜ golang_sample git:(main) ✗ docker exec -it volume_nginx bash
root@90a96e95d8d1:/# sh -c 'echo "<h1>Hello from Volume Storage</h1>" > /usr/share/nginx/html/index.html'
root@90a96e95d8d1:/# exit
exit
# 验证
➜ golang_sample git:(main) ✗ curl 127.0.0.1:81
<h1>Hello from Volume Storage</h1>
# 停止并删除容器
➜ golang_sample git:(main) ✗ docker stop 90a && docker rm 90a
# 重新创建新的容器:挂载存储卷到Nginx默认页面,运行容器
➜ golang_sample git:(main) ✗ docker run -itd --name volume_nginx -p 81:80 -v volume_nginx:/usr/share/nginx/html nginx
9f34f72528ad38f43713334e0dcdb3eec6e717b1220d3414080a6fa61a4c6798
# 再次验证
➜ golang_sample git:(main) ✗ curl 127.0.0.1:81
<h1>Hello from Volume Storage</h1> #持久化成功
查看存储卷目录
为了方便管理卷文件,可以查看卷目录
docker volume inspect <卷名>
结果如下:
[
{
"CreatedAt": "<创建时间>",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/<卷名>/_data",
"Name": "<卷名>",
"Options": null,
"Scope": "local"
}
]
方式三:Bind挂载目录
将主机上的目录或文件直接挂载到容器中
# 挂载存储卷到Nginx默认页面,运行容器
➜ golang_sample git:(main) ✗ docker run -itd --name volume_nginx -p 81:80 -v ./html:/usr/share/nginx/html nginx
90a96e95d8d159834c1f032f41e33213f9046b6f77af162b6f533989945b6f25
# 写入新的index.html覆盖nginx默认页面
➜ golang_sample git:(main) ✗ docker exec -it volume_nginx bash
root@90a96e95d8d1:/# sh -c 'echo "<h1>Hello from Volume Storage</h1>" > /usr/share/nginx/html/index.html'
root@90a96e95d8d1:/# exit
exit
# 验证
➜ golang_sample git:(main) ✗ curl 127.0.0.1:81
<h1>Hello from Volume Storage</h1>
➜ /workspace git:(main) ✗ cat html/index.html
<h1>Hello from Bind Mount Storage</h1> # 容器内部修改同步在宿主机的./html目录生效
广告:
THE END












暂无评论内容