摘要

在基于 Docker 构建微服务架构时,网络配置在确保服务间高效、稳定通信中起着核心作用。bridge 是容器启动时默认采用的网络模式,适用于大多数独立容器之间的通信场景,在学习 Kubernetes 网络之前,我们必须要先对 Docker 网络有所理解才行。这篇文章带你一步步看懂 Docker 默认的 Bridge 网络是如何工作的,合理选择网络模式,是构建稳定、安全、可维护的 Docker 微服务系统的重要前提。 

在学习 Kubernetes 网络之前,我们必须要先对 Docker 网络有所理解才行。这篇文章带你一步步看懂 Docker 默认的 Bridge 网络是如何工作的,一看就懂、简单明了。

环境说明

我使用的环境:

  • Kubernetes 集群:1个master节点 和 2个worker节点
  • Calico 网络插件
  • Docker 作为容器运行时

如果你只想了解Docker 网络,不用搭建 K8s,只安装 Docker 就足够。


一、环境准备:安装前后对比网络状态

1.1 安装 Docker 前

先查看本机原本的网络接口,方便后面对比变化:

bash

ip a

正常只会看到 loens33 这类系统自带网卡。

1.2 安装 Docker 后

安装完成后,再次执行:

bash

ip a s

你会发现多了一个 docker0,这就是 Docker 默认的网桥。

1.3 查看 Docker 自带网络

Docker 安装好后,会自动创建三种网络:

bash

docker network ls

  • bridge:默认网络
  • host:共享主机网络
  • null:无网络

安装 docker 之后这三种驱动就会创建出三个不同类型的网络。其中 bridge 是默认网络,创建容器时如果没有明确指定,都会自动加入这个网络

二、默认 Bridge 网络详解

2.1 查看默认网桥信息

bash

docker network inspect bridge

这里说明当前容器内容是空。

主要关注这三项:

  • 子网(Subnet)
  • 网关(Gateway)
  • 容器列表(Containers)

2.2 创建容器,观察网络变化

开两个终端:

终端 1:创建第一个容器

bash

docker run -it --name alpine0 --rm alpine sh

终端 2:查看网络变化

bash

ip a docker network inspect bridge

这时的结果与之前有所不同,

  1. 多了一个 veth 开头的虚拟网卡
  2. bridge 里出现了 alpine0 容器信息

2.3 看懂 veth pair(虚拟网线)

多出来的 vethxxx@ifx 是一对虚拟网卡,像一根网线的两端:

  • 一端在宿主机
  • 一端在容器里

它们是成对出现、互相连通的。

2.4 连通性测试

(1)容器访问外网

bash

ping baidu.com

默认 bridge 可以访问外网。

(2)宿主机访问容器

bash

ping 容器IP

可以通。

(3)容器之间互相访问

再开一个终端,启动第二个容器:

bash

docker run -it --name alpine1 --rm alpine sh

用 IP ping 可以通,用容器名 ping 不通。这就是因为 bridge 不支持 DNS 解析

2.5 端口映射(外部访问容器)

bash

docker run -d --name nginx-test -p 8080:80 nginx

访问:

plaintext

http://宿主机IP:8080你自己的http://宿主机IP:8080

就能看到 Nginx 页面。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