06 - Docker 网络
Docker 网络
在前面的教程中,我们学习了Docker的基本概念、命令、镜像构建和数据管理。本文将介绍Docker的网络功能,这对于构建多容器应用和微服务架构至关重要。
Docker网络模型
Docker使用了一种插件化的网络架构,称为Container Network Model (CNM)。这种架构允许开发者选择或实现不同的网络驱动,以满足各种网络需求。
Docker默认网络类型
当你安装Docker时,它会自动创建三种网络:
docker network ls
你会看到类似以下输出:
NETWORK ID NAME DRIVER SCOPE9f6f3a1e85ff bridge bridge local95d96da43c2e host host local0ba0e9dcacf5 none null local
1. 桥接网络(Bridge Network)
桥接网络是Docker的默认网络模式。当你创建一个容器而不指定网络时,它会自动连接到桥接网络。
特点:
- 同一桥接网络中的容器可以通过IP地址相互通信
- 容器可以通过端口映射与外部网络通信
- 每个容器都有自己的IP地址
# 创建并运行连接到默认桥接网络的容器docker run -d --name web nginx
2. 主机网络(Host Network)
使用主机网络的容器与主机共享网络命名空间,直接使用主机的网络接口。
特点:
- 容器直接使用主机的网络,没有网络隔离
- 性能更好,没有网络地址转换(NAT)开销
- 容器中的服务直接绑定到主机端口,可能导致端口冲突
# 创建并运行连接到主机网络的容器docker run -d --network host --name web nginx
3. 空网络(None Network)
连接到空网络的容器没有网络接口(除了loopback接口)。
特点:
- 容器完全隔离,没有外部网络连接
- 适用于不需要网络的批处理任务
# 创建并运行连接到空网络的容器docker run -d --network none --name batch-job alpine sleep 1000
自定义网络
Docker允许创建自定义网络,这对于隔离容器组和实现更复杂的网络拓扑非常有用。
创建自定义网络
# 创建自定义桥接网络docker network create --driver bridge my-network
# 创建具有特定子网和网关的网络docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 my-network
将容器连接到自定义网络
# 创建容器并连接到自定义网络docker run -d --network my-network --name web nginx
# 将现有容器连接到网络docker network connect my-network existing-container
# 断开容器与网络的连接docker network disconnect my-network existing-container
容器间通信
1. IP地址通信
同一网络中的容器可以通过IP地址相互通信。
# 查看容器IP地址docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
2. DNS解析和服务发现
Docker内置了DNS服务器,允许容器通过容器名称相互访问(在自定义网络中)。
# 创建两个容器在同一自定义网络中docker network create app-networkdocker run -d --network app-network --name web nginxdocker run -d --network app-network --name db postgres
# 现在web容器可以通过名称"db