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

相关推荐
大孜然8 小时前
Macao资料生成程序,全新的UI 三端自适应PHP空间
php
杨浦老苏8 小时前
开源云文件存储服务器MyDrive
docker·群晖·网盘
PellyKoo8 小时前
Docker容器中中文文件名显示乱码问题完美解决方案
运维·docker·容器
无妄无望9 小时前
在没有网络的环境下安装包pymysql
学习·docker
奥尔特星云大使9 小时前
Docker 拉取 MySQL 5.7 镜像、启动容器并进入 MySQL
数据库·mysql·docker·容器
big男孩9 小时前
Docker使用环境变量的整理
docker
安卓开发者10 小时前
Docker与Nginx:现代Web部署的完美二重奏
前端·nginx·docker
挨踢攻城10 小时前
网络安全 | 如何防御勒索软件?
安全·web安全·网络安全·php·厦门微思网络·防疫勒索软件
低音钢琴11 小时前
【从零开始构建性能测试体系-08】如何诊断性能瓶颈:从服务器到数据库的全方位分析
服务器·数据库·php
laoma-cloud11 小时前
网络基础综合实验
网络·php