寫在前面:
本文主要講述了docker創(chuàng)建成功但是無法連接的原因和解決方案,是一篇針對docker初學(xué)者的實(shí)踐文章。文章中的操作和解決方案都是基于ubuntu系統(tǒng)環(huán)境的。
在使用docker的過程中,有一些情況即使你的容器創(chuàng)建成功了,但是無法連接。這種情況往往讓人很苦惱,找不到問題的所在。本文將通過一個(gè)實(shí)際案例,為大家講解docker創(chuàng)建成功卻無法連接的原因及解決方案。
案例描述:
我們在本地電腦上,使用docker創(chuàng)建了一個(gè)nginx容器,訪問它的時(shí)候卻無法連接成功。
步驟如下:
- 在Ubuntu系統(tǒng)上安裝docker
在命令行輸入如下指令:
sudo apt-get install docker.io
安裝完成后,使用如下指令啟動(dòng)docker:
sudo systemctl start docker
- 在docker上創(chuàng)建nginx容器
在命令行輸入如下指令:
sudo docker run –name mynginx -p 80:80 -d nginx
這個(gè)命令的意思是:使用nginx鏡像創(chuàng)建一個(gè)新容器,容器的名稱為mynginx,將80端口映射到本地的80端口上,并通過后臺方式運(yùn)行。
- 驗(yàn)證容器是否創(chuàng)建成功
在命令行輸入如下指令:
sudo docker ps
如果顯示如下內(nèi)容,表示容器創(chuàng)建成功:
CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ?NAMES
aaed7c1bcccf ? ? ? ?nginx ? ? ? ? ? ? ? “/docker-entrypoint.…” ? 21 seconds ago ? ? ?Up 20 seconds ? ? ? 0.0.0.0:80->80/tcp ? mynginx
- 在瀏覽器中訪問nginx
在瀏覽器中輸入localhost,或者127.0.0.1,即可看到nginx的歡迎界面。
但是,有些情況會(huì)出現(xiàn)訪問不到nginx的情況。
問題分析:
首先,我們需要確認(rèn)一下問題出在哪里。
- 查看系統(tǒng)防火墻配置
Ubuntu系統(tǒng)的默認(rèn)防火墻工具是ufw,可以使用如下指令查看其配置:
sudo ufw status
如果輸出結(jié)果如下,則表示系統(tǒng)防火墻是開啟的:
Status: active
To ? ? ? ? ? ? ? ? ? ? ? ? Action ? ? ?From
22/tcp ? ? ? ? ? ? ? ? ? ? ALLOW ? ? ? Anywhere
80/tcp ? ? ? ? ? ? ? ? ? ? ALLOW ? ? ? Anywhere
22/tcp (v6) ? ? ? ? ? ? ? ?ALLOW ? ? ? Anywhere (v6)
80/tcp (v6) ? ? ? ? ? ? ? ?ALLOW ? ? ? Anywhere (v6)
這時(shí)候,我們需要確認(rèn)一下80端口是否已經(jīng)被允許通過系統(tǒng)防火墻。通過上面的輸出可以看到,80端口已經(jīng)被允許訪問,因此這個(gè)不是問題所在。
- 網(wǎng)絡(luò)連接狀態(tài)
如果我們使用ping命令查看一下127.0.0.1的網(wǎng)絡(luò)連接狀態(tài),會(huì)發(fā)現(xiàn)出現(xiàn)如下錯(cuò)誤提示:
ping: connect: Network is unreachable
這說明網(wǎng)絡(luò)連接問題出在這里。繼續(xù)排查原因。
- 本地網(wǎng)絡(luò)地址是否正確
嘗試連接nginx容器的本地網(wǎng)絡(luò)地址,因?yàn)槲覀儎?chuàng)建容器時(shí),將80端口映射到了本地的80端口上,因此我們需要使用容器的本地網(wǎng)絡(luò)地址進(jìn)行訪問。可以使用如下指令查看本地容器地址:
sudo docker inspect mynginx | grep IPAddress
響應(yīng)結(jié)果應(yīng)該類似于:
“IPAddress”: “172.17.0.2”,
嘗試在瀏覽器中訪問172.17.0.2,可以看到nginx歡迎頁面。說明此時(shí)端口映射和防火墻規(guī)則都是正確的。問題出在本地網(wǎng)絡(luò)地址設(shè)置上。
解決方案:
修改nginx配置文件,在配置文件中添加一個(gè)server節(jié)點(diǎn),hostname為本機(jī)IP地址,如下:
server {
listen 80 default_server; listen [::]:80 default_server; server_name localhost; root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } # 新增的本機(jī)IP節(jié)點(diǎn) server { listen 80; listen [::]:80; server_name <本機(jī)IP>; root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
}
修改完成后,重新加載nginx配置文件:
sudo nginx -s reload
再次訪問localhost或127.0.0.1,在瀏覽器中就可以看到nginx的歡迎頁面了。
總結(jié):
docker創(chuàng)建成功卻無法連接的問題,可能與網(wǎng)絡(luò)連接狀態(tài)、系統(tǒng)防火墻配置、本地網(wǎng)絡(luò)地址設(shè)置等有關(guān)。通過排查問題所在,并采取相應(yīng)的解決方案,可以順利解決。在今后的docker使用過程中,遇到問題不要慌張,要靜下心來,細(xì)致的查看日志,確定問題所在,再制定處理方案,才能更好的掌握docker技術(shù),提高開發(fā)效率。