容器之间的通信
docker容器之间是互相隔离的,这是容器设计的初衷,造成了相互之间不能互相访问,但是我们有时候会在docker中启动多个容器,而且相互之间还需要相互通信,docker提供以下三种方式:
1. 虚拟IP
Dokcer在安装的时候,会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问,进入docker ,可以看到IP地址
[root@192 monitor-demo]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:60:88:39:75 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在docker里安装的容器都会默认分配一IP地址,容器之间可以根据IP地址相互通信。
进入容器查看IP地址:172.17.0.2
[root@ad214e683401 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:7 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:07 txqueuelen 0 (Ethernet)
RX packets 16 bytes 1200 (1.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用IP的缺点很明显,首先容器相互之间获取IP困难,再者容器重启后IP地址会变化,这样对性能要求较高的服务就不可行。
2. 容器名称(link)
运行容器的时候加上参数link
运行第一个容器
docker run -it --name nginx-A docker.io/nginx:latest
运行第二个容器
docker run -it --name centos-2 --link nginx-A:nginx-A-Alias docker.io/nginx:latest
这样在第二个容器里可以根据
nginx-A-Alias + 端口号
·的形式访问。
这种方法解决了IP地址变化的问题,但是这种方法对于容器的顺序有要求。如果要相互访问,就有麻烦了。
3. bridge网络
查看网络:
sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
300238856f3e bridge bridge local
0b2eb4c64d9c host host local
2b8782739b62 none null local
创建bridge网络:
docker network create nginx-brige
$ sudo docker network create nginx-brige
8ead5e19618d0d578e9dcc8ec03f82ac122cc82da824c98dee713cf163be2b4f
$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
300238856f3e bridge bridge local
0b2eb4c64d9c host host local
8ead5e19618d nginx-brige bridge local
2b8782739b62 none null local
运行docker:
# docker run -it --name nginx-A --network nginx-brige --network-alias nginx-A-alias docker.io/nginx:latest
# docker run -it --name nginx-B --network nginx-brige --network-alias nginx-B-alias docker.io/nginx:latest
这样,两个docker 就可以通过 bridge网络通过使用这用方式访问 <网络别名>:<服务端口号> 通信了。
使用这种方法,自定义网络,因为使用的是网络别名,可以不用顾虑ip变化以及docker启动顺序的问题,只要连接到docker内部bright网络即可互访。bridge也可以建立多个,用于隔离在不同的网段内的应用程序(docker)。