這篇博客主要是記錄一下docker配置問題的筆記,不一定適合所有配置,各位如果按照網上大多數人的配置配置完之後還是不能正常實現端口映射,可以將以下配置作爲參考。因爲之前我在按照網上許多教程配置的時候遇到許多問題,最終就是不能訪問docker內部服務,經過一番摸索得出,記錄一下,以後配置可作參考,也希望幫到更多人。
docker端口映射,百度之後一大堆都是說在docker run的時候通過-p設置端口映射,這種方法也就一句話就能解決,如果想用這種方法直接百度即可。
現在我想說的是當docker已經創建之後,沒有綁定端口,如何通過配置iptables,設置docker端口映射,使外網能夠訪問服務器內部docker運行的服務。前提是需要已經安裝iptables。此處只講如何配置,可以通過百度iptables配置docker端口映射查看許多大牛講解原理。
首先,sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' docker_name,docker_name就是自己的容器名或者容器id,查看自己的docker ip,假設是172.17.0.2,下文的docker ip就用這個ip,根據自己的輸出自己做調整。
第二,輸入sudo iptables -nvxL,看一下chain docker裏面有沒有:
ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:port_num
port_number就是對應的服務器端口,之前沒有配置過的情況下一般沒有。執行:
sudo iptables -A DOCKER -d 172.17.0.2 -j ACCEPT -p tcp --dport port_number ! -i docker0 -o docker0
port_number是想要映射的主機端口。在sudo iptable -nvxL查看配置之後的結果,可見多了一條規則,可以發現設置的參數對應爲:-A對應在哪個Chain append規則,-d對應destination,-j對應target,--dport對應端口號,-i對應input,-o對應output。以下類似。
第三,輸入sudo iptables -t nat -nvxL,查看Chain POSTROUTING ,如果沒有配置過,Chain POSTROUTING 下也沒有相關的規則:
MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:5001
執行:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE -s 172.17.0.2 -d 172.17.0.2 -p tcp --dport11000
輸入sudo iptables -t nat -nvxL,可以看到Chain POSTROUTING中加入了配置的規則。但是後面的Chain DOCKER還是少一條規則:
DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:port_number to:172.17.0.2:docker_port
注意!此處的Chain DOCKER是在輸入sudo iptables -t nat -nvxL之後查看的,不是輸入sudo iptables -nvxL之後查看的,此處設置的是NAT規則,不要混淆。docker_port對應docker上運行的服務的端口。執行:
sudo iptables -t nat -A DOCKER -j DNAT -p tcp ! -i docker0 -s 0.0.0.0/0 -d 0.0.0.0/0 --dport port_number --to 172.17.0.2:docker_port
再次sudo iptables -t nat -nvxL,可以發現規則已經添加上去。
如果配置過程中規則配置錯誤,可以sudo iptables -nxvL --line-number(或者sudo iptables -t nat -nxvL --line-number)查看錯誤的規則和這個規則對應的number,通過sudo iptables -D chain_name number(或者sudo iptables -t nat -D chain_name number)刪除規則,再重新配置,chain_name就是DOCKER或者POSTOUTING,具體看你的錯誤規則在那個chain下面,number就是上面說的錯誤規則對應的number,是否加-t nat就看是否設置的是NAT規則。
好了,其實配置也主要這幾步,測試可行