Docker自定义网络 

由于使用Docker0默认网络,是无法实现通过服务名相互 ping 通操作,一般现在都是 docker自定义网络。

Docker如何自定义网络?

查看所有网络 docker network ls

[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
bac2fa49ec66   bridge    bridge    local
064163c429d0   host      host      local
d0e962ce0544   mynet     bridge    local
2d78385bb383   none      null      local
4941a2003d7c   redis     bridge    local

网络模式解释一下

bridge :桥接模式(默认)

none:不配置网络

host:和宿主机共享网络

container:容器网络连通(用的比较少)

创建网络

[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker network create --help

Usage:  docker network create [OPTIONS] NETWORK

Create a network

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver string        网络模式 默认是桥接 (default "bridge")
      --gateway strings      网关(常用)
      --ingress              Create swarm routing-mesh network
      --internal             限制外网网络连接到这个网络
      --ip-range strings     从子一个ip范围分配容器ip
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 启动 IPv6 网络
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       子网掩码(常用)

创建网络命令

[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

网络模式:桥接 子网掩码 192.168.0.0/16 范围是 192.168.0.255 ~ 192.168.255.255
网关是 192.168.0.1

如果是 192.168.0.0/24 证明最多是 255 个网卡

查看创建网络
docker network ls

docker 怎么创建network docker自建网络_docker 怎么创建network

 查看具体信息

docker 怎么创建network docker自建网络_docker 怎么创建network_02

测试启动两个容器,进行相互ping通测试
 启动第一个容器
 docker run -it --network mynet --name mycentos-net-01 centos /bin/bash
 Ctrl+P+Q 退出启动第二个容器 
 docker run -it --network mynet --name mycentos-net-02 centos /bin/bash
Ctrl+P+Q 退出
测试两个通过容器名称是否可以ping通过操作


docker 怎么创建network docker自建网络_docker_03

发现是可以相互 ping 通的,这时候就知道自定义网络比 --link 强大多了

自定义网络是可以通过服务名相互 ping 通的,而--link 不行,再者就是自定义网络可以发向相互ping 

 网络连通

 思考一个这样的场景:

例如我使用docker0 网络运行了两个centos 01 和 centos02 服务,使用了 mynet 运行了 mycentos-net-01 和 mycentos-net-02 服务,现在需要用centos01 和 mycentos-net-02 互通网络,应该如何?

运行两个容器

[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker run -it --name centos01 centos

[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker run -it --name centos02 centos

都是Ctrl+P+Q 退出

docker 怎么创建network docker自建网络_centos_04

测试ping

[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker exec -it centos01 ping mycentos-net-01
ping: mycentos-net-01: Name or service not known
是无法 ping 通的 

原因是 docker0 和 mynet 是两个不同网段来的,怎么可能 ping 通,所以现在只能采用 容器 和 自定义网络 ping

centos01 ping mynet 操作

docker 怎么创建network docker自建网络_docker 怎么创建network_05

采用docker network connet 命令 Connect a container to a network

链接一个容器到一个网络

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker network connect mynet centos01

docker 怎么创建network docker自建网络_docker 怎么创建network_06

 思考一下为什么通过 connect 命令就可以通 跨网段 ping 呢?

查看一下 mynet 网络

docker network inspect mynet

docker 怎么创建network docker自建网络_自定义_07

 我们会发现在 mynet网络中,存在centos01,意思就是 connect 命令后,相当于 centos01网络配置添加到了 mynet中,理解为:阿里云服务器 一个官网ip 一个私网ip地址,那么一个容器 两个IP地址。

查看centos01 的 hosts 网络配置文件 

docker exec -it centos01 cat /etc/hosts

docker 怎么创建network docker自建网络_docker 怎么创建network_08

结论:假设要跨网络操作别人,就需要使用docker network connect 连通!