Docker网络管理-通讯优化
Coding On Road 原创作品,非作者允许不得用于商业,转载请注明出处。
首先,docker启动的容器与宿主机通讯是基于docker的网络配置。默认情况下,docker会使用bridge(网桥),默认情况下,所有创建的容器,都会使用一个bridge网桥进行通讯,在同一个网桥下的容器之间可以通过IP地址或主机名称进行通讯。
以下docker网桥优化的方案:

上图说明:
1、默认网桥:此网络主要提供搜索引擎服务,所以将ES和两个搜索服务安装指定使用默认网桥。
2、新网桥:提供查询,CRUD及消费队列服务。
3、当搜索量吞吐巨大时,不会因为网络拥堵而影响到正常的业务流程。即当默认网桥搜索量很大时,不会影响到新网桥上的正常业务。
4、 最后,可以通过优化网络,来加快网络响应的速度,当然还要看您总体系的带宽,一般情况下,10M带宽可提供同时5K-1W人在线访问。
Docker network命令用于管理网络服务。
[root@server101 ROOT]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
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.
以下我们以tomcat容器为示例,演示配置docker network。
Step下载tomcat镜像。
# docker pull tomcat
查看tomcat镜像的内容dockerfile信息,通过inspect命令,可以看到镜像中tomcat的版本为9,JDK的版本为11
# docker inspect tomcat
...
"Env": [
"JAVA_HOME=/usr/local/openjdk-11",
"LANG=C.UTF-8",
"JAVA_VERSION=11.0.10",
"CATALINA_HOME=/usr/local/tomcat",
"TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
"LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
"TOMCAT_MAJOR=9",
"TOMCAT_VERSION=9.0.45"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"catalina.sh\" \"run\"]"
],
..
Step 创建network
首先查询network, 可以看到bridge桥接网卡,此网卡为所有容器默认使用的网卡。
[root@server101 ROOT]# docker network ls
NETWORK ID NAME DRIVER SCOPE
07b3ab36aae3 bridge bridge local
8b41b9d3358f host host local
f19e8be47ecc none null local
现在创建第二个桥接网卡,其中bridge2是我们取的名称,可以为任意名称:
[root@server101 ROOT]# docker network create bridge2
202815b88f4705c76ad86dd6106cc650550913803b134a9b2529c8256a0081d3
[root@server101 ROOT]# docker network ls
NETWORK ID NAME DRIVER SCOPE
07b3ab36aae3 bridge bridge local
202815b88f47 bridge2 bridge local
8b41b9d3358f host host local
f19e8be47ecc none null local
查看刚才创建的bridge2网卡的信息,可以通过inspect命令进行查看, 通过查看可以看到新网卡的gateway为172.18.0.1。
[root@server101 ROOT]# docker inspect bridge2
[
{
"Name": "bridge2",
"Id": "202815b88f4705c76ad86dd6106cc650550913803b134a9b2529c8256a0081d3",
"Created": "2021-04-10T02:08:53.600082568-04:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
..
Step 创建容器
现在就可以创建一个容器了,并指定容器所使用的网卡,通过--network参数,即可以指定使用哪一个网卡。
# docker run --name tomcat1 -d -p 8081:8080 --network bridge2 \
-v app/docker_volume/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat
创建之后,通过inspect查看容器所使用的ip,可见,此容器使用的是gridge2网卡,它的ip地址为172.18.0.2。
# docker inspect tomcat1
....
"Networks": {
"bridge2": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"6ffa4300447b"
],
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
...
现在再创建一个新的容器,同样指定使用bridge2这个网卡,注意修改容器名称和端口影射。
# docker run --name tomcat2 -d -p 8082:8080 --network bridge2 \
-v /app/docker_volume/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat
由于tomcat1与tomcat2容器,都在bridge2网卡下,所以此两个容器,可以互相通讯。现在进入tomcat1并通过主机名称访问tomcat2进行测试。通过以下测试,可以看出,无论是通过主机名或是ip地址,都可以成功访问:
[root@server101 ROOT]# docker exec -it tomcat1 bash
root@6ffa4300447b:/usr/local/tomcat# curl tomcat2:8080
<html>
<body>
Hello Tomcat
</body>
</html>
root@6ffa4300447b:/usr/local/tomcat# curl 172.18.0.2:8080
<html>
<body>
Hello Tomcat
</body>
</html>
Step 查看某个网卡所使用的ip地址
如果想查看一个网卡,具体分配了多少ip地址,可以通过inspect <netwok-name>查看。通过以下命令,可以看到bridge2网卡上,已经有两个容器,分别是tomcat1和tomcat2以及他们所使用的ip地址。
[root@server101 ROOT]# docker inspect bridge2
[
{
"Name": "bridge2",
"Containers": {
“name”:”tomcat2”,
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
{
“Name”:”tomcat1”,
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
..
您还可以再次尝试创建两个新的容器,并使用默认网卡,你会发现默认网卡里面的容器与新创建网卡中的容器不可以通讯,因为默认网卡的ip地址为172.17.0.1。不再赘述。




