Docker容器啟動失敗的常見原因分析及解決方法
我們在開發(fā)部署的時候,用 Docker 打包環(huán)境,理論上是“我裝好了你就能跑”。但理想很豐滿,現(xiàn)實往往一 docker run
下去就翻車了。
今天來盤點一下我實際工作中經(jīng)常遇到的 Docker 容器啟動失敗的常見原因,順便給點 debug 的小技巧,能讓你從“容器起不來”到“穩(wěn)穩(wěn)跑起來”。
常見場景 1:鏡像構(gòu)建失敗,容器壓根沒起來
很多人以為“容器起不來”就是 docker run 的問題,其實很多時候是在 docker build 階段就翻車了。
典型報錯:
failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /path/to/Dockerfile: no such file or directory
排查辦法:
檢查
Dockerfile
路徑是否正確;docker build
命令中-f
指定的路徑是不是錯了;COPY
和ADD
的源路徑是不是寫對了,尤其是“相對路徑”。
小貼士:
如果你在構(gòu)建時卡住了,可以加上 --progress=plain
和 --no-cache
看得更清楚一點:
docker build --progress=plain --no-cache -t myimage .
常見場景 2:容器秒退,沒有主進程 or 主進程掛了
這個是真·經(jīng)典問題。
典型表現(xiàn):
容器剛啟動立刻就退出了。比如:
docker run myimage # 幾秒后 docker ps -a # 狀態(tài)為 Exited (1)
原因分析:
沒有前臺進程。容器是以主進程是否在運行為準(zhǔn)的,如果你在 Dockerfile 里
CMD ["nginx"]
啟了個守護進程(daemon),容器就直接退出了。程序一啟動就報錯,直接崩了。
怎么查:
docker logs <container-id>
如果啥都沒有,或者一眨眼就退了,可以加個 -it
,手動起個 bash 看:
docker run -it myimage /bin/bash
常見場景 3:端口沖突 / 未暴露端口
報錯不一定明確:
有時候你在宿主機開了某個端口(比如本地的 nginx 占了 80),你再用 -p 80:80
就起不來了。
解決辦法:
用
docker ps
看看是不是端口已經(jīng)被別的容器占用了;改用別的端口,比如:
docker run -p 8080:80 myimage
常見場景 4:環(huán)境變量配置錯誤
比如你 Dockerfile 里寫了:
ENV DB_HOST=$DB_HOST
抱歉,這個語法會把 $DB_HOST
當(dāng)成字面量(字符串),并不會替換成你主機環(huán)境里的變量。
正確姿勢:
ARG DB_HOST ENV DB_HOST=${DB_HOST}
然后 build 時傳參:
docker build --build-arg DB_HOST=127.0.0.1 -t myimage .
或者更簡單地,在 run 的時候用 -e
指定:
docker run -e DB_HOST=127.0.0.1 myimage
常見場景 5:文件權(quán)限問題
如果你在容器里掛載了宿主機的文件夾:
docker run -v /my/data:/app/data myimage
結(jié)果程序直接報權(quán)限錯誤,比如:
Permission denied: '/app/data/output.log'
原因:
容器里運行的用戶沒權(quán)限寫這個掛載目錄。
解決方法:
用
chown
改下宿主機的目錄權(quán)限;或者加上
--user
參數(shù)運行容器:
docker run --user $(id -u):$(id -g) -v /my/data:/app/data myimage
最后一個大招:用 --entrypoint 開 bash 進去排查
如果你啥都試了都沒搞明白,那最后一個招就是手動進去看:
docker run --entrypoint /bin/bash -it myimage
進去看看有沒有路徑寫錯,權(quán)限不對,環(huán)境變量沒設(shè)之類的,通常都能找到線索。
小結(jié)
場景 | 排查思路 |
---|---|
鏡像構(gòu)建失敗 | 看 Dockerfile 路徑、COPY 路徑 |
容器秒退 | docker logs ,看主進程是否正常運行 |
端口沖突 | 換端口 or 檢查是否被占用 |
環(huán)境變量問題 | 檢查是否正確設(shè)置 ENV / ARG |
文件權(quán)限問題 | 用 --user 或調(diào)整掛載目錄權(quán)限 |
看不出問題 | 用 --entrypoint /bin/bash 手動排查 |
寫到這里你應(yīng)該對“容器為啥起不來”有些眉目了??傊鄤邮?、多看 log、多試試 -it
進去看現(xiàn)場,慢慢你就會像老中醫(yī)一樣一眼看出問題所在了。
以上就是Docker容器啟動失敗的常見原因分析及解決方法的詳細內(nèi)容,更多關(guān)于Docker容器啟動失敗原因的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker安裝Jenkins-2.249.3-1.1的詳細過程
這篇文章主要介紹了Docker安裝Jenkins-2.249.3-1.1,通過編寫docke安裝腳本來實現(xiàn)安裝目的,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10