Docker不能綁定靜態(tài)的外網(wǎng)固定ip的問題及解決辦法
前段時間,我一直在研究如何給Docker分配靜態(tài)ip,主要的用途是讓thrift進(jìn)來和出來都走一個ip,還有就是爬蟲可以獨立ip地址,這樣就很好的實現(xiàn)了爬蟲的多ip方式… 但是隨著nginx tcp的加入和開發(fā)了一個基于Python socket的ip輪詢訪問模塊解決了這兩個問題… 當(dāng)然也不能因為這兩問題,就丟棄這問題了….
在Docker run的時候,咱們可以添加-p參數(shù)來控制他的source來源ip。 下面的命令,對外來說,開放了192.168.1.200:9200的端口… 但是我們不僅僅滿與此。 docker run -p 端口的實現(xiàn),就是借用iptables來實現(xiàn)的… 我們iptables -t nat -L 的時候,就能看到docker幫我做好的nat關(guān)系…. docker做iptables的prerouting的時候,是追加了名叫docker的自定義鏈條… 差點又跑題了,如果是橋接模式,那么就致使當(dāng)我們?nèi)绻萜骼锩娑丝诘淖儎颖容^大的時候,那么就會造成改動端口映射的操作的復(fù)雜性,需要每次的變更,做一個iptables prerouting映射… 但是如果你選擇HOST網(wǎng)絡(luò)模式,那么你又不好確定你的app綁定的是哪個ip地址,不是什么服務(wù)端都支持bind ip地址的… 有些搓蛋的服務(wù)端就默認(rèn)綁定第一個ip地址… 這個時候,為docker容器分配一個獨立的靜態(tài)ip地址就顯得很有必要了…. 反正就一個ip地址,你可勁的折騰…..
Python docker run -it -p 192.168.1.200:9200:9200 redis_cluster 9200 Python root@ubuntu:~# iptables -t nat -L -n ChainPREROUTING(policyACCEPT) target protoptsource destination DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPEmatchdst-typeLOCAL ChainINPUT(policyACCEPT) target protoptsource destination ChainOUTPUT(policyACCEPT) target protoptsource destination DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPEmatchdst-typeLOCAL ChainPOSTROUTING(policyACCEPT) target protoptsource destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 MASQUERADE tcp -- 172.17.0.1 172.17.0.1 tcpdpt:9200 ChainDOCKER(2references) target protoptsource destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcpdpt:9200to:172.17.0.1:9200
需要注意的是,docker run創(chuàng)建一個容器的時候,一定要把他的網(wǎng)卡模式改成docker的none… 一般在docker自定義網(wǎng)絡(luò)的時候,都會把–net=none,再通過后期的一頓折騰讓docker的容器有網(wǎng)絡(luò)…..
接著,我如果想給容器,徹底的分配一個外網(wǎng)ip,或者管理ip,反正就一個靜態(tài)的獨立ip,怎么破? 用pipework是可以實現(xiàn)的。 但這東西稍復(fù)雜些,我們就先用系統(tǒng)的ip netns來解決…. 通過inspect我們知道了他的state pid .
Python
root@ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 232621e9e9fb redis_cluster "/app/manage.sh 9000 41 minutes ago Up 41 minutes agitated_blackwell root@ubuntu:~# docker inspect -f "{{.State.Pid}}" 232621e9e9fb 4777 root@ubuntu:~# pid=4777
那么我們來開始綁定靜態(tài)ip地址,先別看原理,暫時照著做…
Python
mkdir-p/var/run/netns ln-s/proc/$pid/ns/net/var/run/netns/$pidiplinkaddAtypevethpeernameB brctladdifdocker0A iplinksetAup iplinksetBnetns$pid ipnetnsexec$pidiplinksetdevBnameeth0 ipnetnsexec$pidiplinkseteth0up ipnetnsexec$pidipaddradd192.168.1.200/24deveth0 ipnetnsexec$pidiprouteadddefaultvia192.168.1.1
這些都結(jié)束了后,我們會發(fā)現(xiàn)容器的網(wǎng)卡里面從一個lo,多出一個eth0網(wǎng)卡,網(wǎng)卡的ip地址正是我們剛才綁定的192.168.1.200
Python
bash-4.1# ip a 1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN link/loopback00:00:00:00:00:00brd00:00:00:00:00:00 inet127.0.0.1/8scopehostlo valid_lftforeverpreferred_lftforever inet6::1/128scopehost valid_lftforeverpreferred_lftforever 22:eth0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000 link/etherca:aa:87:05:c9:5abrdff:ff:ff:ff:ff:ff inet192.168.1.200/24scopeglobaleth0 valid_lftforeverpreferred_lftforever inet6fe80::c8aa:87ff:fe05:c95a/64scopelink valid_lftforeverpreferred_lftforever bash-4.1#
到此為止,docker綁定固定的靜態(tài)ip的方法已經(jīng)說明白了…. 看了文章后,會發(fā)現(xiàn)docker綁定ip是比較的簡單.. docker的網(wǎng)絡(luò)是不怎么好理解的,這兩天我多專供下docker分配ip的整個流程 (docker iptables)
以上所述是小編給大家介紹的Docker不能綁定靜態(tài)的外網(wǎng)固定ip的問題及解決辦法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
docker安裝nginx實現(xiàn)對springboot項目的負(fù)載均衡的操作方法
這篇文章主要介紹了docker安裝nginx實現(xiàn)對springboot項目的負(fù)載均衡的操作方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06使用DockerFile構(gòu)建docker鏡像掛載目錄,數(shù)據(jù)卷同步問題
這篇文章主要介紹了使用DockerFile構(gòu)建docker鏡像掛載目錄,數(shù)據(jù)卷同步問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Docker安裝wordpress并配置數(shù)據(jù)庫超詳細(xì)介紹版
安裝WordPress是一項常見的任務(wù),使用Docker可以使這個過程更加簡單和可靠,下面這篇文章主要給大家介紹了關(guān)于Docker安裝wordpress并配置數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-11-11Docker Desktop更改鏡像存儲位置的實現(xiàn)
本文主要主要介紹了Docker Desktop更改鏡像存儲位置的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06