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

相关推荐
lichenyang4531 天前
Docker 学习笔记(五):Docker Compose,用一个 YAML 启动前端、后端和 MongoDB
docker
lichenyang4531 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4531 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4531 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy6 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭6 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩7 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
程序员老赵8 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1118 天前
LM Studio Docker 部署——本地大模型一键启动
docker