Docker 入门之网络基础

Docker 入门之网络基础

缘起

本想写"docker 入门之网络",但是越写越多,算了,还是拆开把,先写基础。

建议先看这篇:

Docker 入门之基本概念

网络基础

首先理解一下docker网络的三个核心概念,或者说核心技术支柱:

先看图,以实践来理解概念,比较容易一点:

bash 复制代码
# 启动一个容器
docker run -it --rm --name debian debian:trixie /bin/bash
  1. 网络命名空间(Network Namespace)

每个容器拥有独立的网络命名空间,这意味着它有自己独立的:

  • IP 地址
  • 路由表
  • 防火墙规则
  • 网络接口(如 eth0

使用以下命令查看docker容器信息:

bash 复制代码
docker inspect debian

# debian是启动容器的名字,上一步命令中设定的
  1. 虚拟网卡对(veth pair)

可以理解为网络设备(Network Device),就是硬件设备了,一个网口,在容器内,叫eth0,一根网线,然后一个网络设备,宿主机默认的一个叫docker0(根据支持网络的不同,可能是交换机、路由器啥的)

先看宿主机的设备和ip:

bash 复制代码
ip link show

ip addr show dev docker0

如图:

再看容器内部:

bash 复制代码
# 注意默认的debian镜像内没有ip工具,以下安装命令
apt update -y && apt install -y iproute2

ip link show

ip addr show dev docker0

如图:

  1. 网络驱动(Network Driver)

Docker 采用插件化架构,不同驱动决定网络的实现方式:

  • bridge:默认桥接
  • host:共享宿主机网络
  • overlay:跨主机通信
  • macvlan:直连物理网络
  • none:无网络

其实还有另外俩类:

  • container:就是共享另外一个容器的网络

  • 第三方插件:一个Calico为代表的

后面越写越多,感觉写不完,只写基础网络吧,overlay、macvlan、calico留待高级部分

先看看当前主机上的docker网络

bash 复制代码
docker network ls

这里刚好就有3中的类型的网络:bridge、host、none

docker网络的实验

none

原理: 容器仅保留 lo 回环接口,完全隔离
适用场景: 安全沙箱、纯计算任务
优点: 最高安全性,无网络暴露
缺点: 无法通信,仅限内部计算

前置实验步骤:

none就是不给网卡的意思,也就无法安装ip工具,所以得提前安装,弄一个还有ip工具的镜像:

这里不讨论Dockerfile,纯手工制作一个,方便简单:

bash 复制代码
# 1. 启动一个容器
docker run -it --rm --name debian debian:trixie /bin/bash

# 2. 安装ip工具
apt update -y && apt install -y iproute2

# 3. 另外开一个shell,在主机执行
docker commit debian debian:trixie-ip

这样就能看到一个自己创建的镜像:

bash 复制代码
docker images

继续实验吧:

bash 复制代码
docker run -it --rm --name debian_none --network none debian:trixie-ip /bin/bash

容器内部看一下:

容器外看一下配置:

bash 复制代码
docker inspect debian_none

补充一下:

通过docker inspect 直接查看网络名字,也可以看当前链接到这个网络的容器:

bash 复制代码
docker network inspect none

host

原理: 共享宿主机网络命名空间,无独立IP
适用场景: 高性能需求、广播/组播应用
优点: 无NAT,延迟极低,性能最优
缺点: 端口冲突风险高,隔离性差

简单说,就是放弃使用docker的网络功能,直接挂在主机上,优点就是结构接单,所以没有任何网络性能损失,缺点就是网络隔离性差,端口冲突风险高。但是实际使用中也不常见:使用这种情况的,大部分都是实验场景或者追求极致性能的场景,一台主机上也不会部署多个容器。这种只是利用利docker的环境隔离功能,方便程序升级和回退而已。

启动一个看看:

bash 复制代码
docker run -it --rm --name debian_host --network host debian:trixie /bin/bash

容器内部看一下:

乍一看,还以为看错了,这不就是宿主机的ip和网卡吗?是的,这就是host的意义

container

原理: 与指定容器共享网络命名空间
适用场景: 容器间高速通信、特殊拓扑
优点: 通信效率高,无额外网络开销
缺点: 依赖目标容器,灵活性低

有没有遇到这种场景:我想搭建一个redis,只给这个程序用,但是不想捆绑在这个程序的镜像里面,因为太大了,频繁升级的时候不方便,还容易丢数据?

还有没有这种场景:对于测试服务器,我想随时监控器性能和日志,但是又不想把监控程序和日志数据放在程序包里面?

这种就非常使用使用共享网络了,就是container模式:

来试试:

bash 复制代码
# 1. 先启动一个容器,作为共享网络的目标容器
docker run -it --rm --name debian_container  debian:trixie /bin/bash

# 2. 再启动一个容器,指定共享网络为目标容器
docker run -it --rm --name debian_container_2 --network container:debian_container debian:trixie /bin/bash

先看看确实是启动了2个容器:

然后发现网络信息完全一样:

看起来好像进入了一个容器,怀疑的,可以测试一下:在一个容器中touch一个文件,然后在另外一个里面看看有没有。

bridge

bridge为什么放在最后一个说?因为他是docker最常见、最常用、默认的网络驱动模式(上一个实验中,没指定网络,其实就是bridge网络)

原理: 基于Linux Bridge的虚拟网桥,提供隔离的网络环境
适用场景: 单机多容器互联
优点: 隔离性高,安全性强
缺点: 性能略低,需要额外网络开销

补充一下:他也能多主机通信,但是利用主机网络,端口映射的,这个后面再说

首先,他是docker的默认网络,就是如下俩个命令是等效的:

bash 复制代码
docker run -it --rm --name debian debian:trixie /bin/bash

docker run -it --rm --name debian --network bridge  debian:trixie /bin/bash

注意: 这里的bridge,是docker的默认网络,就是docker安装完自动创建的,所以他是一个名字为bridge,驱动为bridge类型的网络,可以直接使用。如果需要自定义名称,就必须自己创建了。后文会详细介绍。

先创建俩个镜像,连接到brighe网络:

bash 复制代码
docker run -it --rm --name debian1 debian:trixie /bin/bash

docker run -it --rm --name debian2 debian:trixie /bin/bash

先分别看一下各自的容器的网络信息:

bash 复制代码
ip addr show

容器1:

容器2:

再看一下bridge网络信息:

bash 复制代码
docker network inspect bridge

总结一下网络信息:

容器1: ip地址是172.17.0.2

容器2: ip地址是172.17.0.3

bridge网络:网桥名称是docker0,网卡名称是docker0,ip地址是172.17.0.1

然后可以ping一下,看看网络通不通:

注意:默认debian镜像没有ping,需要自己 安装:

bash 复制代码
apt install iputils-ping

自定义bridge网络

默认的bridge网络大部分时候是够用的,但是基于很多原因,需要自定义网络:

1、比如我想让几个网络不互通:当连接一个bridge网络的时候就做不到

2、例如我有大量的容器镜像需要创建的时候,需要对ip地址就行分配管理:例如教学环境、考试环境等等

实验步骤:

bash 复制代码
# 创建一个bridge网络
docker network create \
  --driver bridge \
  --subnet=10.10.0.0/24 \
  --gateway=10.10.0.1 \
  --ip-range=10.10.0.128/25 \
  mynet

简单解释一下:

创建一个名字叫mynet的网络,驱动是bridge,子网是10.10.0.0/24,网关是10.10.0.1,ip范围是10.10.0.128/25,就是虽然分了一个C的子网,但是限制ip分配范围。

启动2个容器:

bash 复制代码
docker run -it --rm --name debian1 --network mynet debian:trixie /bin/bash

docker run -it --rm --name debian2 --network mynet debian:trixie /bin/bash

分别看一下俩个容器的ip,并ping一下彼此:

容器1:

容器2:

小结

单机(宿主机)下的网络,主要应用就差不多了,高级的网络,大部分都是用于集群,下篇准备

欢迎关注:
Docker 入门之网络基础

相关推荐
竹之却2 小时前
【Agent-阿程】openclaw v2026.4.9更新内容介绍
开发语言·php·openclaw·openclaw 更新
熊猫笔记2 小时前
PHP将Word文件转换为PDF文件的三种方式,以及中文乱码解决
php
LSL666_2 小时前
计算机网络——网络模型和TCP
网络·计算机网络
fqq32 小时前
Http方法详解
网络·网络协议·http
ꪶꪜ4452 小时前
vlan综合实验
linux·运维·网络
Bruce_Liuxiaowei3 小时前
HTTPie 完全指南:比 curl 更人性化的 HTTP 调试工具
网络·网络协议·http
❀͜͡傀儡师3 小时前
使用 Docker 部署 Neko 自托管虚拟浏览器(Firefox)
docker·容器·firefox
亚空间仓鼠3 小时前
OpenEuler系统常用服务(八)
linux·运维·服务器·网络
Blurpath住宅代理3 小时前
跨境数据采集为何总“看错市场”?IP地理定位偏差的技术解析与应对策略
网络·静态ip·代理ip·住宅ip·静态代理