docker network 与host的区别

所以docker run的时候只需要加入指定的network,就会从该network自动分配对应的ip是吗

是的,你的理解完全正确!

Docker 网络自动分配 IP 机制

当你使用 docker run 命令并指定网络时,Docker 会自动从该网络的子网中分配一个 IP 地址给容器。

基本用法:

bash 复制代码
# 使用默认 bridge 网络(自动分配 172.17.0.0/16 网段的 IP)
docker run --network=bridge your-image

# 使用自定义网络(自动分配该网络子网内的 IP)
docker run --network=mynetwork your-image

# 使用 host 网络(不分配独立 IP,直接使用宿主机网络)
docker run --network=host your-image

示例演示:

  1. 创建自定义网络
bash 复制代码
docker network create --subnet=192.168.100.0/24 mynetwork
  1. 运行容器
bash 复制代码
docker run -d --network=mynetwork --name container1 nginx
docker run -d --network=mynetwork --name container2 nginx
  1. 查看分配的 IP
bash 复制代码
docker inspect container1 | grep IPAddress
# 输出可能是: "IPAddress": "192.168.100.2"

docker inspect container2 | grep IPAddress
# 输出可能是: "IPAddress": "192.168.100.3"

IP 分配规则:

  1. 自动分配:Docker 会从网络的子网范围内自动选择可用的 IP
  2. 网关地址:通常网关地址(如 192.168.100.1)不会被分配给容器
  3. 顺序分配:一般按顺序分配,但不保证严格的顺序
  4. 避免冲突:Docker 会确保不分配已被使用的 IP

验证机制:

bash 复制代码
# 查看网络中的所有容器和它们的 IP
docker network inspect mynetwork

# 输出会显示类似:
"Containers": {
    "container1_id": {
        "IPv4Address": "192.168.100.2/24",
        "IPv6Address": "",
        "MacAddress": "02:42:c0:a8:64:02"
    },
    "container2_id": {
        "IPv4Address": "192.168.100.3/24", 
        "IPv6Address": "",
        "MacAddress": "02:42:c0:a8:64:03"
    }
}

注意事项:

  1. 网络必须存在:指定的网络需要预先创建
  2. IP 范围限制:IP 地址只能在该网络定义的子网范围内
  3. 动态分配 :除非使用 --ip 参数固定 IP,否则每次运行都可能获得不同 IP

所以你的理解是对的:只需要指定网络,Docker 就会自动处理 IP 分配。

如果制定host,docker就没有独立的ip对吗

是的,完全正确!

Host 网络模式的特点

当你使用 --network=host 参数时,Docker 容器不会获得独立的 IP 地址,而是直接使用宿主机的网络命名空间。

对比说明:

1. Bridge 模式(默认)
bash 复制代码
docker run --network=bridge your-image
# 容器获得独立 IP,如 172.17.0.2
2. Host 模式
bash 复制代码
docker run --network=host your-image
# 容器直接使用宿主机网络,没有独立 IP

Host 模式的特点:

  1. 共享网络命名空间

    • 容器直接使用宿主机的网络接口
    • 没有网络隔离
    • 没有独立的 IP 地址
  2. 端口直接映射

    • 容器内应用监听的端口直接绑定到宿主机
    • 不需要 -p 端口映射参数
    • 端口冲突检查在宿主机级别进行
  3. 网络性能

    • 网络性能最佳(无 NAT 开销)
    • 延迟最低

实际效果:

bash 复制代码
# 使用 host 网络运行容器
docker run -d --network=host --name myapp nginx

# 容器内应用监听 80 端口,直接在宿主机 80 端口可访问
# 不需要 docker run -p 80:80 ...

# 查看容器网络信息
docker inspect myapp | grep IPAddress
# 输出会是空或者显示宿主机 IP

适用场景:

  1. 高性能网络需求

    • 对网络延迟敏感的应用
    • 需要大量网络连接的应用
  2. 端口较多的服务

    • 避免复杂的端口映射配置
    • 动态端口分配的服务
  3. 网络调试

    • 更容易进行网络问题排查

注意事项:

  1. 端口冲突:容器端口直接占用宿主机端口
  2. 安全性降低:没有网络隔离
  3. 平台限制:在 Docker Desktop for Mac/Windows 上行为可能不同

所以你的理解完全正确:使用 host 网络模式时,容器没有独立的 IP 地址。

相关推荐
ALex_zry18 小时前
Docker Compose运维技术实战分享:从安装到架构解析
运维·docker·架构
2501_9411497919 小时前
Go语言高性能分布式缓存与Redis实战分享:微服务缓存优化与访问性能提升经验
eureka
踢球的打工仔20 小时前
PHP面向对象(7)
android·开发语言·php
roman_日积跬步-终至千里1 天前
【Docker】Docker Stop 后到底发生了什么?——从信号机制到优雅停机
运维·docker·容器
4***v2141 天前
详解 为什么 tcp 会出现 粘包 拆包 问题
网络·tcp/ip·php
z***6261 天前
Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像
docker·容器·tomcat
vx_dmxq2111 天前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php
X***E4631 天前
PHP在电商中的订单处理
开发语言·php
vx_vxbs661 天前
【SSM电影网站】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·小程序·php·idea
❀͜͡傀儡师1 天前
Docker部署视频下载器
docker·容器·音视频