容器网络基础

Docker 容器的网络配置、端口映射、容器间通信


📋 目录


网络模式

Bridge 模式(默认)

每个容器都有独立的网络命名空间,通过 Docker 网桥连接。

# 使用默认 bridge 网络
docker run -d --network bridge nginx:latest

Host 模式

容器直接使用宿主机的网络。

# 使用 host 网络
docker run -d --network host nginx:latest

None 模式

容器没有网络接口。

# 使用 none 网络
docker run -d --network none nginx:latest

Container 模式

容器共享另一个容器的网络命名空间。

# 共享容器的网络
docker run -d --network container:other-container nginx:latest

端口映射

-p / —publish

映射容器端口到宿主机端口。

# 映射端口(自动绑定所有接口)
docker run -d -p 8080:80 nginx:latest
 
# 映射端口(指定 IP)
docker run -d -p 127.0.0.1:8080:80 nginx:latest
 
# 映射端口(自动分配宿主机端口)
docker run -d -p 80 nginx:latest
 
# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 nginx:latest
 
# 映射 UDP 端口
docker run -d -p 53:53/udp dns-server:latest

-P / —publish-all

自动映射所有 EXPOSE 的端口。

# 自动映射所有端口
docker run -d -P nginx:latest

容器间通信

默认 Bridge 网络

同一 bridge 网络中的容器可以通过容器名或 IP 通信。

# 创建两个容器
docker run -d --name web nginx:latest
docker run -d --name app myapp:latest
 
# 在 app 容器中访问 web 容器
docker exec app curl http://web

自定义网络

使用自定义网络可以更好地管理容器通信。

# 创建自定义网络
docker network create my-network
 
# 将容器连接到网络
docker run -d --name web --network my-network nginx:latest
docker run -d --name app --network my-network myapp:latest
 
# 容器可以通过名称通信
docker exec app curl http://web

自定义网络

创建网络

# 创建 bridge 网络
docker network create my-network
 
# 创建网络并指定子网
docker network create --subnet=172.20.0.0/16 my-network
 
# 创建网络并指定网关
docker network create \
  --subnet=172.20.0.0/16 \
  --gateway=172.20.0.1 \
  my-network

管理网络

# 列出所有网络
docker network ls
 
# 查看网络详细信息
docker network inspect my-network
 
# 删除网络
docker network rm my-network
 
# 删除所有未使用的网络
docker network prune

连接容器到网络

# 运行容器时连接到网络
docker run -d --network my-network nginx:latest
 
# 将运行中的容器连接到网络
docker network connect my-network my-container
 
# 断开容器与网络的连接
docker network disconnect my-network my-container

网络隔离

网络隔离原理

不同网络中的容器默认无法通信,实现网络隔离。

# 创建两个网络
docker network create network1
docker network create network2
 
# 在不同网络中创建容器
docker run -d --name app1 --network network1 myapp:latest
docker run -d --name app2 --network network2 myapp:latest
 
# app1 和 app2 无法直接通信

多网络连接

容器可以连接到多个网络。

# 创建两个网络
docker network create frontend
docker network create backend
 
# 容器连接到多个网络
docker run -d --name web --network frontend nginx:latest
docker network connect backend web

DNS 配置

容器 DNS

容器使用 Docker 的 DNS 服务器解析容器名。

# 查看容器 DNS 配置
docker inspect -f '{{.NetworkSettings.DNS}}' my-container

自定义 DNS

# 使用自定义 DNS 服务器
docker run -d --dns 8.8.8.8 nginx:latest
 
# 使用多个 DNS 服务器
docker run -d --dns 8.8.8.8 --dns 8.8.4.4 nginx:latest
 
# 添加 DNS 搜索域
docker run -d --dns-search example.com nginx:latest

/etc/hosts

# 添加主机名映射
docker run -d --add-host hostname:192.168.1.100 nginx:latest

实用示例

Web 应用 + 数据库

# 创建网络
docker network create app-network
 
# 启动数据库
docker run -d \
  --name db \
  --network app-network \
  -e POSTGRES_PASSWORD=password \
  postgres:13
 
# 启动 Web 应用
docker run -d \
  --name web \
  --network app-network \
  -p 8080:80 \
  -e DATABASE_URL=postgres://db:5432/mydb \
  myapp:latest

微服务架构

# 创建网络
docker network create microservices
 
# 启动各个服务
docker run -d --name api --network microservices api:latest
docker run -d --name auth --network microservices auth:latest
docker run -d --name gateway --network microservices -p 80:80 gateway:latest

📚 参考资源


相关笔记