起因
- 经常在docker启动容器后 或 在里面安装了很多模块后忘记挂载某些数据目录。备忘
解决方案
方案1 (未测试)
- 把容器保存为镜像,然后用-v参数添加新的卷。需要停止相关容器,有点麻烦
-
1)查看容器 & 停止容器 & 停止docker服务
docker ps -a docker stop f503 systemctl stop docker
2)修改文件(貌似未停止docker服务的话,修改的配置文件会被自动覆盖)。
vi /var/lib/docker/containers/{container_id}/hostconfig.json
追加新端口: 找到 这个 PortBindings 值。在这个json集合里边 "PortBindings": { "80/tcp": [ { "HostIp": "", "HostPort": "80" } ], "8888/tcp": [ { "HostIp": "", "HostPort": "8888" } ] }
追加目录映射:修改hostconfig.json中开头的 “Binds”部分 "Binds": ["/webroot/www/go/goweb:/www/go/src/goweb", "/webroot/www/go/diyikaoshi:/www/go/src/diyikaoshi"],
若是失败 则修改 vi /var/lib/docker/containers/容器ID/config.v2.json(参考: https://stackoverflow.com/questions/19335444/how-do-i-assign-a-port-mapping-to-an-existing-docker-container)。
"MountPoints": { "主机路径": { "Source": "主机路径", "Destination": "容器路径", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "主机路径", "Target": "容器路径" } } }
3)启动docker服务 & 启动容器
systemctl start docker docker start f503
方案2 (未测试)
使用 mount 宿主机的数据到容器内 rootfs 内。
docker inspect查看容器的信息,MergedDir就是容器的rootfs在宿主机的路径
通常是/var/lib/containers/overlay/{containerid}/这样的一个路径
需要进入宿主机,执行挂载命令
mount --bind /hostdir/data/ /var/lib/containers/overlay/{containerid}/mnt/data
然后你在容器内,就可以看到宿主机的数据目录了
ls /mnt data
如果不能进入宿主机,而是在容器内
那么基本上不可能完成这个需求了
方案3 (推荐)
,我的需求仅仅是将 docker 容器内的数据文件 CP 出来而已。
docker cp [文件] [容器id]:/[拷贝文件存放路径]
例如:
[root@localhost opt]# docker cp index.html f9ff84d136c4://opt # 将文件从宿主机cp到容器中[root@localhost opt]# docker cp f9ff84d136c4://opt/netbox.sql /opt # 将文件从容器cp到宿主机中
参考:
在已运行的docker中增加映射端口和映射目录 – 26点的博客
https://www.zhihu.com/question/339098255/answer/2185404203