docker 容器迁移
import导入的镜像无法运行?
import 导入的镜像需在run命令最后手动指定镜像内的运行指令,该指令可在原宿主机上使用以下命令查看:
docker ps --no-trunc
在run命令的末尾加上这些命令(以上图第一个容器举例):
docker run -d --name xxx IMAGE_ID java -jar /webfont.jar
迁移后没有数据?
使用 export/import 或者 save/load 持久化容器并运行在新的服务器上,发现原本的数据没有了,但原来的镜像在运行的时候并没有手动挂载卷。
出现这种问题的原因是:虽然你没有手动挂载卷,但不代表镜像制作者当初没有在dockerfile中挂载卷。
dockerfile中有个 VOLUME
指令,可用于指定匿名挂载卷。其形式为:
VOLUME [/some-container-dir]
只需要指定一个镜像内的地址,而不需要指定将其挂载到宿主机的什么位置。docker会自动在docker安装目录下生成一个挂载点。这样做的目的主要是为了数据安全考虑,倘若有一个非常重要的数据库容器,运行时没有指定挂载数据点,假如不小心将该容器删除了,那数据就再找不回来了。故一般数据库镜像都会自动将数据文件夹挂载到宿主机。(注:手动指定的挂载点会覆盖自动挂载点)
例如 wordpress 的dockerfile中就有:
启动容器后(不手动挂载卷)使用以下命令查看容器详情:
docker inspect my-wordpress
可以看到虽然没有手动指定,它还是自动将 /var/www/html 目录挂载到了宿主机的某个目录上。
所以正确的做法是,将容器迁移后还需要将这些挂载点也复制过去。
匿名挂载卷如何处理?
挂载时没有指明具体宿主机目录就是匿名挂载卷(通过docker inspect中的 Mount 部分可以看到)
在清除docker-compose容器时,使用命令:
docker-compose down -v
其中,-v 参数即删除匿名卷
或者在启动时使用命令
docker-compose up -V -d
其中 -V 表示重新生成匿名卷(注:这种方式我试了一下好像还是不行)