docker网络模式及端口映射暴露

时间:2024-03-20 10:47:06

转载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网络模式及端口映射暴露X

docker服务默认会在启动时候创建一个docker0的 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker 随机分配一个本地未占用的私有网段中的一个地址给docker0接口。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair
接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0;另一端在本地并被挂载到docker0 网桥,名称以 veth 开头(例如veth2dff631)。

容器eth0网卡从docker0网桥所在的IP网段中选取一个未使用的IP,容器的IP在容器重启的时候会改变。docker0的IP为所有容器的默认网关。容器与外界通信为NAT。



docker暴露端口

NOTE
在docker启动后,由于容器的ip是私有ip,这些 ip 是基于本地系统的,
并且容器的端口非本地主机是访问不到的。
除此之外,docker容器的 ip 在每次启动的时候都会改变。
为了解决这些问题,Docker通过端口绑定主机系统的接口,
允许非本地客户端访问容器内部运行的服务。
docker可以通过以下两种端口映射配置方法来暴露端口提供服务:
  1. 自动端口映射--expose
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 hostPort:containerPort
-p containerPort
可以忽略ip或者hostPort,但是必须要指定需要暴露的containerPort。
另外,所有这些发布的规则都默认为tcp,如果是udp需要显示指定,比如-p 1234:1234/udp
详细的配置方法可以参考:Docker 端口映射
两种配置方法的区别可以参考:Docker网络原则入门