ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Docker swarm 为 service 设置固定IP(失败,只能采取docker-compose的方式)

2022-04-12 10:00:46  阅读:283  来源: 互联网

标签:compose service IP 192.168 macvlan https docker com


原因

由于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

标签:compose,service,IP,192.168,macvlan,https,docker,com
来源: https://www.cnblogs.com/wswang/p/16133733.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有