Docker 网络通信。
- 1.Docker 容器网络通信的基本原理
- 1.1 查看 Docker
- 1.2容器网络 宿主机与 Docker 在容器中建立网络通信的过程
- 2.使用命令查看 Docker 网络配置信息
- 3.Docker 的 4 网络通信模式
- 3.1 bridge 模式。
- 3.2 host 模式。
- 3.3 container 模式。
- 3.4 none 模式。
- 4.容器间通信。
- 4.1 通过 IP 通信地址
- 4.2 通过 Docker DNS Server 通信。
- 4.3 通过 Joined 通信方式
- 4.4 集装箱之间的跨节点通信
- 4.4.1 三种方式。
- 4.4.2 Overlay 网络与注册中心
- 5. 网络访问控制容器。
- 5.1 访问外部网络进行容器应用。
- 5.2 从外部网络访问容器中的应用。

Docker 宿主机虚拟机上运行的容器。这些虚拟机相互独立,彼此之间没有界面也就是说,容器是相互的。 逻辑隔离。是的。
所以如何实现容器的相互通信?容器如何访问外部网络?如何访问外部网络部署在容器中的应用?本博客将引导您了解这些问题。
1.Docker 容器网络通信的基本原理。
Docker 默认情况下,容器中的网络接口为 虚拟接口。。虚拟接口最大的优点是转发效率高。这是因为 Linux 虚拟接口之间的数据转发通过在内核中复制数据来实现c;发送接口缓存中的数据包将直接复制到接收接口的缓存中,无需通过外部物理网络设备进行交换。
⭐ 虚拟接口和正常的以太网卡没有太大区别c;只是它的速度比以太网卡快得多。
Docker 网络得到了很好的利用 Linux 虚拟网络技术,在宿主机的物理网卡和容器中创建虚拟接口(veth。
),并让它们通过宿主机。 docker0。
网桥连接我们把这样的一对。 veth。
叫做。 veth pair。
。

1.1 查看 Docker
基于容器网络 CentOS 创建容器的镜像c;并进入容器。
docker。run。 -it。centos /bin/bash。
为了查看容器的网络信息,安装在容器内。 net-tools。
网络工具。
yum。 install。-y。net-tools。
打开宿主机命令行窗口,执行以下命令查看宿主机。 docker0。
网桥信息。
ifconfig。
执行以下命令在容器内查看容器网络信息。
ifconfig。
容器中的网络宿主机的地址网络地址相同。 flag。
。这说明创建容器时,它将成对地创建。 veth pair。
,它们通过宿主机。 docker0。
网桥通信。
1.2 宿主机与 Docker 在容器中建立网络通信的过程

2.使用命令查看 Docker 网络配置信息
使用以下命令查看 Docker 网络通信模式。
docker。network。 ls。
查看。 bridge。
模型的详细信息。
docker。network inspect 20ca9d84d5b4。
3.Docker 的 4 网络通信模式
3.1 bridge 模式。
bridge。
模式是 Docker 默认的网络通信模式,是开发者最常用的模型。在。
bridge。 模式下c;Docker 引擎将创建一个独立的网络命名空间。这样,每个命名空间中运行的容器都有独立的网卡和其他网络资源。
使用。
bridge。 该模式可以非常方便地实现容器之间的网络隔离,以及容器与宿主机之间的网络隔离。使用宿主机
docker0。 网桥,可实现多个容器(甚至外部网络)网络通信。
3.2 host 使用模式。
host。
模式c;与宿主机共享相同的网络命名空间,容器的 IP 宿主机的地址 IP 地址相同。如果宿主机有公共网络 IP 地址,容器也有这个公网。 IP 地址。也就是说,宿主机可以直接使用容器 IP 地址与外界通信,宿主机的端口也可以直接用于容器内服务的端口c;不需要任何转换。 因为在。
host。
宿主机的转发不再需要在模式下进行c;因此,它的性能有了很大的提高。 尽管使用。
host。

通过模式非常方便。 localhost。
或者。 127.0.0.1.
实现容器与宿主机的相互访问,性能也比较好,但这种模式也存在以下两个问题: 因为容器使用了宿主机的网络环境,因此,网络环境的隔离功能减弱,导致宿主机和容器争夺网络资源。容器本身不再拥有所有的网络资源,与宿主机共享网络资源
宿主机和容器使用相同的网络资源 IP 地址,这不利于网络的配置和管理。
- 3.3 container 模型。在。
- container。
模式下c;网络环境将在容器之间共享。也就是说,一个容器将使用另一个容器的网络命名空间。因此,,在这种模式下c;它可以通过容器之间。
localhost。 或者。
127.0.0.1. 相互访问,从而提高了传输效率。
⭐。 container。
该模式节省了网络资源,但在这种模式下运行的容器没有网络隔离。Container 网络的隔离性在。
bridge。 网络与。
host。 网络之间。
container。 在某些特殊场景中,模式非常有用。例如,在 K8s 中创建 Pod 时,会首先创建 Pod 基本容器;而 Pod 使用其他容器。
container。
通信模式和基本容器。Pod 使用中间的每个容器 localhost 或者。
127.0.0.1. 通信,从而将 Pod 所有容器在中间形成逻辑整体
3.4 none 模式。 none。
该模式下的容器具有独立的网络命名空间,但是没有任何网络配置。只能通过 Local Loopback 通信网卡和容器#xff0c;也就是说,只能用。

