docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker网络容器通信

Docker网络进行容器通信与隔离之道的实践指南

作者:敲上瘾

这篇文章主要为大家详细介绍了Docker中网络的相关知识,包括常见网络类型,如何实现容器间通信等内容,文中的示例代码讲解详细,需要的小伙伴可以了解下

一、Docker网络概念

1.1 Docker为什么需要网络

1.2 常见网络类型

二、网络命令

docker network create

功能:创建自定义网络

语法:

docker network create [OPTIONS] NETWORK

关键参数:

示例:

docker network inspect

功能:查看网络详情

语法:

docker network inspect [OPTIONS] NETWORK [NETWORK...]

关键参数:

-f, --format: 指定格式

示例:

docker network connect

功能:用于将容器连接到网络,可以按名称或 ID 连接容器。连接后,容器可以与同一网络中的其他容器通信。

语法:

docker network connect [OPTIONS] NETWORK CONTAINER

关键参数:

示例:

docker network disconnect

功能:断开网络

语法:

docker network disconnect [OPTIONS] NETWORK CONTAINER

关键参数:

-f:强制断开

示例:docker network disconnect web1 mybox1

docker network prune

功能:删除不使用的网络

语法:

docker network prune [OPTIONS]

关键参数:

示例:

docker network rm

功能:删除 1 个或者多个网络

语法:

docker network rm NETWORK [NETWORK...]

关键参数:

-f: 强制删除

示例:

docker network ls

功能:列出网络

语法:

docker network ls [OPTIONS]

别名:docker network list

关键参数:

示例:

三、网络模式的设置

docker Bridge网络

bridge网络结构:

              +---------------+
              |   Internet    |
              +-------+-------+
                      |
             +--------+---------+
             |   Host eth0      |
             | 192.168.1.100/24 |
             +--------+---------+
                      |
                      | (NAT)
+---------------------+------------------------+
|               docker0 Bridge                 |
|              172.17.0.1/16                   |
+--------+----------------------------+---------+
        |                            |
        | (veth pair)                | (veth pair)
        |                            |
+--------+----------+       +---------+---------+
|   Container A     |       |   Container B     |
|                   |       |                   |
|    eth0:          |       |    eth0:          |
|   172.17.0.2/16   |       |   172.17.0.3/16   |
+-------------------+       +-------------------+

在创建容器时没有使用--network参数指定网络时,默认连接到docker模式。

注意:docker 自定义桥接网络支持通过Docker DNS服务进行域名解析,也就是我们可以直接通过使用容器名进行通信,因为DNS服务可以解析容器名到IP地址的映射,但是默认的Bridge网络时不支持DNS的。

案例:让两个容器连接到同一个自定义网络进行通信

1.创建自定义网络web1

docker network create web1

2.创建并启动两个busybox容器,并且将容器连接到网络web1

3.进入box1容器检验是否能与box2通信

4.进入box2容器检验是否能与box1通信

5.创建一个容器box3使用默认的bridge

docker run -itd --name=box33 --name=box3 busybox

6.验证是否能进行DNS域名解析和是否能与使用自定义网络的容器通信

效果如下:

注意:容器启动后,Docker 有时不会明确提示运行结果(成功 / 失败),因此建议每次启动容器后,通过docker psdocker ps -a命令检查容器状态。

3.1 host网络

host网络结构:

                            +---------------+
                            |   Internet    |
                            +-------+-------+
                                    |
+-------------------------------------------------+
|                   Docker Host                   |
|                                                 |
|  +---------------------+                        |
|  |   Host eth0         +------------------------+
|  | 192.168.1.100/24    |                        |
|  +---------------------+                        |
|                                                 |
|  +-------------------------------------------+  |
|  |              Container                    |  |
|  |                                           |  |
|  |  (直接使用宿主机的网络栈)                     |  |
|  |  (共享 eth0: 192.168.1.100/24)             |  |
|  +-------------------------------------------+  |
+-------------------------------------------------+

示例:

运行容器使用host网络

docker run -itd --name=box4 --network host busybox

检查宿主机网络配置信息和容器的网络配置信息是否相同

该模式的缺点:宿主机和容器的端口是共用的,无隔离,所以不能让它们用相同的端口。

测试:

因为将宿主机nginx服务启动(默认是80端口)

nginx

启动一个nginx容器(默认使用的也是80端口)使用host网络,看是否出现冲突

docker run -d --name=web1 --network host nginx:1.24.0

检查该容器是否在正常运行

3.2 container网络

container网络结构:

                      +---------------+
                      |   Internet    |
                      +-------+-------+
                              |
                     +--------+---------+
                     |   Host eth0      |
                     | 192.168.1.100/24 |
                     +--------+---------+
                              |
                     +--------+---------+
                     |   docker0 Bridge |
                     |  172.17.0.1/16   |
                     +--------+---------+
                              |
                              | (veth pair)
+-------------------+       +--+-------------------+
|   Container A     |       |   Container B      |
|  (网络提供者)       |       |  (共享网络栈)       |
|                   |       |                    |
|    eth0:          |       |                    |
|   172.17.0.2/16   +-------+                    |
|                   |       | 使用Container A的   |
+-------------------+       | 网络命名空间         |
                           | eth0: 172.17.0.2/16|
                           +-------------------

该模式和host模式类似,只是对象换成了容器

示例:

启动box5容器以container模式连接到box1

docker run -itd --name=box5 --network container:box1 busybox

检查网络联通性

断开box1的网络,检查box5网络变化

启动box1的网络,检查box5网络变化

3.3 none网络

none网络就是指没有网络,处于这个模式下的容器除了lo(本地环回),没有任何虚拟网卡。

示例:

创建并启动容器,网络设置为none模式

docker run -itd --name=box6 --network none busybox

尝试ping百度

docker exec -it box6 ping www.baidu.com

查看ifconfig

docker exec -it box6 ifconfig

效果:

以上就是Docker网络进行容器通信与隔离之道的实践指南的详细内容,更多关于Docker网络容器通信的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文