容器技术 您所在的位置:网站首页 docker修改容器网络模式 容器技术

容器技术

2024-06-20 11:47| 来源: 网络整理| 查看: 265

基于 Docker18.09.0

Docker 系列文章目录

安装Docker和容器管理

Docker镜像管理

Dockerfile详解

Docker数据卷管理

Docker网络之默认网络

Docker网络之Host和none

Docker网络之自定义网络

容器端口发布

Docker 官方镜像仓库 之 Docker Hub

单机容器编排工具之 dockercompose

目录 Docker 系列文章目录前言1. 创建网络1.1 创建一个 `bridge` 网络1.2 创建一个 `bridge` 网络并指定子网 2. 把容器连接到网络2.1 简单容器网络的连接示例接下来我们就来实际操作一下,并观察各个容器网络的配置情况以及两个网桥的情况。1.首先,创建并运行两个容器,`container1` 和 `container2`:2.2 创建一个隔离的桥接网络 `my-net20` 2.3 现在将 `container2 加入到 `my-net20` 网络中2.4 运行第三个容器并指定网络。2.5 查看容器三的源数据网络部分2.6 再来查看容器二的元数据网络部分2.7 进入容器 `container2` 中,查看网卡信息2.8 尝试利用容器名进行通信测试 3. 从网络中断开一个容器的连接4. 删除一个自定义的网络

前言

本文将和大家分享关于 Docker 用户自定义网络的基本命令的使用,有如下命令:

docker network createdocker network lsdocker network inspectdocker network connectdocker network disconnectdocker network rm 1. 创建网络

除了默认的名为 docker0 的 bridge 网络 , 还可以创建自己的 bridge 网络或 overlay 网络。

bridge 网络用于在本机内容器之间的互通

overlay 网络用于在不同主机内的容器之间的互通

本文主要针对 bridge 网络进行演示说明, overlay 网络会在以后单独进行讨论。

1.1 创建一个 bridge 网络

运行命令 docker network -d 指定要创建什么类型的网络。 假如不使用 -d 参数,会创建 bridge 网络

$ docker network create -d bridge my-net # 或者 $ docker network create my-net

查看网络源数据

$ docker network inspect my-net [ { "Name": "my-net", "Id": "67b19436a9e361c8b9da4034c5903c4903444cecd3ecdbde62bbaf70828d49d9", "Created": "2018-12-10T07:22:53.2694852Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]

Doker 会为自定义的网络自动分配一个子网("Subnet": "172.18.0.0/16")。

1.2 创建一个 bridge 网络并指定子网

创建一个网络并指定子网为 172.20.0.0/16

$ docker network create --subnet=172.20.0.0/16 my-net20 $ docker network inspect my-net20 [ { "Name": "my-net20", "Scope": "local", ...略... "Config": [ { "Subnet": "172.20.0.0/16" } ] }, ...略... "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] 2. 把容器连接到网络

您可以将现有容器连接到一个或多个网络。 容器可以连接到使用不同网络驱动程序的网络,比如连接到 bridge 网络或者 overlay 网络。 连接后,容器可以使用其他容器的IP地址或名称进行通信。

2.1 简单容器网络的连接示例

在这里插入图片描述

说明:

上图中表明的意思是,在一台 Docker 主机 Dokcer Host 上有三个容器 。三个容器分别连接到两个不同的网络中。 容器 container1 连接到默认的桥接网络 bridge容器 container2 连接到默认的网络的 bridge,同时它还连接到自定义的桥接网络 my-net20 中。容器 container3 也连接到自定义的桥接网络 my-net20 接下来我们就来实际操作一下,并观察各个容器网络的配置情况以及两个网桥的情况。 1.首先,创建并运行两个容器,container1 和 container2: $ docker run -itd --rm --name=container1 alpine 368a503800d4007627d0b63946ef495ae8d5cc225fb7dd265fac62e40268b5f2 $ docker run -itd --rm --name=container2 alpine 8a83b0d89c2005f488d00e5dc4d46812a2aeb7f1bcec9f061d9762f6c901275e 2.2 创建一个隔离的桥接网络 my-net20

下面在创建网络的时候,使用了 --subnet 为此网络指定了一个子网 172.20.0.0/16

$ docker network create -d bridge --subnet 172.20.0.0/16 my-net20 124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a

注意现在 container1 和 container2 都被自动连接在默认的桥接网络 bridge 上

# 部分内容 "Containers": { "368a503800d4007627d0b63946ef495ae8d5cc225fb7dd265fac62e40268b5f2": { "Name": "container1", "EndpointID": "d02b2ab691e5940a74de77ec6a68d35d52c8800014a96f830f04890971587ce2", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "8a83b0d89c2005f488d00e5dc4d46812a2aeb7f1bcec9f061d9762f6c901275e": { "Name": "container2", "EndpointID": "2e330964b4cc2b5897eeb9fac15dbc03e4326cc47c087e0276de88509f64a0ac", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }, 2.3 现在将 container2 加入到my-net20` 网络中 $ docker network connect my-net container2

