docker是一個非常流行的開源容器化引擎,因其可快速搭建、易于管理、保證應(yīng)用程序的可移植性,而在開發(fā)與生產(chǎn)環(huán)境中廣泛應(yīng)用。但是在使用docker搭建一個web應(yīng)用時,出現(xiàn)端口無法通信的情況并不少見。今天我們就來分析一下docker搭建的web端口不通的原因及解決方案。
一、原因分析
- 防火墻原因
linux系統(tǒng)中默認開啟了iptables防火墻服務(wù),如果你沒有配置過,防火墻可能會阻止你的docker容器與外部網(wǎng)絡(luò)通信。因此,可以通過關(guān)閉防火墻或者添加規(guī)則的方式使得Docker可以順利的與外部網(wǎng)絡(luò)進行通信。 下面是參考命令:
關(guān)閉防火墻: $ sudo service iptables stop
開放端口: $ sudo iptables -A input -p tcp –dport 80 -j ACCEPT
- 端口映射的原因
Docker啟動容器后,通過端口映射將容器內(nèi)的端口映射到主機上的一個端口,以實現(xiàn)容器與外部網(wǎng)絡(luò)的通信。默認情況下,容器的網(wǎng)絡(luò)是獨立的,僅對內(nèi)部進行通信。因此,如果你沒有對容器內(nèi)部的端口進行映射,可能會導(dǎo)致端口無法通信的問題。下面是默認映射端口的方式:
$ docker run -p 80:80 image-name
- 容器網(wǎng)絡(luò)問題
Docker中有三種網(wǎng)絡(luò)驅(qū)動,分別是bridge、host和none。在使用Docker容器時,默認使用的是bridge網(wǎng)絡(luò)驅(qū)動,使其形成一個基于NAT網(wǎng)絡(luò)的虛擬網(wǎng)絡(luò)。如果你的容器無法訪問外部網(wǎng)絡(luò),可能就需要檢查你的網(wǎng)絡(luò)驅(qū)動是否選擇正確。可以使用如下命令查看網(wǎng)絡(luò)驅(qū)動:
$ docker network ls
- 容器IP地址問題
Docker啟動容器后,會根據(jù)網(wǎng)絡(luò)驅(qū)動為其分配一個唯一的IP地址。如果你的容器IP地址無法訪問外部網(wǎng)絡(luò),就需要檢查與之相連的網(wǎng)卡是否正確配置。在如下例子中,我們可以看到容器的IP地址是172.17.0.2:
$ docker inspect container-name | grep IPAddress
二、解決方法
- 確認端口映射是否正確
可以使用如下方式查看端口的映射關(guān)系:
$ docker port container-name
輸出的內(nèi)容應(yīng)該為:
80/tcp -> 0.0.0.0:80
上述命令可以查看容器內(nèi)部的端口映射到宿主機上的端口。
- 確認網(wǎng)絡(luò)驅(qū)動是否選擇正確
可以使用如下方式查看容器使用的網(wǎng)絡(luò)類型:
$ docker inspect container-name | grep NetworkMode
如果輸出為bridge,則表示網(wǎng)絡(luò)驅(qū)動已選擇正確。如果輸出為host或none,可以按照下面的方式進行更改:
更改網(wǎng)絡(luò)類型為bridge:
$ docker run –network bridge image-name
- 確認防火墻是否關(guān)閉或規(guī)則設(shè)置正確
可以在運行Docker命令時,增加一個–privileged參數(shù),使得Docker容器擁有比較高的權(quán)限:
$ docker run –privileged image-name
- 確認容器IP地址是否正確
可以使用如下命令查看容器IP地址:
$ docker inspect container-name | grep IPAddress
如果你的容器IP地址改變了,可以使用如下命令重新指定一個唯一的IP地址:
$ docker run –ip 172.17.0.10 image-name
總之,當你的Docker啟動的Web應(yīng)用端口無法通信時,首先應(yīng)該排查是哪種原因?qū)е铝诉@種情況,然后通過相應(yīng)的方式去解決問題。 希望這篇文章能夠幫助到大家。