以下大部分信息采用此博客:


docker 之网络配置-13352895-51CTO博客blog.51cto.com


docker配置指定应用启动的ip地址 docker 启动指定ip_docker 网络


对于docker的了解仅停留在听说过的水平。最近在搞一个神经网络模型,用户发送一段信息,然后神经网络对信息进行处理,并返回结果。期间要用上很多个服务器。一台一台去部署环境要疯了。于是想到了用docker。

对于docker的安装部署暂且不谈,这个网上搜一下一大堆。现在仅就docker如何通过端口和宿主机进行交互记录一下今天学到的东西。

要实现网络通信,至少要有一个网络接口,无论他是物理接口还是虚拟机那样的虚拟接口。

在Docker中,网络接口默认都是虚拟接口。

Docker在创建容器的时候,一般不用你去特意关注接口,他会执行如下操作:

1、创建一对虚拟接口,分别放在宿主机和容器中

2、宿主机默认链接到docker0或者指定的桥上。

3、容器一端放到容器中,其名字为eth0,这个接口只在容器的名字空间中可见。

4、从网桥可用地址中获取一个空闲的地址分配给容器的eth0,并配置默认路由到桥接网卡veth65f9.

可以在 docker run 的时候通过 --net 参数来指定容器的网络配置,有4个可选值:

  • --net=bridge 这个是默认值,连接到默认的网桥。
  • --net=host 告诉 Docker 不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其 它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --privileged=true,容器会被允许直接配置主机的网络堆栈。
  • --net=container:NAME_or_ID 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 lo 环回接口通信。
  • --net=none 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。

1、bridge 模式

Docker 容器默认使用 bridge 模式的网络。其特点如下:

  • 使用一个 linux bridge,默认为 docker0
  • 使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上
  • 该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内
  • Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部
  • 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port
  • NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
  • 容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信


docker配置指定应用启动的ip地址 docker 启动指定ip_docker 网络_02


2、Host 模式

定义:

Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。其特点包括:

  • 这种模式下的容器没有隔离的 network namespace
  • 容器的 IP 地址同 Docker host 的 IP 地址
  • 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
  • host 模式能够和其它模式共存


docker配置指定应用启动的ip地址 docker 启动指定ip_docker配置指定应用启动的ip地址_03


3、container 模式

定义:

Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。


docker配置指定应用启动的ip地址 docker 启动指定ip_docker 网络_04


4、none 模式

定义:

网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。


docker run -it --name web ubuntu


docker配置指定应用启动的ip地址 docker 启动指定ip_docker配置指定应用启动的ip地址_05


这时候我们看到容器的地址出现了是172.17.0.3 这时候我们宿主机ping一下此地址,发现ping的通。

同样,我们如果再run一个docker,同样查看其ip,发现他的ip变成了172.17.0.4。这也验证了容器通过容器的eth0这个口交换信息。那么我们再查看一下docker0的地址和宿主机的eth0:


docker配置指定应用启动的ip地址 docker 启动指定ip_docker 获取宿主机ip_06


发现docker0和宿主机的eth0是不变的。此时的docker0就相当于一个虚拟的路由交换器。