一個奇葩的docker啓動服務故常排查

環境:

    os:=====>centos 7.4
    docker:=====>1.13.1
    docker-compose:=====>1.23.2
    image:=====>php:7.2-apache
    image:=====>mysql:5.7

問題起因:

公司需要建立官網站點,使用wordpress服務,藉助docker的可移植性,自己封裝了一組運行環境。將運行服務環境結合docker-compose 做了標準化,以後再需要其它博客站點隨時可以拉起一組環境,簡單、方便、快。
啓動第一組環境時很順利,啓動站點初始化、插件安裝,很快就順利完成了(第1臺主機)。很Happy!但是在按照同樣的環境方法在另外一臺主機啓動另外一套環境時,遇到了一個看似很簡單,又略坑的問題。使用同樣的docker-compose文件啓動wordpress 環境,發現wordpress 服務無法啓動,查看日誌,發現打印錯誤日誌如下:

docker-compose :

https://blog.51cto.com/michaelkang/2362202

報錯內容:

2019/5/23 下午9:51:18AH00534: apache2: Configuration error: No MPM loaded.
2019/5/23 下午9:51:28[23-May-2019 13:51:28 UTC] PHP Warning:  Module 'ldap' already loaded in 
。。。。。。。。  略  。。。。。。。。。。
2019/5/23 下午9:51:28[23-May-2019 13:51:28 UTC] PHP Warning:  Module 'ldap' already loaded in Unknown on line 0
2019/5/23 下午9:51:28AH00534: apache2: Configuration error: No MPM loaded.
       PHP Warning:  Module 'ldap' already loaded in Unknown on line 0

開始排查

1

初步看到報錯內容,有點懷疑拉起的鏡像有問題,docker最牛B的特性就是可移植性,Image 沒問題的話,不可能再起一套環境配置就報錯啊!此時爲了排查這個問題,修改了一下ci腳本,重新觸發了一次構建,除了重新構建鏡像還把鏡像存儲到了另外一個docker registry倉庫。然後修改compose 文件修改拉取鏡像地址爲新的鏡像倉庫地址。然後再次啓動wordpress環境,結果還是無法啓動。報錯核心內容如下:

2019/5/23 下午9:51:18AH00534: apache2: Configuration error: No MPM loaded.
2019/5/23 下午9:51:28[23-May-2019 13:51:28 UTC] PHP Warning:  Module 'ldap' already loaded in 

還是老樣子 !!!

2

此時有點動搖,有點懷疑構建鏡像是修改的配置文件有問題,就登陸到之前啓動的wordpress 鏡像內部,逐個覈對配置,重點查看了 apache 的MPM loaded 配置文件,竟然鏡像裏面的配置都是對的。深吸一口涼氣。。。。。。

3

懷疑這臺主機的docker環境配置或者docker版本有問題,開始與能夠成功啓動的服務主機的系統配置做對比,現在的主機跟已成功啓動環境的主機配置略有不同,開始執行相關操作,將系統內核,docker版本,系統配置等等都搞成一致的。然後再次啓動服務。然後再次啓動服務,wordpress 服務依然無法啓動,報錯日誌依舊相同。 ( ⊙ o ⊙ )啊!

4

懷疑docker存儲有問題目錄有問題 ,刪除所有本機已經下載images,重新啓動還是報錯,還是報錯,不行。。。。

5

再殘忍一點,
刪除docker軟件包,然後再刪除docker的存儲目錄,
重新安裝配置docker,再次啓動,還是不行!對docker 鏡像的可移植特性都快產生懷疑了。。。。

6

新建一個虛擬機(第3臺主機)使用同樣的配置再次啓動環境,能夠成功啓動,排除鏡像問題。但是爲什麼只是在第2臺主機無法正常啓動那?

7

再次回到問題節點(第2臺主機),繼續破案,換一組別的服務,使用docker-compose 啓動,服務啓動正常。。。。。 這個如何是好?
爲何只有我們的鏡像?在這臺主機啓動服務有問題?查了一寫資料有些說apache 新特性導致的,有的說修改衝編譯的等等,都沒有徹底解決問題。

8

重點查docker 存儲方面的資料,發現有資料說是docker 使用的overlay存儲,可能出這種問題,可以將docker 的存儲改爲 devicemapper 類型。好吧,試一次。

