书籍来源:《Kubernetes网络权威指南:基础、原理与实践》
本节将简单介绍Docker中的网络配置、网络端口映射、容器互联、DNS配置等实战知识。
2.3.1 查看容器IP
查看一个正在运行的容器被分配了什么IP地址,一般有两种方式:从外面看和从里面看。从外面看即使用docker inspect命令:
其实也等价于:
从里面看就是指通过docker exec或docker attach进入容器,通过ip或ifconfig命令查看。
2.3.2 端口映射
在使用docker run的时候可以使用-P或者-p命令进行容器和主机之间的端口映射。使用-P(大写)不需要指定任何映射关系。使用-p(小写)则需要指定主机的端口应该映射到容器的哪个端口:
Docker容器端口映射原理都是在本地的iptable的nat表中添加相应的规则,将访问本机IP地址:hostport的网包进行一次DNAT,转换成容器IP:containerport。查看iptables得到验证:
DNAT发生在DOCKER这条iptables链,它有两处引用,分别是PREROUTING链和OUTPUT链,意味着从外面发到本机和本地进程访问本机的1234端口的包目的地址都会被修改成172.17.0.2:80。
使用docker port命令查看容器的端口在主机上的映射:
2.3.3 访问外网
默认情况下,容器可以使用docker0网桥上的接口访问外部网络的连接。如果发现访问不了外网,需要确认系统的ip_forward是否已打开。
或者检查docker daemon启动的时候--ip-forward参数是否被设置成false。
至于SNAT/MASQUERADE,Docker会在POSTROUTING链上自动创建规则:
即从容器网段出来访问外网的包,都要做一次MASQUERADE,即出去的包都用主机的IP地址替换源地址。
2.3.4 DNS和主机名
容器中的DNS和主机名一般通过三个系统配置文件(/etc/resolv.conf、/etc/hosts、/etc/hostname)维护。在容器内修改这三个文件会立即生效,但容器重启后修改又会失效。如果想统一、持久化配置,可修改主机Docker Daemon的配置文件(/etc/docker/daemon.json):
也可以在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,又希望自定义个网段,可以使用下面的命令:
通过ip addr命令确认:
可以使用inspect命令查看某个网络的详细信息:
也可以加上network前缀:
查看主机上有多少个docker network:
默认情况下,Docker Daemon会预创建3个网络,分别使用对应的网络模式作为网络名称,即上面列出的bridge、host和null(对应none模式)。
使用network rm命令删除某个网络:
连接一个容器到网络中:
将容器和网络断开:
2.3.6 发布服务
Docker service是Docker的一个子命令:
Docker的service有点类似于Kubernetes的Service概念。
以上三条命令,先创建一个Docker的网络,然后发布一个服务,最后将这个服务和容器绑定,这样就达到了把容器当作服务发布的目的。
也可以用下面这条命令一次性实现:
2.3.7 docker link:两两互联
docker link是一个遗留的特性,在新版本的Docker中,一般不推荐使用。
简单地说,docker link就是把两个容器连起来,相互通信。不过,link方式仅解决了单机容器间点对点的互联问题。