由于使用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
?查看具体信息
?测试启动两个容器,进行相互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通过操作
发现是可以相互 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 退出
测试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 connet 命令?Connect a container to a network
链接一个容器到一个网络
Usage: ?docker network connect [OPTIONS] NETWORK CONTAINER
[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker network connect mynet centos01
?思考一下为什么通过 connect 命令就可以通 跨网段 ping 呢?
查看一下 mynet 网络
docker network inspect mynet
?我们会发现在 mynet网络中,存在centos01,意思就是 connect 命令后,相当于?centos01网络配置添加到了 mynet中,理解为:阿里云服务器 一个官网ip 一个私网ip地址,那么一个容器 两个IP地址。
查看centos01 的 hosts 网络配置文件?
docker exec -it centos01 cat /etc/hosts