作为一个程序员,难免会遇到问题,重点是遇到问题的时候,我们该如何解决,今天记录一下。
背景:
当修改一个容器, 如es里面的配置文件或者安装ik分词器的无法启动 , 修改完成后重启容器, 使用docker ps -a 查看容器,显示容器EXIT(1), 没有正常启动.
通过docker logs es, 日志报错提示配置文件有误或者错误信息。因为修改了docker容器中的配置信息,由于配置文件写错,或者配置文件格式错误等原因,导致容器无法再次启动.
这时候通过命令: docker exec -it es /bin/bash 已经无法进入容器了, 问题是容器无法启动, 但容器配置文件又在容器里面, 我们该怎么办呢 ?
方法一:
把docker容器中的配置文件复制到主机中,然后在主机中修改,修改完成后再复制到docker容器中,这里需要使用的docker的命令:
docker cp [容器id]:docker容器中配置文件路径 主机路径
例如:
docker cp mysql:/etc/mysql/my.cnf /home/my.cnf
这样就能把容器中的文件拿到本地来,然后进行修改之后呢,再通过该命名上传到容器中去。
例如:
docker cp 主机文件路径 容器id:docker容器中配置文件路径
docker cp /home/my.cnf mysql:/etc/mysql/my.cnf
之后我们重启容器就可以了。
方法二:
但是有时候,我们拿下来配置文件来也没用,比如有时间有多余的文件我们想要删除。docker cp命令是不能满足的。这个时候我们就可以考虑想办法连接到docker 的本身虚拟机(MobyLinuxVM)里面去处理那些文件,因为我们所有的镜像文件和容器都在这里面的。
其实在linux系统的比较好连接docker 的本身虚拟机(MobyLinuxVM)。在window上就比较麻烦一些了
window上连接docker本身虚拟机(MobyLinuxVM)解决方式:
先执行这个,会下载一个镜像和启动一个容器:
docker run --privileged -it -v /var/run/docker.sock:/var/run/docker.sock jongallant/ubuntu-docker-client
然后再执行:
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
最后登陆到宿主host就能操作所有容器文件了:
chroot /host
例如你要操作某一个容器的文件,例如es01,可以通过命令查看es01容器的:
docker inspect es01
能到找到容器的文件所在的位置,然后通过上面的操作就能去增删改查你的配置文件了。