docker 学习(6)—— 容器管理技术:高级网络管理

177 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

1. Docker 本地网络类型

1.1 查看支持网络类型


docker network ls


NETWORK ID NAME DRIVER SCOPE

137e2fd68513 bridge bridge local

c43acf6a922f host host local

295eb17c2c16 none null local

1.2 测试使用各类网络类型


docker run network=xxx

  • none:无网络模式

  • bridge:默认模式,相当于 NAT

  • host:公用宿主机 Network NameSpace

  • container:与其他容器公用 Network Namespace

1.2.1 bridge

bridge 是启动容器默认的一种网络类型,相当于 NAT 的一种模式。

我们使用 ifconfig,可以看到有个 docker0 的网络。


docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500

inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0

inet6 fe80::42:aeff:fe30:bf0f prefixlen 64 scopeid 0x20<link>

ether 02:42:ae:30:bf:0f txqueuelen 0 (Ethernet)

RX packets 49768 bytes 5180725 (4.9 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 54077 bytes 346273392 (330.2 MiB)

docker0 网络就是 NAT 的网桥,是 172.17.0.1

宿主机有对外的端口,eth0eth1 ……,装完 docker,会有一个 docker0 的网桥,这个网桥的默认网段是 172.17.0/16

每次启动容器,容器内部也会有一个 eth0 网卡,地址假如是 172.17.0.2。通过网桥,容器可以和宿主机访问了。

如果容器想要上网,对外访问,怎么办呢?docker0 会提供一个 NAT 功能,通过 eth0 出去,访问网址。

内部访问外部:比如访问 baidu.com,容器先丢给 docker0,docker0 再丢给 eth0,eth0 去访问外部网址。

外部访问内部:其实是加了几条 iptables 规则,比如对宿主机上访问 8080,转到容器的 80,对宿主机上访问 33060,转到容器的 3306 端口。

bridge 只提供容器内部之间访问、以及容器与宿主机之间访问、以及容器内部上网的功能,但是没有提供外部访问内部端口的功能。只能通过映射访问内部的端口。

1.2.2 host

host 隔离性没有 bridge 强了,但是可以共用宿主机端口了。

其他依旧隔离,但是网络不隔离。

host 用的并不多,性能很好,但是隔离性不高。如果我们起了一个 80 端口的容器,就不能再启动一个 80 端口的容器了。

host 不存在跨主机的概念了,因为访问容器就相当于访问宿主机了。

1.2.3 container

多个容器公用一个 NameSpace。

不能同时使用,谁先占用算谁的。

适用场景:高可用。开了两个容器,一个正常服务,一个做备用。

1.3 实践演示

1.3.1 bridge 模式演示

  1. 启动一个 --network=bridge 类型的 docker

docker container run -it --name="centos_bridge" --network=bridge centos:6.9 /bin/bash

  1. 查看 eth0 网卡,可以看到网址是 172.17.0.2

[root@dffe83cca591 /]# ifconfig

eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02

inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0

inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:8 errors:0 dropped:0 overruns:0 frame:0

TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:656 (656.0 b) TX bytes:656 (656.0 b)

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:65536 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

  1. 测试访问百度,发现可以 ping 成功

yum install -y iputils

ping baidu.com

  1. 另外启动一个容器

docker container run -it --name="centos_bridge2" --network=bridge centos:6.9 /bin/bash

  1. 测试容器内能否访问,在第一个容器 ping 第二个容器地址,发现可以正常 ping 通。

ping 172.17.0.3

  1. 本地宿主机测试访问容器

ping 172.17.0.2

  1. 跨主机无法互联

1.3.2 host 模式演示

  1. 启动容器

docker container run -it --name="centos_host1" --network=host centos:6.9 /bin/bash

  1. 查看地址、端口(和宿主机是一样的)

ifocnfig

  1. 如果确定在容器中还是 docker 中:输入一个 docker 命令,容器中没有 docker 命令,宿主机中有 docker 命令。