一,docker网络实现原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
二,docker的网络模式
host:容器使用的是宿主机的网络,直接面对公开服务,这意味着若在容器中运行一个web服务,那么它可以直接绑定主机的网络接口上,而不是通过docker进行网络转发。与宿主机共享网络明明空间/网络协议栈。
container:使用这种模式允许容器共享另一个容器的网络命名空间,意味着两个容器可以有相同的网络接口和ip地址,如果他们共享,是同一个网络明明空间。多个容器之间共享一个networknamespace。
none:这是最简单的网络模式,此网络模式表示容器拥有自己的网络命名空间,但不会进行网络配置,这实际上给用户完全自主权来自己配置容器的网络。自闭空间。
birdge:这是docker默认的网络模式,每个新创建的容器都将从该网络中分配一个ip地址,此网络模式允许所有docker容器之间即docker宿主机之间相互通讯。通关veth连接容器与docker0网桥,网桥分配给容器ip,同时docker0作为“局域网”内容器网关,最后和宿主机网卡进行通信。
自定义:docker允许用户创建自己定义的网络,用户可以定义网络范围,比如子网,路由等参数,这种类型的网络使得用户可以更好的对容器网络进行一个控制和隔离。
三,案例
- host:
- #随机映射端口(从32768开始)
- docker run -d --name test1 -P nginx
- #指定映射端口
- docker run -d --name test2 -p 43000:80 nginx
-
- container:
- docker run -itd --name test1 centos:7 /bin/bash #--name 选项可以给容器创建一个自定义名称
- docker ps -a
- docker inspect -f '{{.State.Pid}}' xxxx #查看容器进程号xxxx,会返回一个数字
- ls -l /proc/上一步返回的数字/ns
- docker run -itd --name test2 --net=container:xxxx centos:7 /bin/bash
- docker ps -a
- docker inspect -f '{{.State.Pid}}' 第二个创建的id
- ls -l /proc/上一步返回的数字/ns #会发现他们的namespace编号相同
-
- 自定义网络:
- #可以先自定义网络,再使用指定IP运行docker
- docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
- docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash