书籍来源:《Kubernetes网络权威指南:基础、原理与实践》


本节将简单介绍Docker中的网络配置、网络端口映射、容器互联、DNS配置等实战知识。

2.3.1 查看容器IP

查看一个正在运行的容器被分配了什么IP地址,一般有两种方式:从外面看和从里面看。从外面看即使用docker inspect命令:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_Docker

其实也等价于:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_Docker_02

从里面看就是指通过docker exec或docker attach进入容器,通过ip或ifconfig命令查看。

2.3.2 端口映射

在使用docker run的时候可以使用-P或者-p命令进行容器和主机之间的端口映射。使用-P(大写)不需要指定任何映射关系。使用-p(小写)则需要指定主机的端口应该映射到容器的哪个端口:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_docker_03

Docker容器端口映射原理都是在本地的iptable的nat表中添加相应的规则,将访问本机IP地址:hostport的网包进行一次DNAT,转换成容器IP:containerport。查看iptables得到验证:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_网络_04

DNAT发生在DOCKER这条iptables链,它有两处引用,分别是PREROUTING链和OUTPUT链,意味着从外面发到本机和本地进程访问本机的1234端口的包目的地址都会被修改成172.17.0.2:80。

使用docker port命令查看容器的端口在主机上的映射:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_Docker_05

2.3.3 访问外网

默认情况下,容器可以使用docker0网桥上的接口访问外部网络的连接。如果发现访问不了外网,需要确认系统的ip_forward是否已打开。

kubernetes 权威指南 第五版下载 kubernetes权威指南5_网络_06

或者检查docker daemon启动的时候--ip-forward参数是否被设置成false。

至于SNAT/MASQUERADE,Docker会在POSTROUTING链上自动创建规则:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_网络_07

即从容器网段出来访问外网的包,都要做一次MASQUERADE,即出去的包都用主机的IP地址替换源地址。

2.3.4 DNS和主机名

容器中的DNS和主机名一般通过三个系统配置文件(/etc/resolv.conf、/etc/hosts、/etc/hostname)维护。在容器内修改这三个文件会立即生效,但容器重启后修改又会失效。如果想统一、持久化配置,可修改主机Docker Daemon的配置文件(/etc/docker/daemon.json):

kubernetes 权威指南 第五版下载 kubernetes权威指南5_docker_08

也可以在docker run时使用--dns=address参数来指定。

可以在运行docker run创建容器时使用参数-h hostname或者--hostname hostname配置Docker容器的主机名。

2.3.5 自定义网络

Docker默认会创建一个docker0网桥,这个网桥和Docker容器使用的网段是可以自定义的。

  • --bip=CIDR,即配置接到这个网桥上的容器的IP地址网段,例如192.168.1.0/24;
  • --mtu=BYTES,配置docker0网桥的MTU(最大传输单元)。

如果已经使用默认配置启动Docker Daemon,又希望自定义个网段,可以使用下面的命令:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_docker_09

通过ip addr命令确认:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_docker_10

可以使用inspect命令查看某个网络的详细信息:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_Docker_11

也可以加上network前缀:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_kubernetes_12

查看主机上有多少个docker network:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_Docker_13

默认情况下,Docker Daemon会预创建3个网络,分别使用对应的网络模式作为网络名称,即上面列出的bridge、host和null(对应none模式)。

使用network rm命令删除某个网络:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_Docker_14

连接一个容器到网络中:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_网络_15

将容器和网络断开:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_kubernetes_16

2.3.6 发布服务

Docker service是Docker的一个子命令:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_网络_17

Docker的service有点类似于Kubernetes的Service概念。

kubernetes 权威指南 第五版下载 kubernetes权威指南5_docker_18

以上三条命令,先创建一个Docker的网络,然后发布一个服务,最后将这个服务和容器绑定,这样就达到了把容器当作服务发布的目的。

也可以用下面这条命令一次性实现:

kubernetes 权威指南 第五版下载 kubernetes权威指南5_IP_19

2.3.7 docker link:两两互联

docker link是一个遗留的特性,在新版本的Docker中,一般不推荐使用。

简单地说,docker link就是把两个容器连起来,相互通信。不过,link方式仅解决了单机容器间点对点的互联问题。

kubernetes 权威指南 第五版下载 kubernetes权威指南5_kubernetes_20