【docker基础】第五课:Docker网络详解

📚前言

👀回顾,系统学习docker系列已发布内容:

【docker基础】0、系统学习docker之总计划

【docker基础】第一课、从零开始理解容器技术

【docker基础】第二课:安装、配置与基础命令

【docker基础】第三课:镜像管理与Dockerfile基础

【docker基础】第四课:容器操作与数据管理

🔗相关文档:

windows下安装docker

【docker基础】Ubuntu 安装 Docker 超详细小白教程

📒本课学习目标:

  1. Docker的三种网络模式(Bridge、Host、None)
  2. Docker网络的基本操作命令
  3. 容器之间如何通信
  4. 实战:创建自定义网络并部署多容器应用

🌍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地址通信

前提 :两个容器必须在同一个网络

步骤

  1. 创建自定义网络

  2. 启动两个容器并连接到该网络

  3. 通过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应用,包含:

  1. 一个Nginx容器作为Web服务器

  2. 一个MySQL容器作为数据库

  3. 一个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:为什么容器之间无法通信?

可能原因

  1. 容器不在同一个网络中

  2. 防火墙阻止了通信

  3. 容器没有正确启动

解决方案

  • 使用 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

六、本周作业

  1. 基础练习:创建一个自定义网络,启动两个容器并测试它们之间的通信

  2. 进阶练习:部署一个WordPress应用(需要WordPress容器和MySQL容器)

  3. 思考问题: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多容器应用,包含完整的命令和参数解释。

相关推荐
小黑蛋学java2 小时前
Nginx 接口耗时 Prometheus + Grafana 监控实施方案
运维·nginx·负载均衡·grafana·prometheus
鹤鸣的日常2 小时前
前端运行时动态环境变量方案
前端·react.js·docker·前端框架·vue·gitlab
asyxchenchong8883 小时前
最新Hermes Agent 技能封装与科研自动化:以 Meta-Analysis 为例-实现从文献检索到绘图的一站式工作流
运维·人工智能·自动化
tianyuanwo4 小时前
项目内自我管理:一名OS领域DevOps的破局之路
运维·devops
三十..4 小时前
Redis 核心原理与高可用架构实践
运维·数据库·redis
我是谁??6 小时前
ubuntu22.04 通过docker部署vLLM(Qwen3-0.6B)大模型+New API+OpenWebUI
docker·容器·vllm
jinglong.zha6 小时前
LScript-从零基础到商业变现的AI自动化学习平台
运维·学习·自动化
运维瓦工6 小时前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器
Adorable老犀牛6 小时前
Telegraf:InfluxData 出品的指标采集代理
运维·telegraf