今日內網斷電後,有一臺機器沒有如往常一樣起來,該伺服器是docke上的一個容器,然後登入docker宿主機,開始問題分析及解決:

 

一、尋找問題

1、啟動iframe-test機器

root@ubuntu:~#docker start iframe-test

iframe-test

2、發現沒有容器程式

root@ubuntu:~#docker ps |grep iframe-test

3、檢視日誌,發現是nginx配置有問題,導致中斷。

root@ubuntu:~#
docker logs iframe-test

Startingnginx: Starting periodic command scheduler: cron.

nginx:[emerg] unexpected end of file, expecting “;” or “}” in/etc/nginx/nginx.conf:21

nginx:configuration file /etc/nginx/nginx.conf test failed

 

二、思考解決方法

問題原因找到,就是nginx檔案檢測不通過,導致中斷。

解決思路暫有兩個:

   方法一:把這個問題容器用docker commit提交到一個新的映象,然後用docker run -i -d基於新映象執行一個臨時終端進去改變配置檔案,然後把臨時終端的id提交到一個新的映象,然後在基於新的映象重新啟動容器。(這個方法步驟多,而且提交了新的映象,對於後續維護增加了複雜性)

   方法二:直接改變容器裡的配置檔案,不需要新提交映象。但是這個容器是宕狀態,怎麼改呢?下面進行詳細說明。在此多謝網友Lingx是供解決思路。

 

三、修改當機容器配置

所有的容器資料都存在/var/lib/docker/aufs/diff/路徑下。下面容器ID目錄,以init結尾的是放配置檔案的,有/etc/host、reselv.conf,/dev等。另一個是放的檔案目錄,比如/home/var/及自己安裝的服務等等,aufs需要核心3.10以上的支援

 

1、檢視容器id

root@ubuntu:~#docker ps -a|grep iframe-test

fa02f8084b63        debian06-base:latest  

 

2、查詢nginx.conf配置檔案路徑

root@ubuntu:~#find / -name `nginx.conf`

/root/nginx.conf

/var/lib/docker/aufs/diff/7c7b3438586e0653cdca7977a4f889cfdca300f008771462f8a2e6e9d3bc5b84/etc/nginx/nginx.conf

/var/lib/docker/aufs/diff/6bc6a9a5aeb59e19cae8bb78daa481cc465051069c7854528cbfdb3c9c1f2bfb/etc/nginx/nginx.conf

/var/lib/docker/aufs/diff/c7b6b87cfda72701229eebca868eb047aa01c255b62e56ad223dc75396c584e4/etc/nginx/nginx.conf

/var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456/etc/nginx/nginx.conf

 

3、進入對應容器id的目錄,修改問題檔案

root@ubuntu:cd /var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456

執行ls命令,容器的根目錄展現在面前,是不是很熟悉?

root@ubuntu:/var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456#ls

etc  root run  srv  tmp usr  var

接下來找到這個容器裡面nginx.conf的語法錯誤處修改。

 

4、修改後啟動容器

root@ubuntu:~#
docker start iframe-test

root@ubuntu:~# docker ps |grep iframe-test

fa02f8084b63        debian06-base:latest        “/etc/rc.local”     6 weeks ago         Up 13 minutes       10.18.103.2:22->22/tcp,10.18.103.2:80->80/tcp, 10.18.103.2:443->443/tcp,10.18.103.2:3306->3306/tcp, 10.18.103.2:6379->6379/tcp,10.18.103.2:6381->6381/tcp, 10.18.103.2:8000->8000/tcp,10.18.103.2:8888->8888/tcp                                                                                                                                  iframe-test 

 

容器啟動成功,問題解決。以後再也不用擔心docker容器壞掉,導致資料丟失了。

我的其它docker相關文章:

運維人員的解放—-Docker快速部署

http://yangrong.blog.51cto.com/6945369/1551327

docker容器埠IP規劃及埠動態擴容

http://yangrong.blog.51cto.com/6945369/1582184