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 地址。

相关推荐
星辰徐哥3 分钟前
CDN工作原理:节点缓存、智能调度,减少跨网传输延迟
服务器·缓存·php
星辰徐哥6 分钟前
ARP缓存表:作用、查看方法与刷新技巧
开发语言·缓存·php
ego.iblacat9 分钟前
lvs 集群部署
开发语言·php·lvs
杰克尼37 分钟前
redis(day08-Redis原理篇)
数据库·redis·php
yxl_num1 小时前
Docker 完整部署一个包含 Spring Boot(依赖 JDK)、MySQL、Redis、Nginx 的整套服务
java·spring boot·docker
刘兆河1 小时前
网站sitemap生成
php·sitemap
升职佳兴2 小时前
重启 Docker 导致 VMware 虚拟机断网:一次完整的故障排查记录
运维·docker·容器
HYNuyoah2 小时前
docker网站配置迁移(旧换新)
java·docker·容器
农村小镇哥2 小时前
PHP递归遍历+MYSQL介绍+MYSQL基本操作
开发语言·mysql·php
xinhuanjieyi3 小时前
php给30支NBA球队添加logo图标,做好对应关系
android·开发语言·php