原因
由於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本身的一種特性,參考這篇文章
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/
實際操作
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等命令, 簡化了在復雜場景下對容器連接的操作命令,為我們配置復雜的網絡拓撲提供了一個強有力的工具.
參考