查看 my-net 网络,以验证

$ docker network inspect my-net20 [ { "Name": "my-net20", "Id": "124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a", "Created": "2018-12-11T13:02:03.0854486Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.20.0.0/16" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "8a83b0d89c2005f488d00e5dc4d46812a2aeb7f1bcec9f061d9762f6c901275e": { "Name": "container2", "EndpointID": "2663b56686a331e68de1a0c5955d9f3b8ef102653547e43f5d9ef8891d84ffd2", "MacAddress": "02:42:ac:14:00:02", "IPv4Address": "172.20.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] 2.4 运行第三个容器并指定网络。

下面我们运行第三个容器 container3,并且同时使用 --network 指定其加入网络 my-net20, 还使用了 --ip 来指定分配给容器的具体 IP 地址。

$ docker run -itd --rm --name=container3 --network=my-net20 --ip=172.20.0.100 busybox db4ef2529e81e20508e029ade69ffae08df6dcc538d426b49ca1d9b830d7f0c7

注意: 只有使用 --subnet 参数创建的网络,才能使用 --ip 参数指定一个具体的 IP 地址给一个容器

2.5 查看容器三的源数据网络部分

部分内容已截断

$ docker inspect container3 "Networks": { "my-net20": { "IPAMConfig": { "IPv4Address": "172.20.0.100" # 指定分配的地址 }, "Links": null, "Aliases": [ "db4ef2529e81" ], "NetworkID": "124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a", "EndpointID": "ec7774f1936d056ff4b39a862972e11c102d53c61669e5c230e47be35d65ca08", "Gateway": "172.20.0.1", "IPAddress": "172.20.0.100", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:14:00:64", "DriverOpts": null } } 2.6 再来查看容器二的元数据网络部分 "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "8a5f470ffe774f4f96a712642ed361fbeb0d8e66018e1d629ab44cfdf3e42a05", "EndpointID": "2e330964b4cc2b5897eeb9fac15dbc03e4326cc47c087e0276de88509f64a0ac", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:03", "DriverOpts": null }, "my-net20": { "IPAMConfig": {}, "Links": null, "Aliases": [ "8a83b0d89c20" ], "NetworkID": "124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a", "EndpointID": "2663b56686a331e68de1a0c5955d9f3b8ef102653547e43f5d9ef8891d84ffd2", "Gateway": "172.20.0.1", "IPAddress": "172.20.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:14:00:02", "DriverOpts": null } }

可以发现 container2 同时加入了两个网络 bridge 和 my-net20 ,并且有两个地址 172.17.0.3 和 172.20.0.2

2.7 进入容器 container2 中,查看网卡信息 $ docker exec -it container2 /bin/sh / # ip -4 a 1: lo: mtu 65536 qdisc noqueue qlen 1 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 97: eth0@if98: mtu 1500 qdisc noqueue inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever 100: eth1@if101: mtu 1500 qdisc noqueue inet 172.20.0.2/16 brd 172.20.255.255 scope global eth1 valid_lft forever preferred_lft forever

container2 有两个网络接口卡,分别分配了 IP地址。 这是因为,我们一开始运行这个容器的时候,被连接到默认的网络上,后来我们又执行了 docker network connect 命令,把它连接到了 my-net20 网络上了,所以这使其有两个网络,并且有两个网卡。

2.8 尝试利用容器名进行通信测试

Docker嵌入式DNS服务器可以为连接到给定网络的容器启用名称解析。

也就是说目前在 container2 中可以使用容器名和 container3 进行通信。 但是由于默认的网络 bridge 只支持通过 IP 地址通信,所以当 container2 和 container3 互相通信时,只能通过彼此的 IP 地址了。

$ docker exec -it container2 /bin/sh / # ping -w 2 container3 PING container3 (172.20.0.100): 56 data bytes 64 bytes from 172.20.0.100: seq=0 ttl=64 time=0.406 ms 64 bytes from 172.20.0.100: seq=1 ttl=64 time=0.176 ms --- container3 ping statistics --- 3 packets transmitted, 2 packets received, 33% packet loss round-trip min/avg/max = 0.176/0.291/0.406 ms / # ping -w 2 container1 ping: bad address 'container1' / # ping -w 2 172.17.0.2 PING 172.17.0.2 (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.246 ms 64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.162 ms --- 172.17.0.2 ping statistics --- 3 packets transmitted, 2 packets received, 33% packet loss round-trip min/avg/max = 0.162/0.204/0.246 ms / # exit # 退出容器

注意: container3 和 container1 并没有任何共同的网络,所以他们是无法通信的。

$ docker exec -it container3 /bin/sh / # ping -w 2 172.17.0.2 PING 172.17.0.2 (172.17.0.2): 56 data bytes --- 172.17.0.2 ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss / #

其实即使容器未运行,您也可以将容器连接到网络。但是,docker network inspect仅显示有关正在运行的容器的信息。

3. 从网络中断开一个容器的连接 docker network disconnect 网络名 容器名 4. 删除一个自定义的网络 docker network rm 网络名


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有