共计 2130 个字符,预计需要花费 6 分钟才能阅读完成。
凋谢容器端口
当应用 docker create
或者 docker run
创立并运行一个容器的时候,默认不会凋谢容器端口。
能够应用 --publish
或者 -p
选项来凋谢容器的端口,这时 Docker 就会创立一条防火墙规定,将宿主机的端口和容器的端口关联起来,宿主机的这个端口接管和收回的所有数据都会被转发到容器的端口中,这样的话外界或者宿主机上的其余容器和过程就能够通过宿主机的端口拜访容器的端口。
将容器的端口凋谢其实是一种不平安的行为,如果只是想让同一台宿主机之间的容器能够通过网络互相通信的话,不须要凋谢它们的端口,只须要借助 Docker 网络(Docker Network)即可。
Docker 网络(Docker Network)
Docker 能够创立各种类型的虚构网络,例如能够是 bridge 网络,也能够是 overlay 网络等等。
能够通过 docker network
创立、查看以后宿主机上的 Docker Network,让一个容器退出 Docker Network 等等。
一个容器能够退出多个 Docker Network。
容器在 Docker 网络中的 IP 地址和 hostname
默认状况下,当一个容器退出了一个 Docker Network 之后,Docker 会主动调配给这个容器一个 IP 地址。也能够在容器退出 Docker Network 的时候,指定一个 ip 地址给它。
容器的 hostname 默认是该容器的 ID。也能够在容器退出 Docker Network 的时候指定一个 hostname 给它。
DNS 服务
默认状况下,Docker 会通过 bind mount 的形式把宿主机的 \etc\resolv.conf
挂载到每一个容器中去。因而,每一个容器的 DNS 配置都和宿主机的是一样的。
如果容器退出的是用户通过 docker network create
创立进去的自定义网络,那么容器将会应用的 Docker 内置的 DNS 服务器,内置的 DNS 服务器将会把内部 IP 地址的查找转发给宿主机上配置的 DNS 服务器。
也能够在 docker create
或者 docker run
的时候指定容器的 DNS 配置。
须要留神的是:容器并不会共享宿主机上的 \etc\hosts
文件,能够在运行 docker run
时指定要退出容器的 \etc\hosts
文件中的内容。
Docker Network Drivers
Docker 反对以下不同类型的 Docker Network:
Network Driver | Descript |
---|---|
bridge | 应用 docker network create 创立网络时创立进去的默认网络类型。当同一台宿主机上的多个容器之间须要互相通信的时候,通常会应用这种网络。在这种网络中的容器无奈和宿主机以及别的网络的容器进行通信 |
host | 将宿主机和容器之间相连接的网络类型,容器能够间接应用宿主机的网络 |
overlay | 将多个 Docker daemon 连贯在一起,容许 Swarm 服务和容器跨节点(主机)进行网络通信 |
ipvlan | 这种网络容许用户对 IPv4 和 IPv6 的寻址有着齐全的管制 |
macvlan | 容许将一个 MAC 地址调配给容器,Docker daemon 会依据容器的 MAC 地址对数据进行路由。一般来说这种类型的网络用于部署那些古老的遗留应用程序,这些程序面向的是物理网络开发,而不是网络协议栈 |
none | 将一个容器和宿主机以及其余容器齐全隔离开来的网络类型,这种网络在 Swarm 服务中不可应用 |
代理服务器
能够给 Docker Client 或者 Docekr Daemon 设置代理服务器(proxy server)。
包过滤
当把某一个容器的端口凋谢了之后,为了平安起见个别会须要对这个端口的数据包进行过滤。在 Linux 中,Docker 是通过 iptables
规定来进行包过滤的。
Docker 会在 iptables
中插入两条 iptables chain,别离叫做 DOCKER-USER
和DOCKER
,并且会保障所有的网络包都会先通过这两个 chain 的查看,它们都属于 FORWARD
chain 的一部分。
所有容器的 iptables
规定都会被主动退出到 DOCKER
chain 中。
不要手动增加或批改或删除DOCKER
chain 中的内容,然而能够向DOCKER-USER
chain 中增加规定,这些规定会比DOCKER
chain 中的规定优先级更高。事实上,Docker 总会保障在FORWARD
chain 中,DOCKER-USER
chain 的优先级是最高的,其次就是DOCKER
chain,其余的 iptables chain 中的规定,不论是手动增加的,还是防火墙增加的,优先级都不会比它们两个高。
防火墙
如果运行 Docker 的零碎应用了 firewalld
并且开启了 --iptables
,Docker 就会主动创立一个名为docker
的firewalld
zone,并把所有由 Docker 创立的网络接口(例如 docker0
)放入到这个 zone 外面。
Debian 和 Ubuntu 自带的防火墙ufw
应用的是 iptables
外面的 INPUT
和OUTPUT
chain,而 Docker 会在 nat
表中解决容器的网络流量,因而 Docker 容器的流量实际上并不会通过 ufw
的过滤。
参考资料
https://docs.docker.com/network/