1:Stop docker
2:備份 /var/lib/docker 目錄(按需)
3:
vi /etc/sysconfig/docker-storage
修改內容爲:
DOCKER_STORAGE_OPTIONS="--storage-driver overlay2 "
如下:
DOCKER_STORAGE_OPTIONS="--storage-driver devicemapper "
4:
然後啓動 docker服務
5:然後使用compose 啓動服務,耐心等待。。。。。
wordpress 服務啓動成功了!!!!!!有一個問題,爲什麼只有使用這麼老的docker存儲驅動才行 ?

9

後面去docker 官網看了一些關於存儲的介紹信息,其實docker 存儲驅動配置有許多細節要注意。詳細可以下看下官網介紹:

https://docs.docker.com/v17.03/engine/userguide/storagedriver/overlayfs-driver/
https://docs.docker.com/storage/storagedriver/overlayfs-driver/

10

收一下思路,以上是問題排查的大至過程,以上問題排查過程並非安裝文檔順序排查,另外還有一些瑣碎排查確認沒有進行描述。本次問題確實由於docker存儲驅動引起。下面簡要總結一下:

故障排查總結,docker使用存儲驅動注意事項:

1:RHEL或CentOS 使用新的docker存儲驅動(overlay or overlay2),需要升級系統內核版本到3.10.0-514以上版本。
2:docker 官方建議,在 docker-ce 17.06.02及以上的版本使用 overlay2,以及在docker-ce的版本,也使用 overlay2。而overlay 雖然在docker-ce 版本中是支持的,但是並不推薦。
3:Docker數據存儲,強烈建議另外準備一塊磁盤或者分區;
4:如果使用XFS格式文件系統,在格式化爲xfs的時,必須,注意必須!指定ftype=1 (開啓 d_type 特性),否則可能出現未知問題!

參考文檔地址:

https://blog.51cto.com/michaelkang/2399880

5:Docker 使用overlay or overlay2 一定驗證通過 docker info 驗證信息如下:

$ docker info

Storage Driver: overlay2

 Backing Filesystem: xfs  <=== 重點關注對象
 Supports d_type: true    <=== 重點關注對象

 Native Overlay Diff: true
<output truncated>

如何檢測當前的文件系統,是否支持 d_type ?

$ xfs_info /

meta-data=/dev/sda1   isize=256    agcount=4, agsize=3276736 blks
    .........................
data     =                       bsize=4096   blocks=13106944, imaxpct=25
    .........................
                 =version 2           bsize=4096   ascii-ci=0        ftype=1   《===重點關注對象

重點關注對象解釋

xfs文件系統的 d_type是什麼

d_type 是 Linux 內核的一個術語,表示 “目錄條目類型”,而目錄條目,其實是文件系統上目錄信息的一個數據結構。d_type,就是這個數據結構的一個字段,這個字段用來表示文件的類型,是文件,還是管道,還是目錄還是套接字等。
d_type 從 Linux 2.6 內核開始就已經支持了,只不過雖然 Linux 內核雖然支持,但有些文件系統實現了 d_type,而有些,沒有實現,有些是選擇性的實現,也就是需要用戶自己用額外的參數來決定是否開啓d_type的支持。

爲什麼docker在overlay2(xfs文件系統)需要d_type

不論是 overlay,還是 overlay2,它們的底層文件系統都是 overlayfs 文件系統。而 overlayfs 文件系統,就會用到 d_type 這個東西用來文件的操作是被正確的處理了。換句話說,docker只要使用 overlay 或者 overlay2,就等於在用 overlayfs,也就一定會用到 d_type。

如果在不支持 d_type 的 overlay/overlay 驅動下使用docker,會出現什麼問題?

可能出現 docker在操作文件的時候,可能會遇到一些錯誤,比如: 無法刪除某些目錄或文件,設置文件或目錄的權限或用戶失敗、運行的docker 鏡像目錄文件莫名奇妙的丟失,等等。這些都是不可預料的錯誤。舉個具體的場景,就是,docker構建的時候,可能在構建過程中,刪除文件等操作失敗,導致構建停止。

結尾:

我們通過上面的方法進行驗證,發現只要是使用xfs文件系統的,格式化的時候沒有開啓 d_type 特性的,wordpress 鏡像都啓動報錯。另外回顧在在日常工作期間也發現一些docker文件異常的現象,所在的主機基本存在這個問題。這裏面還有最後一個坑,就是搶了推薦哪一個獨立分區給docker使用,可以按需格式化docker分區,如果docker使用的是根分區,系統都要重裝了,動靜略大。

參考文檔:

https://help.nextcloud.com/t/docker-container-fails-with-ah00534-apache2-configuration-error-no-mpm-loaded/29491
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章