如何避免docker网络和宿主机网络冲突

文章目录

  • 一、问题分析
  • 二、解决方案
    • 1、网段分配
    • 2、修改docker配置
    • 3、docker-compose配置
    • 4、工作机制
    • 5、网段创建验证
    • 6、容器IP验证

一、问题分析

docker0网桥默认是172段的一个地址172.17.0.1,如果刚好自己的宿主机服务器也处于这个网段,那这很容易冲突,会抢占172.17.x.x的网关,数据包会默认优先发到docker0的172.17.0.1地址上导致跨网段网络不通,从而导致和宿主机失联,下面分享下如何避免这个问题。

二、解决方案

1、网段分配

选择一个不常用的A、B、C段私有网段,并和自己所处的网段划分确认,没有冲突即可,我这里选择10.255.1.0/16

2、修改docker配置

修改/etc/docekr/daemon.json 配置

{            
  "bip": "10.255.0.1/24",  // 默认网桥占用10.255.0.0/24段,避免直接配置10.255.0.1/16,这样默认就占用整个网段,不利于后面自定义网络的使用,剩余网段10.255.1.0-10.255.255.0可用于自定义网络            
"default-address-pools": [            
    {            
      "base": "10.255.1.0/16", //基础网段,可用范围 10.255.1.0 ~ 10.255.255.255            
      "size": 24   //每个子网的大小为 /24(即 256 个 IP 地址)            
    }            
],            
...            
}    

改完记得重启docker服务

$ systemctl restart docker     

3、docker-compose配置

docker-compose中的网络配置示例

docker-compose1:            
...            
networks:            
project-a:            
    driver: bridge            
    ipam:            
      config:            
        - subnet: 10.255.1.0/24            


docker-compose2:            
...            
networks:            
project-b:            
    driver: bridge            
    ipam:            
      config:            
        - subnet: 10.255.2.0/24  

4、工作机制

1)当你创建新网络时:

Docker 会从 10.255.1.0/16 中分配一个未使用的 /24 子网。

· 第一个网络可能获得 10.255.1.0/24

· 第二个网络可能获得 10.255.2.0/24

· 依此类推…

2) 每个子网的网关默认是子网的第一个 IP(如 10.255.1.1)。

3)与 bip 的协同

  • 默认网桥(docker0):占用 10.255.0.0/24,网关为 10.255.0.1。
  • 自定义网络:从 10.255.1.0/16 分配子网(如 10.255.1.0/24),网关为 10.255.1.1。

两者不会冲突,因为网段不同。

5、网段创建验证

使用docker-compose创建两个项目之后查看

会发现会有三个网段的创建,网关分别是10.255.0.1、10.255.1.1、10.255.2.1
在这里插入图片描述

6、容器IP验证

查看每个容器的IP

$ docker ps -q | xargs -I {} docker inspect -f '{{.Name}}: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' {} | sed 's/^\///'

可以看到两个项目的容器分别处于10.255.1.0/24和10.255.2.0/24两个子网
在这里插入图片描述
这样就可以避免这个问题了

<think>好的,我现在需要帮助用户配置Docker以使用host网络模式。首先,我得确认用户的需求。用户提到想修改Docker网络配置,使用宿主机模式,也就是host模式。我需要回忆一下Docker网络模式相关知识,特别是host模式的特点配置方法。 根据之前学过的内容,Docker主要有几种网络模式:bridge、host、none等。Host模式会让容器共享宿主机网络命名空间,这意味着容器不会有自己的IP地址,而是直接使用宿主机的IP端口。这样做的优势是网络性能更好,因为少了虚拟化层的开销,但缺点是端口冲突的可能性增加,且容器不能有独立的网络配置。 接下来,我需要查看用户提供的引用内容,看看是否有相关的配置示例。引用[3]引用[4]都提到了host模式的使用方法。例如,引用[3]指出在运行容器时使用--network host参数,并且不需要使用-p进行端口映射,因为端口会直接绑定到宿主机。引用[4]则进一步解释了host模式的工作原理,并给出了一个运行Nginx容器的例子:docker run --name=nginx --net=host -d nginx。 用户的问题是如何配置Docker使用host网络模式。根据这些引用,正确的做法是在运行容器时指定--network host参数,而不是修改全局的Docker网络配置,因为Docker网络模式是在容器创建时指定的,而不是全局设置。因此,用户需要在docker run命令中加入这个参数。 另外,需要注意host模式下不要使用-p参数,因为端口映射在此模式下不适用,容器直接使用宿主机的端口。如果用户之前使用过bridge模式并习惯了-p参数,可能需要提醒他们这一点,避免配置错误导致端口冲突或服务无法访问。 总结步骤应该是:运行容器时添加--network host,并根据需要调整其他参数,比如容器名称、镜像等。同时,可能需要提醒用户host模式的优缺点,确保他们了解潜在的影响,比如网络配置的限制端口管理的问题。 现在,我需要将这些信息整理成一个清晰的回答,分步骤说明如何配置,并给出示例命令。同时,生成相关问题,帮助用户进一步理解或解决可能的相关疑问。</think>### 如何配置Docker使用host网络模式? #### 配置步骤 1. **运行容器时指定host模式** 在`docker run`命令中直接添加`--network host`参数,使容器共享宿主机网络命名空间,无需端口映射。例如: ```bash docker run --name=my_container --network host -d nginx ``` 此时容器会直接使用宿主机的IP端口,省略`-p`参数[^3][^4]。 2. **验证网络模式** 使用以下命令检查容器的网络配置: ```bash docker inspect my_container | grep NetworkMode ``` 输出应显示`"NetworkMode": "host"`,表明已成功应用host模式。 3. **注意事项** - **端口冲突**:若容器应用使用80端口,宿主机上其他服务不可占用该端口。 - **性能优势**:host模式减少网络虚拟化开销,适合高吞吐、低延迟场景。 - **局限性**:容器无法自定义网络配置(如独立IP),且多个容器无法复用相同端口。 #### 示例:启动Nginx容器 ```bash docker run --name=nginx_host --network host -d nginx ``` 访问宿主机IP的80端口即可直接访问容器内的Nginx服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjzhang75

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值