📚前言
👀回顾,系统学习docker系列已发布内容:
【docker基础】第三课:镜像管理与Dockerfile基础
🔗相关文档:
【docker基础】Ubuntu 安装 Docker 超详细小白教程
📒本课学习目标:
- Docker的三种网络模式(Bridge、Host、None)
- Docker网络的基本操作命令
- 容器之间如何通信
- 实战:创建自定义网络并部署多容器应用
🌍Docker第五周学习教程:Docker网络详解
欢迎进入Docker学习的第五周!本周我们将重点学习Docker网络管理,这是理解容器间通信和外部访问的关键知识。
一、Docker网络模式
Docker提供了三种主要的网络模式,每种模式适用于不同的场景。
1. Bridge网络(默认网络)
概念
- Bridge网络是Docker的默认网络模式
- 当您创建一个容器而不指定网络时,Docker会自动将其连接到默认的bridge网络
- 这是一个虚拟网桥,类似于物理交换机
特点
- 每个容器都有独立的IP地址
- 容器之间可以通过IP地址相互通信
- 容器可以访问外部网络(如互联网)
- 外部网络默认无法直接访问容器(需要端口映射)
查看默认Bridge网络
docker network ls
输出示例:
NETWORK ID NAME DRIVER SCOPE
abc123456789 bridge bridge local
2. Host网络
概念
- 使用Host网络模式时,容器共享宿主机的网络栈
- 容器没有独立的IP地址,直接使用宿主机的IP
特点
- 容器与宿主机共享网络命名空间
- 网络性能最好(无需网络转换)
- 端口冲突风险高(容器端口直接占用宿主机端口)
- 隔离性差
使用Host网络创建容器
docker run -d --network host --name nginx-host nginx
3. None网络
概念
- None网络模式下,容器没有网络连接
- 容器内部只有一个lo(回环)接口
特点
- 完全隔离,无法访问外部网络
- 容器之间也无法通信
- 适用于不需要网络的场景(如批处理任务)
使用None网络创建容器
docker run -d --network none --name isolated-container busybox
二、网络操作命令详解
1. 查看网络列表:docker network ls
功能:列出当前Docker主机上的所有网络
命令格式:
docker network ls [OPTIONS]
常用选项:
-q:只显示网络ID
示例:
docker network ls
输出解释:
NETWORK ID NAME DRIVER SCOPE
abc123456789 bridge bridge local
def098765432 host host local
ghi567890123 none null local
解释:
-
NETWORK ID:网络的唯一标识符 -
NAME:网络名称 -
DRIVER:网络驱动类型(bridge、host、null) -
SCOPE:作用域(local表示本地网络)
2. 查看网络详情:docker network inspect
功能:查看指定网络的详细信息
命令格式:
docker network inspect <NETWORK_NAME_OR_ID>
示例:
docker network inspect bridge
输出示例(简化版):
[
{
"Name": "bridge",
"Id": "abc123456789...",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Containers": {
"container-id-1": {
"Name": "my-container",
"EndpointID": "...",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
}
}
]
关键信息解读:
Subnet:网络子网(如172.17.0.0/16)Gateway:网关地址(容器通过这个地址访问外部网络)Containers:连接到这个网络的所有容器及其IP地址
3. 创建自定义网络:docker network create
功能:创建用户自定义的网络
命令格式:
docker network create [OPTIONS] <NETWORK_NAME>
常用选项:
-
--driver或-d:指定网络驱动(默认bridge) -
--subnet:指定子网地址范围 -
--gateway:指定网关地址 -
--name:指定网络名称
示例1:创建默认的bridge网络
docker network create my-network
示例2:创建指定子网的网络
docker network create --subnet=192.168.100.0/24 --gateway=192.168.100.1 my-custom-network
验证创建结果:
docker network ls
4. 连接容器到网络:docker network connect
功能:将运行中的容器连接到指定网络
命令格式:
docker network connect <NETWORK_NAME> <CONTAINER_NAME_OR_ID>
示例:
# 创建一个容器
docker run -d --name my-app nginx
# 将容器连接到自定义网络
docker network connect my-network my-app
验证连接:
docker network inspect my-network
5. 断开容器与网络的连接:docker network disconnect
功能:将容器从指定网络断开
示例:
docker network disconnect my-network my-app
6. 删除网络:docker network rm
功能:删除指定的网络
命令格式:
docker network disconnect <NETWORK_NAME> <CONTAINER_NAME_OR_ID>
示例:
docker network rm my-network
注意:
-
无法删除正在被容器使用的网络
-
必须先断开所有容器的连接才能删除
三、容器间通信
容器间通信是Docker网络的核心功能之一,主要有以下几种方式:
方式1:通过IP地址通信
前提 :两个容器必须在同一个网络中
步骤:
-
创建自定义网络
-
启动两个容器并连接到该网络
-
通过IP地址互相访问
示例:
# 创建自定义网络
docker network create my-network
# 启动第一个容器
docker run -d --name container1 --network my-network nginx
# 启动第二个容器
docker run -d --name container2 --network my-network busybox sleep 3600
# 查看container1的IP地址
docker inspect container1 | grep IPv4Address
# 在container2中ping container1
docker exec container2 ping 172.18.0.2
方式2:通过容器名称通信(推荐)
Docker支持容器名称解析,在同一个网络中可以直接使用容器名称访问。
示例:
# 在container2中通过名称访问container1
docker exec container2 ping container1
原理:
-
Docker内置了DNS解析功能
-
在同一个网络中,容器名称会自动解析为对应的IP地址
-
这比使用IP地址更方便,因为IP地址可能会变化
四、实战练习:创建自定义网络并部署多容器应用
实战目标
我们将创建一个简单的Web应用,包含:
-
一个Nginx容器作为Web服务器
-
一个MySQL容器作为数据库
-
一个PHP容器作为后端
步骤1:创建自定义网络
# 创建名为app-network的自定义网络
docker network create app-network
# 验证网络创建
docker network ls
步骤2:启动MySQL容器
docker run -d \
--name mysql-db \
--network app-network \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=myapp \
mysql:5.7
参数解释:
-
-d:后台运行 -
--name mysql-db:容器名称 -
--network app-network:连接到自定义网络 -
-e MYSQL_ROOT_PASSWORD=123456:设置MySQL根密码 -
-e MYSQL_DATABASE=myapp:创建名为myapp的数据库
步骤3:启动PHP容器
docker run -d \
--name php-app \
--network app-network \
php:7.4-fpm
步骤4:启动Nginx容器并连接到网络
docker run -d \
--name web-server \
--network app-network \
-p 8080:80 \
nginx
参数解释:
-p 8080:80:将宿主机的8080端口映射到容器的80端口
步骤5:验证容器间通信
# 在php-app容器中测试连接MySQL
docker exec php-app ping mysql-db
# 在web-server容器中测试连接php-app
docker exec web-server ping php-app
步骤6:查看网络详情
docker network inspect app-network
输出示例:
{
"Name": "app-network",
"Containers": {
"container-id-mysql": {
"Name": "mysql-db",
"IPv4Address": "172.19.0.2/16"
},
"container-id-php": {
"Name": "php-app",
"IPv4Address": "172.19.0.3/16"
},
"container-id-nginx": {
"Name": "web-server",
"IPv4Address": "172.19.0.4/16"
}
}
}
步骤7:清理资源
# 停止所有容器
docker stop mysql-db php-app web-server
# 删除所有容器
docker rm mysql-db php-app web-server
# 删除自定义网络
docker network rm app-network
五、常见问题解答
Q1:为什么容器之间无法通信?
可能原因:
-
容器不在同一个网络中
-
防火墙阻止了通信
-
容器没有正确启动
解决方案:
-
使用
docker network inspect检查容器是否在同一网络 -
使用
docker exec <container> ping <other-container>测试连接
Q2:如何让外部网络访问容器?
解决方案:使用端口映射
docker run -d -p 宿主机端口:容器端口 image-name
Q3:可以给容器指定固定IP吗?
可以 ,创建容器时使用 --ip 参数:
docker run -d \
--name my-container \
--network my-network \
--ip 192.168.100.10 \
nginx
六、本周作业
-
基础练习:创建一个自定义网络,启动两个容器并测试它们之间的通信
-
进阶练习:部署一个WordPress应用(需要WordPress容器和MySQL容器)
-
思考问题:Bridge网络和Host网络的区别是什么?分别适用于什么场景?
七、总结回顾
1、Docker网络模式
- Bridge网络(默认):每个容器有独立IP,可互相通信,需端口映射才能从外部访问
- Host网络:容器共享宿主机网络栈,性能最好但隔离性差
- None网络:完全隔离,无网络连接,适用于不需要网络的场景
2、网络操作命令详解
docker network ls- 查看网络列表docker network inspect- 查看网络详情(含子网、网关、连接的容器)docker network create- 创建自定义网络(支持指定子网和网关)docker network connect/disconnect- 连接/断开容器与网络docker network rm- 删除网络
3、容器间通信
- 通过IP地址通信(需在同一网络)
- 通过容器名称通信(Docker内置DNS解析,推荐)
4、实战练习
创建自定义网络并部署Nginx + MySQL + PHP多容器应用,包含完整的命令和参数解释。