Docker的应用运行在容器中,其相互之间或与外部之间是如何通讯的,涉及到哪些知识点,本文对相关内容进行整理。因网络这块牵涉的面较多,所以只从平常使用或理解的角度出发,过于专业的就不深刻探讨了。
html
在Docker笔记(二):Docker管理的对象中,介绍了Docker经过一些驱动程序来实现容器之间或容器与外部的互联,包括bridge(默认的虚拟网桥形式),host(与主机共享网络栈),overlay(跨Docker Daemon容器间的互联),macvlan(为容器分配mac地址),none(禁用全部网络)等。docker
默认状况下,Docker启动时会建立一个虚拟网桥 docker0,能够理解为一个软件交换机。当建立一个 Docker 容器的时候,会建立一对 veth pair 接口(当数据包发送到一个接口时,另一个接口也能够收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另外一端在宿主机本地并被挂载到 docker0 网桥,名称以veth 开头,如 veth340c305,docker0会在挂载到它上面的网口之间进行转发,从而实现主机与容器之间及容器与容器之间的相互通讯。Docker默认的网络拓扑图以下:json
咱们能够在宿主机上经过ifconfig
查看相关的网络接口,centos
~$ ifconfig |
经过brctl show
可查看网络接口的挂载状况,bash
~$ brctl show |
由上可看出网络接口veth340c305,veth6c803b7都挂在虚拟网桥docker0上。服务器
咱们前面的许多容器启动命令都有添加相似 -p 8080:8080 的参数,以指定将宿主机端口映射到容器端口,从而经过访问 宿主机IP:宿主机端口
的地址来访问对应端口的容器服务。
端口映射的完整格式为 宿主机IP:宿主机端口:容器端口
,其中前两个是能够二者都取,或只取其一微信
宿主机IP:宿主机端口:容器端口
:将指定宿主机IP的一个指定端口映射到容器端口,如192.168.40.205:8090:8080
宿主机IP::容器端口
:将指定宿主机IP的一个随机端口映射到容器端口上,若是宿主机有多个IP,则能够经过这种格式指定绑定其中一个宿主机IP,随机端口范围为49000~49900宿主机端口:容器端口
:将宿主机全部网络接口IP的指定端口映射到容器端口上,8090:8080
等效于0.0.0.0:8090:8080
(0.0.0.0
即表示全部网络接口地址)可使用 docker port 容器ID或名称 容器端口
或docker ps
命令来查看端口映射状况,如网络
~$ docker port test-dev 8080 |
在容器启动时,能够屡次使用 -p 来指定映射多个端口。tcp
若是不指定具体的宿主机端口,则可使用 -P(大写)来分配一个宿主机的随机端口(范围为49000~49900), 如docker run -d -P --name test-dev test:dev
,而后经过docker port 容器ID或名称 容器端口
或docker ps
命令来查看具体映射到了哪一个端口。spa
同一个Docker Daemon下的容器,彼此之间是能够经过容器IP互相访问的(如何查看容器IP?用docker inspect 容器ID或名称
命令),若是要实现两个容器之间能够经过容器名直接访问,则能够经过自建一个docker网络。
# 建立一个自定义网络,-d 表示网络类型,能够为bridge(网桥,软件交换机),或overlay(跨Docker Daemon容器间的互联) |
由上可见经过自定义网桥链接的容器能够经过容器名称互相访问。若是须要多个容器之间互联,则可使用Docker Compose。
若是要自定义全部容器的DNS,则能够在 /etc/docker/daemon.json 中增长
{ |
也能够在启动容器时经过参数指定单个容器的DNS配置,--dns=IP_ADDRESS
,这会将指定DNS的地址添加到容器的 /etc/resolv.conf 文件中,让容器用这个DNS服务器来解析全部不在 /etc/hosts 中的主机名。
容器的网络访问控制,主要是经过Linux上的iptables防火墙来实现与管理的。
1. 容器访问外部网络
容器访问外部网络,须要经过本地系统的转发,能够经过以下命令查看转发是否打开
$sysctl net.ipv4.ip_forward |
容器全部到外部网络的访问,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 iptables 的源地址假装操做实现的,
~# iptables -t nat -nL |
上述规则将全部源地址在 172.17.0.0/16 的网段(容器IP所在网段),目标地址为任意网段(包括外部网络)的流量动态假装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
2. 外部访问容器
经过 -p 或 -P 指定端口映射,容许外部访问容器端口,实质也是在本地的 iptable 的 nat 表中添加相应的规则,如
~# iptables -t nat -nL |
这里的规则映射了 0.0.0.0 ,意味着将接受主机来自全部网络接口的流量。
3. 容器之间的访问
容器之间能互相访问,须要知足两个条件:1)容器的网络拓扑是否已经互联,默认状况下容器都链接到docker0网桥上,默认是互联的。2)本地系统的防火墙iptables是否容许经过。当容器启动时经过–link互联时,也是在iptables中建立对应规则来实现。
本文整理了Docker网络相关知识,对容器之间及容器与外部之间的通讯机制应该有了必定的了解。除了默认的网络实现,Docker还提供了网络的配置及自定义网络,出于篇幅,本文介绍到这,后续再补充。
相关阅读
Docker笔记(二):Docker管理的对象
Docker笔记(三):Docker安装与配置
Docker笔记(四):Docker镜像管理
Docker笔记(五):整一个本身的镜像
Docker笔记(六):容器管理
Docker笔记(七):经常使用服务安装——Nginx、MySql、Redis
个人微信公众号:jboost-ksxy (一个不仅有技术干货的公众号,欢迎关注,及时获取更新内容)
原文出处:https://www.cnblogs.com/spec-dog/p/11471346.html