原因

由于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块网卡,似乎可以解决这个问题)……

swarm compose 容器 ip 固定 docker compose 固定ip_docker

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

macvlan体验

参考

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