docker 网络

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段中的一个地址给 docker0 接口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配一个同一网段( 172.17.0.0/16 )的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 veth090b7e1@if18 )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

网络管理

1、查看 docker 网络

docker  network   ls

2、创建 docker 网络

docker  network  create  network1

3、将 docker 网络链接到容器里面

docker  network  connect    network1    e9f8f4abb08a

4、将 docker 网络与容器链接断开

docker  network  disconnect  network  e9f8f4abb08a

5、删除指定的 docker 网络

docker  network   rm  network1

6、删除未被使用的 docker 网络

docker   network   prune

7、查看网络详情

docker  inspect    network1

8、创建自定义网段的网络

docker network create  --subnet 172.30.0.0/16   network1

设置容器网络

在 docker run 的时候,可以指定要链接到的网络,如果没有指定就是链接的默认的 bridge,也就是 docker0 网口。

docker  network create nginx_network
docker  run    -itd  --network=nginx_network    -P  nginx:latest

如果容器里面不需要设置网络,可以指定–network=none。

docker_gwbridge 网络

在本质上还是一个 local 的 bridge 网络,但是它是我们实现多个 host 之间的 container 通信的基础。通常情况下,当我们在链接 swarm nodes 的时候,docker_gwbridge 网络就会被在每一个 swarm 节点上自动创建出来。

docker network create --subnet 172.30.0.0/16 --opt com.docker.network.bridge.name=docker_gwbridge --opt com.docker.network.bridge.enable_icc=false  docker_gwbridge

容器访问外部网络

容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 iptables 的源地址伪装操作实现的。

可以通过 iptables 查看 nat 表的规则

iptables -nL -t nat  --verbose

设置主机名

容器在启动的时候,如果没有指定主机名,就谁随机分配一个主机名,设置主机名有利于应用分类等。

使用-h HOSTNAME 要么 –hostname=HOSTNAME

docker  run  -itd   -h  nginx.example.com   nginx:latest

设置 DNS

如果没有手动设置 ,容器里面的 DNS 是一个宿主机是一样的。

这个设置是直接修改容器里面的/etc/resolv.conf

--dns-opt     设置DNS参数的

--dns       修改nameserver

--dns-search    设置查找域
docker run -itd --dns-opt='timeout:1 attempts:1' --dns=8.8.8.8 --dns-search=example.com  centos