我们可能会碰到这样的一个问题,在容器执行过程中,修改了容器的内容(如配置文件信息),但因为修改出了问题。导致容器关闭后,无法启动。

这事需要重新修改配置文件。 正常情况下可以通过 docker exec命令打开容器的一个shell终端进去修改。

但这时容器已经无法启动了。这时该如何处理呢? 这有两种方案:

方案一:创建新镜像

把这个问题容器用docker commit提交到一个新的镜像,然后用docker run -it 基于新镜像运行一个新的容器进去改变(修复)配置文件。

再通过新的容器再提交一个新的镜像,然后在基于新的镜像重新启动容器(同最初的容器)。

这个方法是可行的,但问题是步骤多,而且提交了新的镜像,对于后续维护增加了复杂性。

方案二:直接修改容器的文件

所有的容器数据都存在/var/lib/docker/aufs/diff/路径下。比如:

root@ubuntu:~# ls /var/lib/docker/aufs/diff/ -l
total
drwxr-xr-x root root Mar : 040bf8e0842564e26e62f3e3a30785bd9651c82c52ed99115cd5360ce979e680
drwxr-xr-x root root Mar : 04f7e78a2c8ac9664503f4ea5a1d94bf27b94620987f241cfb9fd6631f761113
drwxr-xr-x root root Mar : 0c666375883f81ba0fc3962368766e93710f59c072a4b80cdf5640323018ccdb
drwxr-xr-x root root Mar : 0d7fc1722e459b242140ec45faec754d4967d72ea2ddf321f8606c837f8e8d4f
drwxr-xr-x root root Mar : 0d7fc1722e459b242140ec45faec754d4967d72ea2ddf321f8606c837f8e8d4f-init
drwxr-xr-x root root Mar : 0dc5e226a795507723362cc16046cf16650f8f70dc7bb721b799a5f2a40512ce
drwxr-xr-x root root Mar : 0fd3b6e125673affc1f348cdb0c071782bde7d7ab4748bea3e30bc2d1d7ea7ab
......................

一个容器的数据对应这其中的一个或多个目录 。其中目录名的前几位就是容器的ID,通过这知道容器和目录的对应关系。
注意这个目录需要用root用户执行。

具体的操作步骤如下:

1、设置当前目录  cd /var/lib/docker/aufs/diff/

2、查找要修改的配置文件所在容器中的位置

find ./ -name 'nginx.conf'

假设我们要修改的是 nginx.conf文件,可能的结果如:

./eb531927ba243b59f0db78848809423f7debe148a9ef972088ea41be73c2aa81/etc/nginx/nginx.conf
./4975acfb30f3f729ac08a9c1bd642f735298a47057fc7c414c7479696b80f36a/etc/nginx/nginx.conf
./6fce3cb01e3c9b8cc4e1fc270c012b1d0b666fe49ad8b6bededb99e295c5da4c/etc/nginx/nginx.conf

这时我们通过比较要修改容器的ID 与上面几个目录的前缀,就知道是要修改哪个配置文件了。

如果我们进入类似 4975acfb30f3f729ac08a9c1bd642f735298a47057fc7c414c7479696b80f36a 目录,会发现这个目录下的内容和linux跟目录下的目录结构非常类似。我们可以找到相关的配置文件直接修改。

说明:因为一个容器的文件系统包括不可修改的镜像层和可修改的读写层,这个目录下其实就是读写层的内容。

3、修改完毕后用 docker start 容器名/ID  即可重新启动容器。

最新文章

  1. caroufredsel 参数
  2. 简单的java socket 示例
  3. C#--访问修饰符
  4. EHCACHE采用分布需要注意的地方
  5. VBS基础篇 - 条件语句
  6. CStdioFile 写文件
  7. Python: 设计模式 之 工厂模式例(2)(神奇的Python)
  8. tomcat 发布webService
  9. java写文件时,输出不完整的原因以及解决方法
  10. Redis简介三
  11. JSR330: DI
  12. 原生JS实现Ajax及Ajax的跨域请求
  13. 持续更新:从零开始的php学习生活
  14. 网站开发进阶(十六)错误提示:Multiple annotations found at this line:- basePath cannot be resolved to a variable
  15. BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
  16. Golang之变量去哪儿
  17. Ajax请求中的async:false/true(同步/异步)的作用
  18. UGUI ScrollRect 滑动
  19. (链表 双指针) leetcode 142. Linked List Cycle II
  20. 今天终于想明白为什么java包要倒着写

热门文章

  1. 【Kill】两条Linux命令彻底杀死Oracle
  2. 射频识别技术漫谈(15)——Mifare1的安全性及7字节序列号M1卡
  3. python2.6升级到2.7
  4. libCurl的文件上传
  5. tomcat的webappclassloader中一个奇怪的异常信息
  6. BFG
  7. JavaSE学习总结第16天_集合框架2
  8. BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )
  9. linux系统调用和库函数调用的区别(转)
  10. Introduction to REST #Reprinted#