localhost。
或者。
127.0.0.1. 访问容器。
在 none。
在模式下,需要手动配置网络,例如使用。
pipwork。 指定容器的工具 IP 地址等。
4.容器间通信。 4.1 通过 IP 通信地址。
在宿主机上创建容器时,Docker 保护过程将自动分配虚拟的每个新创建的容器 IP 但是,外部网络无法通过这种虚拟 IP 访问容器中的应用程序地址。
⭐ 这个虚拟 IP 地址只提供 Docker 内部容器相互通信。也就是说,通过这个 IP 地址实现了 Docker 内容器之间的连接
4.2 通过 Docker DNS Server 通信。在实际使用过程中,通过容器的虚拟 IP 容器间地址的相互通信对管理和维护非常不利。
从 Docker 1.10 版本开始Docker 引擎有一个嵌入式发动机 DNS Server。有了它,容器之间可以通过容器名称直接通信。这种通信方式也很简单,启动容器时,使用。
--name。
参数可以用容器命名。
docker。
run。 -it。
--network。
=bridge2。 --name。box1 busybox。docker。run。 -it。--network。=bridge2。 --name。box2 busybox。bridge2。是一个。 bridge。自定义网络的模式。
busybox。
一个集成了100多个最常用的 Linux 软件工具箱的命令和工具。 box1。
、。box2.
是容器名称。例如,在容器中。
box1。内执行。
ping。
命令,确认是否可以使用容器名与对方通信。 ping。
box2。 4.3 通过 Joined 通信的方式。
Joined 是 Docker 发动机提供的一种特殊的容器间通信方式,本质上是用的。
container。模式。因为在。
container。
模式下c;多个容器共享相同的网络环境,还共享网卡配置。所以,在。 container。
模式下c;可直接通过容器。 localhost。
或者。 127.0.0.1.
通信。 例如,在。
box2。 容器,通过。
wget 127.0.0.1.
可以直接访问命令。 box1。
容器 HTTP 服务。 4.4 容器之间的跨节点通信。在同一个宿主机中,可以使用多个不同的容器。
docker0。 网桥直接通信。并且在实际项目中,一个复杂的系统通常需要部署多个组件,为了提高组件的运行效率,这些组件通常部署在不同的主机上。所以在 Docker 如何实现容器间的跨节点通信?
4.4.1 三种方式。
通过宿主机上容器的端口映射实现通信。
。通过这种方式实现容器间的跨节点通信,宿主机需要转发,所以使用起来很不方便。 通过 Docker Overlay 网络实现通信。
.这样,容器本身的虚拟可以直接使用 IP 相互通信地址,这与不同容器之间在同一宿主机上运行的通信方式完全相同。Docker 原生的 Overlay 网络是实现容器跨节点通信的主流方式。应使用它 Overlay 网络,需要注册中心的支持。
容器间的跨节点通信通过第三方网络实现。
- 4.4.2 Overlay 网络与注册中心。Overlay 在不改变现有网络的前提下,网络是,对 IP 报纸包装数据,从而利用 IP 实现数据转发功能的路由协议。在 Overlay 在网络中c;通过扩展标识符可以支持 16M 的用户。
- Docker 的 Swarm 集群便是 Overlay 实现网络,而使用 Overlay 网络需要注册中心的支持。注册中心可以提供注册和发现功能的服务。Docker 有支持的注册中心。Zookeeper。
- 、。Consul。
和。
ETCD。
。 5. 网络访问控制容器。
5.1 访问外部网络的应用程序在容器中。在默认情况下,外部网络通过宿主机访问容器中的应用。docker0。
网桥。当容器中的应用程序需要访问外部网络时,,宿主机需要转发。 宿主机可以通过执行以下指令来确定 Linux 是否开启了 IP 数据包转发功能。
sysctl。
net.ipv4.ip_forward。
假如回来了。
1 1。
这意味着它已经打开了。
如果返回。
0 0.0
- 。c;这意味着它没有打开。 可以执行以下句子来打开此功能。 sysctl。-w。
- net.ipv4.ip_forward。 = 1.打开此功能的另一种方式是,在启动 Docker 指定服务时的参数。
--ip-forward=true。
。这样 Docker 宿主机将在守护过程中自动使用。ip_forward。设置为参数。1 1.1.1.
从外部网络访问容器中的应用。 运行在宿主机上的容器,允许从外部网络访问其内部应用,这主要是通过。
-p。 实现参数。
在创建容器时指定。 -p。 参数,可以将容器内的某个端口绑定到宿主机,完成宿主机和容器的端口映射。基本质是:在宿主机。iptable。
在表中添加相应的路由转发规则,对访问外部 IP 转换地址的数据包,将其访问的目标地址修改为容器 IP 以及集装箱中的端口地址。
基于 Nginx 创建容器的镜像c;并将容器的。 80 80.
80.
端口映射到宿主机。 1234 1234.
1234. 端口。
docker。
run。 -d。 -p。1234。 :80 nginx。 在宿主机上,查看以下命令。iptable。
表中的路由转发规则。iptables。 -t。nat。-L。-n。
|。 grep。
1234。