Docker内容器之间的通讯方式

  • Post author:
  • Post category:其他




容器之间的通信

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)。



版权声明:本文为makenothing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。