最近Docker hub发现一个好玩的云备忘录 memos ,在搭建时,忘记挂载映射目录。那么本文就来实现一下在不删除容器重新启动部署的情况下进行目录的映射与挂载。
1 查找容器存放目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| # 查找Docker根目录(Root Directory) [root@youfeng ~]# docker info | grep 'Root' Docker Root Dir: /var/lib/docker
# 查找容器id [root@youfeng ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c67505a5655a neosmemo/memos "./memos" 55 minutes ago Up 42 minutes 0.0.0.0:5230->5230/tcp, :::5230->5230/tcp memos
# 记住容器id前几位,然后使用TAB键命令列出可用命令或文件来找到容器目录 [root@youfeng ~]# cd /var/lib/docker/containers/c67
# 按下TAB键 [root@youfeng ~]# cd /var/lib/docker/containers/c67505a5655a7728d157e4c10fb44cedf0fe0e554a3c28753f56ffefddb2c7fb/ [root@youfeng c67505a5655a7728d157e4c10fb44cedf0fe0e554a3c28753f56ffefddb2c7fb]# [root@youfeng c67505a5655a7728d157e4c10fb44cedf0fe0e554a3c28753f56ffefddb2c7fb]# ll total 56 -rw-r----- 1 root root 20989 Aug 3 16:08 c67505a5655a7728d157e4c10fb44cedf0fe0e554a3c28753f56ffefddb2c7fb-json.log drwx------ 2 root root 4096 Aug 3 15:55 checkpoints -rw------- 1 root root 3595 Aug 3 16:08 config.v2.json -rw------- 1 root root 1474 Aug 3 16:08 hostconfig.json -rw-r--r-- 1 root root 13 Aug 3 16:08 hostname -rw-r--r-- 1 root root 175 Aug 3 16:08 hosts drwx--x--- 2 root root 4096 Aug 3 15:55 mounts -rw-r--r-- 1 root root 149 Aug 3 16:08 resolv.conf -rw-r--r-- 1 root root 71 Aug 3 16:08 resolv.conf.hash [root@youfeng c67505a5655a7728d157e4c10fb44cedf0fe0e554a3c28753f56ffefddb2c7fb]#
|
可以看到容器内有许多文件,而我们需要修改的文件是config.v2.json和hostconfig.json
2 停止Docker服务
在实现目录的映射和挂载之前,需要先停止 Docker 服务,否则修改后的内容在Docker重启后会被重置,导致实现挂载目录操作失败。
1 2
| [root@youfeng ~]# systemctl stop docker [root@youfeng ~]#
|
3 修改 config.v2.json 文件
1 2 3
| # 使用 vi 命令去修改文件
[root@youfeng c67505a5655a7728d157e4c10fb44cedf0fe0e554a3c28753f56ffefddb2c7fb]# vi config.v2.json
|
1 2 3
| # 使用 vi 命令打开文件后,会发现文件格式并非Json格式,这里可以输入:%!python3 -m json.tool 命令将其进行格式化
:%!python3 -m json.tool
|
接下来需要在文件内找到 “MountPoints” ,添加映射关系即可;如果添加前后还要其他内容,需要注意不要遗漏掉逗号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 修改前的 config.v2.json 中的 MountPoints "MountPoints": { "/var/opt/memos": { "Source": "", "Destination": "/var/opt/memos", "RW": true, "Name": "a11741e6de08e0137223c3f05c3a0032561144cd51f1e1b2dac816f1a5a158c1", "Driver": "local", "Type": "volume", "ID": "8bbd5b9ebef538868f4050db7d615161ad667cd8c46e218a10936ef316066ce5", "Spec": {}, "SkipMountpointCreation": false } },
|
我们的需求是将容器内的 /var/opt/memos 映射到宿主机下的 /usr/memos 目录下。那我们现需要在 Source 和 Spec 中填充宿主机和映射关系。具体实现如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| # 修改后的 config.v2.json 中的 MountPoints "MountPoints": { "/var/opt/memos": { "Source": "/usr/memos", "Destination": "/var/opt/memos", "RW": true, "Name": "a11741e6de08e0137223c3f05c3a0032561144cd51f1e1b2dac816f1a5a158c1", "Driver": "local", "Type": "volume", "ID": "8bbd5b9ebef538868f4050db7d615161ad667cd8c46e218a10936ef316066ce5", "Spec": { "Type": "bind", "Source": "/usr/memos", "Target": "/var/opt/memos" }, "SkipMountpointCreation": false } },
|
4 修改 hostconfig.json 文件
接下来需要在文件内找到 “Binds” ,添加映射即可;如需添加多个,或前后还有其他内容,需要注意不要遗漏掉逗号。
1 2 3 4 5 6 7 8 9
| # 修改前的 hostconfig.json 包含 Binds 的部分 { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, ......
|
添加容器与宿主机的映射关系,如需添加多个,或前后还有其他内容,需要注意不要遗漏掉逗号。
1 2 3 4 5 6 7 8 9 10 11
| # 修改后的 hostconfig.json 包含 Binds 的部分 { "Binds": [ "/usr/memos:/var/opt/memos" ], "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, ......
|
5 重启 Docker 服务
1 2 3
| [root@youfeng ~]# systemctl start docker [root@youfeng ~]# [root@youfeng ~]#docker start memos
|
6 验证是否挂载成功
1 2 3 4 5 6 7 8
| [root@youfeng memos]# pwd /usr/memos [root@youfeng memos]# ll total 192 -rw-r--r-- 1 root root 4096 Aug 3 17:34 memos_prod.db -rw-r--r-- 1 root root 32768 Aug 3 17:34 memos_prod.db-shm -rw-r--r-- 1 root root 156592 Aug 3 17:34 memos_prod.db-wal [root@youfeng memos]#
|
可以看的出来,目录成功映射出来,需求解决,遇到类似的需要挂载已启动容器可参考本文。最后,附上memos云备忘录的完整搭建命令,有兴趣可以去玩一下。
1 2 3 4 5
| docker run -d \ --name memos \ -p 5230:5230 \ -v /usr/memos:/var/opt/memos \ neosmemo/memos
|