一、docker的默认网络
默认网络docker0的原理
我们在查看宿主机的IP地址,如下图:
docker0的网络是:172.17.0.1/16,每当启动一个容器,就会生产两个
这个就是evth-pair技术,通过ovc的连接可以相互通信。
下图更详细:
此时docker0,就相当于一个路由器,这就是docker的默认网络。
- 所有的docker容器,在不指定网络的情况下都属于docker0;
- docker0会给我们每一个容器分配1个可用的IP;
- docker0的作用是直接让容器和宿主机通信,间接性让容器间通信(必须使用–link链接,但是一般不这么干)。
疑问:容器之间是否能ping通对方?
分别启动两个tomcat容器,使用如下命令,让tomcat01 ping tomcat02
docker exec -it tomcat01 ping tomcat02
结果如图:
docker0的缺点
- 容器之间不能直接互通;
- 要想互通必须使用–link;
- 而且link是单项的,必须两端都配置
二、容器间的连通(link的用法)
解决问题:
我们再启动一个tomcat03,使用link命令链接 tomcat02
docker run -d -P --name tomcat03 --link tomcat02 tomcat
通过命令–link就可以解决这个问题,如下图现在tomcat03可以ping通tomcat02
但是其实这个命令挺坑的。如上图,如果反向,能否ping通?
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ffb8c87e33c6 bridge bridge local
76dde8bbf8a5 host host local
42401e5761c9 none null local
原因是什么呢?
当我们让tomcat03 --link tomcat02的时候,容器内部发生了什么变化呢?其实很简单,在tomcat03内部的hosts文件中多了一条本地映射,如下图:
而tomcat02因为没有link tomcat03 所以hosts文件中没有这一条,因此反向是无法ping通的。
==这也就是link的原理,其实就是在容器hosts文件中写了一条映射。这样的话由于局限性很大,所以我们一般也不是很常用。==我们一般在生产中,是这样做的。就是自定义docker网络。
三、自定义daocker网络
自定义daocker网络的目的就是方便容器之间互联。
[root@localhost ~]# docker network ls #查询docker的所有网络
NETWORK ID NAME DRIVER SCOPE
ffb8c87e33c6 bridge bridge local
76dde8bbf8a5 host host local
42401e5761c9 none null local
docker网络的类型
- bridge:桥接模式(默认,自己创建的也是用这种模式)
- host:和宿主机共享网络
- none:不配置网络
- container:容器内网络连通(这里是看不到的,用的比较少,了解即可)
我们之前在启动tomcat的时候,所使用的命令是:docker run -d -P --name tomcat tomcat
,其实他是个阉割版,他省略了网络的参数,如果敲全的话应该是下面这个:
docker run -d -P --name tomcat --net bridge tomcat
多了个--net bridge
,其实这个就是docker0网络。你不加默认就是docker0网络,所以大部分时候我们是不加的。在我们自定义网络之后,每次启动就要加上了。
创建docker网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
注释及演示过程
docker network create \
--driver bridge \ #桥接模式
--subnet 192.168.0.0/16 \ #网段
--gateway 192.168.0.1 \ #网关
mynet #网络的名字
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 myne
t
5c86080c7b61dfd92006e3cc506351c825052bd4ca214ffb3965ca08f23a16af
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ffb8c87e33c6 bridge bridge local
76dde8bbf8a5 host host local
5c86080c7b61 mynet bridge local #这个就是我们新建的
42401e5761c9 none null local
[root@localhost ~]# docker network inspect mynet #查看网络的详细信息
[
{
"Name": "mynet",
"Id": "efe52fe3d7fe632c6e7047e5d1afdeafc7266518efa81a19ee16f014acdf0d68",
"Created": "2021-08-16T20:45:31.865520553+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
###我们再自己创建的网络中启动两个tomcat
[root@localhost ~]# docker run -d -P --name tomcat-net-01 --network mynet tomcat
9eded0646076d8b8e150a48dbca89495bd93ae96aca77501667a5333b6672a71
[root@localhost ~]# docker run -d -P --name tomcat-net-02 --network mynet tomcat
bf75b548b9e898c5f99b8464112000667f86c5847ac224ffb32dfb639c637270
[root@localhost ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "efe52fe3d7fe632c6e7047e5d1afdeafc7266518efa81a19ee16f014acdf0d68",
"Created": "2021-08-16T20:45:31.865520553+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"9eded0646076d8b8e150a48dbca89495bd93ae96aca77501667a5333b6672a71": {
"Name": "tomcat-net-01",
"EndpointID": "a5341a641690b019f6e6b3e5297cd1ab40d5c29d119e0cec0174245dcff4b7ca",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16", ##tomcat-net-01的IP
"IPv6Address": ""
},
"bf75b548b9e898c5f99b8464112000667f86c5847ac224ffb32dfb639c637270": {
"Name": "tomcat-net-02",
"EndpointID": "266bdee560e20c808ba6b85daa4fbcdee89e70d86090e05efaf3e72f1a9bb563",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16", ##tomcat-net-02的IP
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@localhost ~]# docker network rm mynet #删除网络
mynet
[root@localhost ~]#
四、自定义网络的好处
现在我们看看自定义网络的好处。
容器之间可以直接ping通
我并没有使用–link,但是直接可以ping通
五、容器和网络打通
根据上面的实验我们已经实现了同一网络容器间的互通技术。
那么问题由来了,如下图这种不同的docker网络,容器间互通该如何打通网络呢?
例如:我想让docker0网络中的tomcat-01能和mynet网络中的tomcat-net-01互通,该怎么办?
像上图中的直连是绝对不能通的,我们必须如下图,让tomcat01和mynet这个网络互通就OK了。是不是有点像pptp?
docker网络中的重点必会命令connect
- connect 命令他是docker网络的核心。
- 功能:链接一个网络到一个容器
[root@localhost ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network #docker网络的核心命令,链接一个网络到一个容器
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[root@localhost ~]#
[root@localhost ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
[root@localhost ~]#
tomcat01的网络是默认网络docker0,现在让他链接到mynet网络内
[root@localhost ~]# docker network connect mynet tomcat01
搞定,我们看看mynet网络信息中发生了什么变化。
[root@localhost ~]# docker network inspect mynet #查询mynet网络信息
他居然在mynet中的网络,那还在docker0网络中吗?任然在,因此他的拓扑变成了如下图