Docker swarm 為 service 設置固定IP(失敗,只能采取docker-compose的方式)


原因

由於c平台項目特殊性,編譯的時候需要確定各個節點的IP。因此需要將service的ip固定

嘗試

在docker-compose.yml中加了如下配置

weblogic:
    image: weblogic:1.1
    #container_name: weblogic_1
    command: ['ping', '127.0.0.1']
    #restart: always
    networks:
      exnetwork:
        ipv4_address: 172.19.0.21

使用 doekcer stack deploy 啟動后,發現IP並不是 172.19.0.21 ,而是隨機的。

重啟了幾次,發現依然是這樣

原因

查了下資料,發現本身就不支持…最詳細的是這個頁面

https://github.com/moby/moby/issues/24170

很多人有這個需求,但一直到現在也不支持…

類似的issue還有

https://github.com/moby/moby/issues/31860

https://github.com/moby/moby/pull/32981

解決辦法

使用docker-compose

如果不是必須要用swarm集群,可以使用docker-compose來啟動,只不過只支持單機了

使用over-node

項目URL

https://overnode.org/docs/custom-networking/

也是在github的issue看到了這個人的宣傳,號稱支持service固定IP,可以理解成多個節點的docker-compose。

但不太敢用,怕踩坑

docker 使用 macvlan 網絡模式

macvlan是Linux本身的一種特性,參考這篇文章

https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247485246&idx=1&sn=c42a3618c357ebf5f6b7b7ce78ae568f&chksm=ea743386dd03ba90ad65940321385f68f9315fec16d82a08efa12c18501d8cadf95cf9e614a2&scene=21#wechat_redirect

docker本身現在也支持這種網絡模式,

使用macvlan可以是多個主機的container進行通信,但存在一個問題:host無法直接訪問container,反之container也無法直接訪問host.

原因是出於安全考慮(不過如果host本身有2塊網卡,似乎可以解決這個問題)……

參考自 https://forums.docker.com/t/macvlan-networks-unable-to-connect-to-host-from-container/51435/4

macvlan體驗

參考

https://www.cnblogs.com/bakari/p/10893589.html

https://docs.docker.com/network/macvlan/

環境說明:

Host1  192.168.137.2  ens0
Host2  192.168.137.3  ens0

Container1  192.168.0.2  dockervlan  (Host1)
Container2  192.168.0.3  dockervlan  (Host2)

創建過程比較簡單,參考下面這個docker-compose.yml

version: '3.7'

services:
  tuxedo:
    image: tuxedo:1.1
    hostname: 'test'
    #container_name: tuxedo_1
    #restart: always
    command: ['ping', '127.0.0.1']
    environment:
      TUXCONFIG: '/home/wang/OraHome_1/tuxedo12.2.2.0.0/samples/atmi/simpapp_bak/tux.config' 
    networks:
      dockervlan:
        ipv4_address: 192.168.0.2  # 另外一個Host上的docker-compose此處改為192.168.0.3
networks:
  dockervlan:
    #This interface should be defined as using null driver. Do not remove it.
    driver: null
    driver_opts:
      parent: eno1
    ipam:
      config:
        - subnet: "192.168.0.0/24"
          ip_range: "192.168.0.64/26"
          gateway: "192.168.0.1"
  dockervlan:
    #This is the interface which is used for containers networking
    driver: macvlan
    driver_opts:
      parent: eno1
    ipam:
      config:
        - subnet: "192.168.0.0/24"
          ip_range: "192.168.0.64/26"
          gateway: "192.168.0.1"

參考

https://github.com/sarunas-zilinskas/docker-compose-macvlan/blob/master/docker-compose.yml

兩台服務器上安裝好docker-compose,使用下列命令啟動即可

 docker-compose up -d

可以在兩個container上ping另外一個,可以發現是互通的。

但ping Host則失敗,Host ping container也不行

使Host可以ping container

參考這里

https://rehtt.com/index.php/archives/236/

https://stackoverflow.com/questions/44048915/unable-to-access-docker-containers-from-host-over-macvlan-network

實際操作

ip link add macvlan2 link eno1 type macvlan mode bridge
ip addr add 192.168.0.5 dev macvlan2
ip link set macvlan2 up
ip route add 192.168.0.2 dev macvlan2

隨后在Host1上ping 192.168.0.2發現已經可以返回結果了

原理:

相當於建立了兩個macvlan網絡,然后修改路由,把數據經過新建的macvlan去訪問container

注意:

重啟后會失效,可以設置開機啟動。

不過由於這種方式不滿足我的需求,因此測試后依然放棄

其他思路

有人使用 pipework 這個第三方軟件,但沒測試

pipework是一個400多行的shell程序,封裝Linux上的ip、brctl等命令, 簡化了在復雜場景下對容器連接的操作命令,為我們配置復雜的網絡拓撲提供了一個強有力的工具.

參考

http://www.louisvv.com/archives/695.html

https://juejin.cn/post/6844903685248679950


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM