1.docker网络配置
1.1 说明
当 Docker 安装成功后,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
1.2 网桥类型(driver)
bridge
Bridge 类型,也是 Docker 的默认类型
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。
通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
创建网桥
docker network create -d bridge nginx_network
创建容器
docker run -di --name n1 --network nginx_network nginx:1.14.2
n1容器网络
217: eth1@if218: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:18:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.24.0.2/16 brd 172.24.255.255 scope global eth1
valid_lft forever preferred_lft forever
创建容器
docker run -di --name n2 --network nginx_network nginx:1.14.2
n2容器网络
221: eth1@if222: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:18:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.24.0.3/16 brd 172.24.255.255 scope global eth1
valid_lft forever preferred_lft forever
这两个容器在172.24.0.1这个网段上
宿主机网络
196: br-3be4f2c65edb: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:51:fe:f0:c0 brd ff:ff:ff:ff:ff:ff
inet 172.24.0.1/16 brd 172.24.255.255 scope global br-3be4f2c65edb
valid_lft forever preferred_lft forever
inet6 fe80::42:51ff:fefe:f0c0/64 scope link
valid_lft forever preferred_lft forever
host
Host 类型,也就是主机类型,与主机共享 Network NameSpace,网络资源和主机保持一致,一般用于单容器服务。
创建容器
网络模型为Host类型时不必做端口映射,容器的服务可以直接在宿主机的网络接口上监听
docker run -di --name n3 -v /usr/local/sources.list:/etc/apt/sources.list --network host nginx:1.14.2
容器网络和宿主机一模一样
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1d:07:1f brd ff:ff:ff:ff:ff:ff
inet 192.168.254.5/24 brd 192.168.254.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::5049:1dc0:e1ee:ba52/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:2d:80:8a:7a brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:2dff:fe80:8a7a/64 scope link
valid_lft forever preferred_lft forever
21: br-3f133b64507e: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
link/ether 02:42:b5:96:33:e1 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-3f133b64507e
valid_lft forever preferred_lft forever
71: br-13c43f1f934d: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
link/ether 02:42:5e:1c:3e:55 brd ff:ff:ff:ff:ff:ff
inet 172.20.0.1/16 brd 172.20.255.255 scope global br-13c43f1f934d
valid_lft forever preferred_lft forever
72: br-20cc0bc61150: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
link/ether 02:42:14:fa:c0:5d brd ff:ff:ff:ff:ff:ff
inet 172.21.0.1/16 brd 172.21.255.255 scope global br-20cc0bc61150
valid_lft forever preferred_lft forever
....
none
None 类型,即没有任何网络配置。
1.3容器之间使用网桥网络通信
1.默认docker在创建容器时将所有容器都连接到docker0网桥上,默认在docker0网桥的容器都可以使用容器内ip地址进行通信 2.使用容器名通信必须自定义网桥
# 创建桥接网络,默认为bridge
docker network create -d bridge info
#创建两个容器 容器nginx001和容器nginx002共用同一个网桥info
docker run -d -p 8890:80 --name nginx001 --network info nginx
docker run -d -p 8891:80 --name nginx002 --network info nginx
1.4 常用命令
# 查看网络信息
docker network ls
#查看网桥详细信息
docker network inspect ruoyi
#创建一个网桥
docker network create -d bridge 网桥名称
# 删除一个网桥
docker network rm 网桥名称
# 给已经创建好的容器指定网桥
docker network connect 网络名 容器名|容器id
docker network prune #删除所有没有用到的网桥
1.5 docker-compose文件
version: '3'
services:
web:
image: nginx:latest
networks:
- frontend
- backend
db:
image: postgres:latest
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
我们定义了两个网络:frontend和backend。网络类型是bridge。web服务加入了这两个网络,而db服务只加入了backend网络。这允许web服务既可以从frontend网络接收外部请求,又可以通过backend网络与db服务通信。