docker网络配置

148 阅读5分钟

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 就创建了在主机和所有容器之间一个虚拟共享网络。

image

创建网桥

  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

我们定义了两个网络:frontendbackend。网络类型是bridgeweb服务加入了这两个网络,而db服务只加入了backend网络。这允许web服务既可以从frontend网络接收外部请求,又可以通过backend网络与db服务通信。