转载http://blog.sina.cn/dpool/blog/s/blog_4da051a60102wf8o.html
Docker网络基础
目前docker的网络基础模型主要是通过以下几种技术实现:-
network namespaces
- 提供网络相关资源隔离 -
linux network bridge
- 连接多个不同网段 -
veth pair
- 两个虚拟网卡组成的数据通道 -
iptables
- 提供NAT功能及相关容器网络安全限制
Docker网络模式
Docker默认的网络模式是bridge模式,其他三种模式分别是host、container、none,具体的介绍可以参看:Docker: 4种网络模式以及bridge模式下容器的通信
docker服务默认会在启动时候创建一个
docker0
的 虚拟网桥,实际上是 Linux 的一个
bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时,Docker 随机分配一个本地未占用的私有网段中的一个地址给
docker0
接口。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。当创建一个 Docker 容器的时候,同时会创建了一对 veth pair
接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0
;另一端在本地并被挂载到docker0
veth2dff631
)。
容器eth0网卡从docker0网桥所在的IP网段中选取一个未使用的IP,容器的IP在容器重启的时候会改变。docker0的IP为所有容器的默认网关。容器与外界通信为NAT。
docker暴露端口
NOTEdocker可以通过以下两种端口映射配置方法来暴露端口提供服务:
在docker启动后,由于容器的ip是私有ip,这些 ip 是基于本地系统的,
并且容器的端口非本地主机是访问不到的。
除此之外,docker容器的 ip 在每次启动的时候都会改变。
为了解决这些问题,Docker通过端口绑定主机系统的接口,
允许非本地客户端访问容器内部运行的服务。
-
自动端口映射:
--expose
或
通过在dockerfile中使用
EXPOSE xxx
,来记录需要暴露的端口; 或者在启动容器执行docker run时候,使用
--expose=xxx
。 这个参数配置仅仅只是记录,并不会真正将端口映射到宿主机上,还需要在运行时加上
-P
参数, Docker会自动为用户创建端口映射规则,并且帮助避免端口映射的冲突。
使用
-P
自动暴露端口时,外部的端口值会在49000-49900这个端口池中随机挑选一个。-
指定绑定端口:
-p
在启动容器执行docker run时候,使用-p
参数显式,
将一个或者一组端口从容器里绑定到宿主机上,而不仅仅是提供一个端口。-p ip:hostPort:containerPort
-p ip::containerPort
-
-p containerPort
可以忽略ip或者hostPort,但是必须要指定需要暴露的containerPort。
另外,所有这些发布的规则都默认为tcp,如果是udp需要显示指定,比如
-p 1234:1234/udp
。