docker & docker-compose 自定义容器 ip, 彻底解决容器 ip 冲突问题

容器已经作为目前部署架构的主要角色了,当然我这里主要说的还是 Docker, 今天这篇文章就简要记录一下用到的一个小技巧:自定义容器运行时的IP分配。

本文会介绍基于 docker 及 docker-compose 的两种 IP 自定义配置介绍。

背景

默认情况下,docker 安装后 本机会多出一个虚拟网卡,其网卡 IP 段为:172.17.0.0/24

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:0f:4a:a1:32 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/24 brd 172.17.0.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:fff:fe4a:a132/64 scope link 
       valid_lft forever preferred_lft forever

如果你是单机环境,倒无所谓,但是对于企业多机器,多网络环境情况下,有可能会出现网络冲突。

为了应对网络冲突问题,docker & docker-compose 都想到了这个问题,当然解决方式也是比较简单。

我们分别介绍一下。

docker

官方指导文档在这里:

https://docs.docker.com/reference/cli/dockerd/

常见的可以通过 2 种方式:

  • dockerd 命令后加参数 --bip

  • 配置 /etc/docker/daemon.json 配置文件

我当然喜欢第 2 种了,话不多说,直接上配置(其中的 bip 字段设置的就是 ip 段):

{
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "bip": "179.30.0.1/24",
  "data-root": "/var/lib/docker"
}

这样设置之后,重启 docker, 再运行容器,默认分配的就是新的网段IP了。

最开始,笔者以为更改了 docker, 那 docker-compose 运行的不也就是 跟 docker 一样嘛?

直到第 2 天,同事跟我说,机器连不上内部监控系统(监控系统所在网段就是 172.17),这才知道,原来 docker-compose 跟 docker 不是一体啊!

继续开整。

docker-compose

同样,官网文档在这里:

https://docs.docker.com/compose/compose-file/06-networks/

我不饶弯子了,我也没有细研究,主打一个吃好够用,直接上实例,大家有兴趣自行阅读文档吧。

services:
  logstash:
    image: logstash:7.17.22
    restart: always
    networks:
      - logstash
    volumes:
      - ./logstash.yml:/usr/share/logstash/config/logstash.yml
      - ./conf/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - /var/log:/var/log

networks:
  logstash:
    ipam:
      driver: default
      config:
        - subnet: "172.22.0.0/24"
          gateway: 172.22.0.1

再通过 docker-compose 启动的容器,其 IP 就变了。

总结

今天的内容主要介绍了 docker & docker-compose 如何自定义 IP 段,避免在复杂网络环境下产生冲突。

更多配置,请查阅文章中贴的文档,祝大家学有所成。

也欢迎大家关注我的公&号:新质程序猿,获取更多干货资料,一起探索成长之路。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用docker-compose可以通过自定义网络来分配IP地址。在docker-compose文件中定义一个网络,然后为该网络设置一个IP范围,通过这个范围来分配IP地址给容器。 首先,在docker-compose.yml文件中定义一个网络,在`networks`部分添加一个新的网络,并为该网络指定一个自定义的名称,例如"my_network"。 ``` version: '2' services: my_service: image: my_image networks: - my_network networks: my_network: ipam: config: - subnet: 192.168.0.0/24 ``` 上面的例子中,我们定义了一个名为"my_network"的网络,并为该网络指定了一个IP范围192.168.0.0/24。 然后,将容器添加到该网络中。在服务的定义中,使用`networks`属性将服务连接到上述定义的网络。 这样,当使用`docker-compose up`启动容器时,容器将被分配一个在IP范围内的IP地址。 需要注意的是,如果要为多个容器分配独立的IP地址,需要确保IP范围的大小足够容纳所有容器所需的地址。 另外,使用自定义网络可以实现多个容器之间的通信,它们可以通过容器名称来相互访问,而无需使用IP地址。 综上所述,通过在docker-compose文件中定义自定义网络并为其设置IP范围,可以实现为容器分配IP地址。 ### 回答2: Docker Compose 允许我们在容器部署时使用自定义网络来分配 IP 地址。下面是关于 Docker Compose 自定义网络分配 IP 地址的一些重要信息: 1. 自定义网络的配置:在 Docker Compose 文件中,我们可以使用 `networks` 关键字定义自定义网络,并为其指定一个名称。例如: ```yaml version: '3' services: app: # 定义自定义网络 networks: - my-network networks: my-network: # 可选配置网络驱动 driver: bridge ``` 2. IP 地址分配方式:Docker Compose 支持三种不同的 IP 地址分配方式,分别是 `default`、`bridge` 和 `host`。默认情况下,Docker Compose 使用 `default` 分配方式。通过在网络配置中指定 `ipam` 选项,我们可以使用其他分配方式。 3. 使用 `default` 分配方式:如果使用默认的 `default` 分配方式,那么 Docker Compose 将自动为容器分配 IP 地址,并且会保持容器名称与 IP 地址之间的关联。例如,我们可以通过在服务定义中使用 `networks` 字段指定网络,并通过使用该网络的容器名称来访问容器。 ```yaml services: app1: networks: - my-network app2: networks: - my-network networks: my-network: ``` 在这种情况下,Docker Compose 将为 `app1` 容器分配一个 IP 地址,并将其映射到容器名称 `my-app1`。 4. 使用其他分配方式:如果我们希望自定义 IP 地址分配方式,可以在网络配置中使用 `ipam` 选项。例如,我们可以指定一个静态 IP 地址供容器使用。 ```yaml services: app: networks: my-network: ipv4_address: 192.168.0.2 networks: my-network: ipam: config: - subnet: 192.168.0.0/16 ``` 在这种情况下,Docker Compose 将为 `app` 容器分配指定IP 地址 192.168.0.2。 通过以上的配置,我们可以根据需要在 Docker Compose 中自定义网络并分配 IP 地址。这样可以更好地控制容器之间的通信,并实现特定的网络需求。 ### 回答3: 在Docker Compose中,我们可以使用自定义网络来对容器进行分组和分配IP地址。通过自定义网络,我们可以更好地管理容器之间的通信和连接。 首先,在docker-compose.yml文件中定义一个自定义网络。我们可以使用以下语法来创建一个自定义网络: ```yml networks: <network_name>: driver: <driver_name> ``` 在上面的代码片段中,`<network_name>`是我们给网络取的名称,`<driver_name>`是网络使用的驱动程序。 例如,我们可以创建一个名为`my_network`的自定义网络,并使用默认的`bridge`驱动程序,只需在docker-compose.yml文件中添加以下代码: ```yml networks: my_network: driver: bridge ``` 一旦我们定义了一个自定义网络,我们可以将容器连接到这个网络,并为它们分配IP地址。 要将容器连接到自定义网络,我们可以使用以下代码: ```yml services: <service_name>: networks: - <network_name> ``` 在上面的代码片段中,`<service_name>`是我们要将容器连接到的服务名称,`<network_name>`是我们之前定义的自定义网络名称。 例如,如果我们要将一个名为`web`的服务连接到`my_network`网络,我们可以在docker-compose.yml文件中添加以下代码: ```yml services: web: networks: - my_network ``` 最后,我们可以为连接到自定义网络的容器分配IP地址。Docker将自动为连接到网络的容器分配IP地址。我们可以使用以下代码来查看容器IP地址: ```bash docker network inspect <network_name> ``` 在上面的命令中,`<network_name>`是我们之前定义的自定义网络名称。 总之,使用Docker Compose的自定义网络,我们可以轻松地进行容器的分组和分配IP地址。通过定义自定义网络并连接容器,我们可以实现灵活的容器通信和连接管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值