Docker 存储管理

Docker 提供了三种主要的数据管理方式:

  1. 默认存储:容器内的数据随容器删除而丢失
  2. Volumes(卷):由 Docker 管理的持久化存储空间,完全独立于容器的生命周期
  3. 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
喜欢就支持一下吧
点赞6打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容