Docker容器通信主要分为以下几类:
- 容器和主机通信
- 同一主机上两个容器的通信
- 跨主机的两个容器的通信
首先,当Dokcer安装完成后,它会在主机安装一块虚拟网卡docker0
,使用命令
ifconfig
查看网卡
所以本机所有的容器都是在
172.17.0.1
网段下,这个很重要,可以理解为是主机在容器局域网的IP地址。整个Docker网络通信机制如上图所示,当容器创建时,Docker会随机分配该网段下的一个IP地址。
容器与主机通信
显然,容器与主机通信不能通过localhost:127.0.0.1
网址,而应该是docker0:172.17.0.1
。
同一主机上两个容器的通信
可以使用该网段下分配的IP地址进行通信,但这是静态的,当容器重新创建后,IP地址也会发生变化。因此可以采用bridge
模式,通过容器名进行通信。这种方式请自行查阅资料。
跨主机的两个容器的通信
通过主机的本地IP进行通信,即10.10.45.66->10.10.45.67
。在容器创建时,可以指定extra_hosts
字段需要通信的主机容器名与IP的绑定,容器启动后会写入其hosts文件中,通过容器名即可通信。
docker-compose环境变量的设置
由于主机数量的不足,我们通常会一台主机部署多个Fabric容器,因此端口必须设置清楚。假设一台主机上部署两个peer容器,因为peer容器的监听端口为7051
,链码监听端口为7052
,事件监听端口为7053
,因此一台主机上有两个peer容器时,外部访问会发生冲突。
在ports
字段,peer1
设置端口7051
和主机的8051
绑定,但是内部仍要指定为7051
,因为同一主机上的两个容器的IP是不同的,所以不用担心端口冲突,只有跨主机通信时是需要考虑的。