1. 程式人生 > >docker容器埠IP規劃及埠動態擴容

docker容器埠IP規劃及埠動態擴容

     docker容器一旦啟動,引數就無法改變,生產環境中最常變的就是埠對映,為了解決這個問題,那麼首先就要規劃好,本文列出了兩種埠規劃方案,如果後續維護中出現了要增加埠對映的場景,本文也給出了動態埠對映擴容方案。

1、單IP多容器對映規劃方案

    此種環境適用只有單個IP環境下,如雲主機等。

1.1 埠對映規劃表格:

規劃不同的埠段,對映到容器從而對外提供服務。

主機名稱

ssh對映

mysql對映

nginx對映

redis對映

redis-test

51000

22

51001

3306

51004

80

51002

6379

51005

8000

51003

6381

51006

8888

scheduler-test

52000

22

52001

3306

52004

80

52002

6379

52005

8888

52003

6381

52006

8000

1.2 對應容器啟動命令:

    docker run -h="redis-test"  --name redis-test -d -p 51000:22 -p 51001:3306   -p 51003:6379 -p 51004:6381  -p 51005:80 -p  51006:8000 -p 51007:8888   debian02 /etc/rc.local

    docker run -h="salt_zabbix_manager02"  --name salt_zabbix_manager02 -d -p 52000:22 -p   52001:3306 -p 52003:6379 -p 52004:6381  -p  52005:80 -p 52006:8000 -p 52007:8888  debian02 /etc/rc.local

1.3 上述啟動引數解釋:

-h  是指啟動後容器中的主機名。

--name 是宿主機上容器的名稱,以後啟動停止容器不必用容器ID,用名稱即可,如docker stop redis-test。

-d   以後臺形式執行。

-p   指定對映埠,如果需要對映

UDP埠,則格式是 -p3000:3000/udp。

debian02  是基礎映象名稱。

/etc/rc.local  是容器的啟動命令,把多個啟動指令碼放/etc/rc.local中,方便多個程式隨容器開機自啟動。

2、多IP多容器對映規劃方案

    此規劃比較適用於內網測試研發環境,所有對外訪問IP都需要配置在宿主機上,如以第二IP eth0:1,eth0:2這種形式配置,然後每個IP和容器的埠對映配置就可以一致了。

2.1 埠與IP對映規劃表格:

(此處是內網IP,宿主機IP10.28.103.1

主機名稱

對外訪問IP

容器開放埠

作業系統

iframe-test

10.18.103.2

22 3306 80 8000 8888 443 6379   6381

debian7

web-test

10.18.103.3

22 3306 80 8000 8888 443 6379   6381

debian7

2.2 對應容器啟動命令:

    docker run -h="iframe-test"  --name iframe-test -d -p 10.18.103.2:22:22 -p  10.18.103.2:3306:3306 -p 10.18.103.2:6379:6379 -p 10.18.103.2:6381:6381  -p 10.18.103.2:80:80 -p 10.18.103.2:8000:8000 -p 10.18.103.2:8888:8888 -p 10.18.103.2:443:443 debian-iframe-test /etc/rc.local

    docker run -h="web-test"  --name web-test -d -p 10.18.103.3:22:22 -p 10.18.103.3:3306:3306  -p 10.18.103.3:6379:6379 -p 10.18.103.3:6381:6381  -p 10.18.103.3:80:80 -p 10.18.103.3:8000:8000  -p 10.18.103.3:8888:8888 -p 10.18.103.3:443:443 debian-iframe-test /etc/rc.local

3、埠對映動態擴容方案

    在工作當中,一般增加新的服務時,就需新增一個埠對映,由於無法動態調整,通常都需要commit到新的映象,然後在基於新的映象來起容器,確實是一件很麻煩的事。

    但對映的本質,是通過iptables來完成的。所以我們可以動態的用iptables增加埠對映即可,如下:

3.1 用iptables檢視容器對映情況:

root@qssec-iframe:~# iptables -t nat -nvL

Chain DOCKER (2 references)

 pktsbytes target     prot opt in     out    source               destination        

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.17.0.3:8000

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 to:172.17.0.3:443

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 to:172.17.0.3:3306

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6379 to:172.17.0.3:6379

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6381 to:172.17.0.3:6381

 3470  190K DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.3:80

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 to:172.17.0.3:8888

   41  2336 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:50000 to:172.17.0.3:22

#從這裡可以找到docker容器裡使用的IP,然後在用iptables增加對映即可。

3.2 舉例新增zabbix埠的對映

  3.2.1 單IP單容器埠擴容:

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 10050 -j DNAT --to-destination  172.17.0.3:10050

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 10051 -j DNAT --to-destination  172.17.0.3:10051

  3.2.2 單IP多容器埠擴容:

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 50010 -j DNAT --to-destination  172.17.0.3:10050

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 50011 -j DNAT --to-destination  172.17.0.3:10051

#另一個容器則可以規劃為60010,60011,這樣在zabbix監控的時候,就需要指定客戶容器的埠連線了。

  3.2.3 多IP多容器埠擴容:

      iptables -t nat -A PREROUTING -d  10.18.103.2 -p tcp -m tcp --dport 10050 -j DNAT --to-destination 172.17.0.3:10050

      iptables -t nat -A PREROUTING -d  10.18.103.2 -p tcp -m tcp --dport 10051 -j DNAT --to-destination 172.17.0.3:10051

      #iptables -t nat -A PREROUTING -d  10.18.103.3 -p tcp -m tcp --dport 10050 -j DNAT --to-destination 172.17.0.4:10050

      #iptables -t nat -A PREROUTING -d  10.18.103.3 -p tcp -m tcp --dport 10051 -j DNAT --to-destination 172.17.0.4:10051

#這樣zabbix連線10.18.103.23的正常zabbix埠就可以了。

關於docker的安裝、初步使用、命令詳解、映象製作、容器遷入遷出等,點選參考我另一篇文章:

如有疑問可加我QQ10286460 ,共同討論,共同進步。

本文出自 “楊雲” 部落格,轉載請與作者聯絡!