上篇:docker-网络问题
刚开始使用docker的同学很可能遇到这样一个问题:启动并进入容器后,在里面做了一些修改,比如设置的变量或者修改了配置等,后来从容器中退出,再次执行启动并进入容器的命令后,之前修改的内容全没了.囧 -_-|| 出现这种情况的原因可能是:
使用docker run 命令启动并进入容器,(假设此时进入的是容器id为aswd1234)在容器(id:aswd1234)中进行了修改等操作在容器(id:aswd1234)中,使用exit退出容器再使用docker run命令进入容器( 此时的容器为一个新的,id发生了变化) 如上所述,这样操作后,第二次进入的容器其实已不是第一次启动的容器,这就导致了第二次进入容器后,找不到第一次启动的容器中的修改了.docker提供了commit命令,可以从容器创建镜像.语法如下: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 命令详解请参见此链接 这样,原来的操作流程就需要添加docker commit的操作:
使用docker run 命令启动并进入容器,(假设此时进入的是容器id为aswd1234)在容器(id:aswd1234)中进行了修改等操作在新的宿主机命令终端中,执行docker commit命令,将容器(id:aswd1234)保存为新镜像(此处主要是为了在宿主机操作,不一定需要新开命令终端,ctrl+p+q也可退出容器)在容器(id:aswd1234)中,使用exit退出容器在宿主机,使用docker run命令启动新保存的镜像,此时成功启动的容器里面,就可以找到之前的修改了上步介绍的是将容器保存为新镜像,然后再启动为新的容器,进而实现进入后仍可以找到之前的修改.这种处理可能有以下问题:
新的镜像产生,意味着需要对磁盘执行写操作,需要考虑文件权限,磁盘空间和I/O保存镜像时,容器内进程运行情况也需要考虑docker commit慎用,参见此链接综上,从容器创建镜像虽可以实现容器内修改持久化,但是也有一定弊端. 对于工作中使用的容器是长期运行且对容器的修改不止是环境变量或配置项的更改,还有数据的保存等操作时,可以考虑使用端口映射,在容器启动时,将容器的SSH服务的22端口映射至宿主机的其它端口,如49122,不退出容器,使用远程登录方式进入并使用容器,再配合docker commit定时在空闲时段保存并更新镜像.