docker网络启动过程

当Docker服务启动时,服务会在主机上创建一个名字为docker0的虚拟网桥,可将其理解成一个软件交换机,主要负责挂载在它上面的网口之间的数据转发。
同时,Docker随机分配一个本地未占用的私有网段中的一个地址给docke0接口,比如典型的172.17.0.0/16网段,掩码为255.255.0.0,此后启动的容器内的网口也会自动分配同一个网段的地址。
当一个容器创建时,同时会产生一堆veth pair接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0;另外一端在本地并被挂载到docker0网桥,名称以veth开头(例如:vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker就创建了在主机和所有容器之间的一个虚拟共享网络。

端口映射实现容器访问

[-P参数会随机映射一个49000~49900的端口到内部容器开放的网络端口]


[-p则可以指定要映射的端口,可以使用多个-p标记绑定多个端口]

还有以下几种写法:
127.0.0.1:5000:5000 绑定localhost的5000端口到容器的5000端口
127.0.0.1::5000,绑定localhost的任意端口到到容器的5000端口
127.0.0.1:5000:5000 绑定localhost的5000端口到容器的5000端口,并指定为udp协议端口

查看映射端口配置

docker port 容器ID 容器端口

容器互联

使用--link参数时容器之间进行交互

创建数据库容器

docker run -d --name db training/postgres

新建容器连接到数据库容器,查看容器环境变量

docker run --rm --name web --link db:db training/webapp env

由此图可知上面的环境变量的数据库IP为db容器的IP

自定义网桥

废止旧网桥

systemctl stop docker
ip link set dev docker0 down
brctl delbr docker0

创建新网桥

brctl addbr bridge0
ip addr add 192.168.2.1/24 dev bridge0
ip link set dev bridge0 up

查看网桥

ip addr show bridge0

应用新网桥

vim /etc/docker/daemon.json

{
  "bridge": "bridge0",
}

systemctl start docker
docker run -i -t --rm ubuntu /bin/bash
ip addr

实现点到点连接(不通过主机网桥进行桥接)

创建两个容器

查看进程号,创建网络命名空间

创建peer接口,配置路由

查看测试网络