一、Link方式实现本机容器间互联通信

自定义容器名

连接系统依据容器名称执行,所以首先需要自定义容器名称。

使用--name标记可以为容器自定义名称:

[root@centos7 ~]# docker run -d --name mysqldb -p3306:3306 -e MYSQL_ROOT_PASSWORD=fanshine mysql/mysql-server

使用docker ps 查看容器的命名:image.png

也可以使用docker inspect来查看容器名称:

[root@centos7 ~]# docker inspect -f "{{ .Name }}" bf3bacf5c91d

注意:容器名称是唯一的,如果创建了mysqldb,需要在此创建需要将同名容器删除掉在去创建。

容器互联

容器互联大体有以下三种方式,使用link进行容器互联:

  • 基于volume的互联

  • 基于link的互联

  • 基于网络的互联

使用--link参数让容器间进行交互:

首先创建数据库容器:

[root@centos7 ~]# docker run -d --name mysqldb -p3306:3306 -e MYSQL_ROOT_PASSWORD=fanshine mysql/mysql-server

然后创建web容器,并将其连接到db容器:

[root@centos7 ~]# docker run -d -p 80:80 --name nginxweb --link mysqldb:mysqldb  nginx/nginx-server

此时web容器与db容器建立了互联关系。

注意:--link参数格式为--link name:alias,其中name是要链接的容器名称,alias是这个连接的名称。

Docker通过两种方式为容器公开连接信息:

  • 环境变量

  • 更新/etc/hosts文件

使用env命令查看web容器的环境变量:

[root@centos7 ~]# docker run --rm --name nginxweb3 --link mysqldb:mysqldb  nginx/nginx-server env[object Object]

其中MYSQLDB_开头的环境变量是供web容器连接db容器使用。

登陆web容器ping通mysqldb:Docker之容器互联实现容器间通信_第1张图片

二、使用自定义网桥实现容器跨主机互联通信

Docker默认的网桥是docker0。此网桥只会在本机连接所有容器。

容器的虚拟网卡在主机上看一般叫做veth*而docker0网桥把所有这些网卡桥接在一起,如下:

2019-07-31_141645.jpg

通过ip命令查看到的docker网络信息如下:

Docker之容器互联实现容器间通信_第2张图片

这样可以把这个网络看成一个私有网络,如果要让外网连接到容器中,就需要做端口映射,即-p参数。

例如:主机A和主机B的网卡一都连着物理交换机的同一vlan10,这样网桥一和网桥三就相当于在同一物理网络中,而容器一、容器三、容器四也在同一个网络中,它们之间可以相互通信,而且可以跟同一vlan种的其他物理机器互联,如下图所示:

Docker之容器互联实现容器间通信_第3张图片

创建跨多个主机容器联网:

创建网桥br0,编辑br0配置文件:

[root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE="br0"
BOOTPROTO=none
IPV6INIT=no
TYPE="Bridge"
ONBOOT="yes"
NAME="br0"
IPADDR=192.168.158.100
NETMASK=255.255.255.0
GATEWAY=192.168.158.2
USERCTL=no

编辑本机网卡配置文件ens33,主要添加配置参数BRIDGE=br0:

[root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.158.100
NETMASK=255.255.255.0
GATEWAY=192.168.158.2
NAME=ens33
UUID=cb22149a-7dc8-456c-8b6b-a25b28db9f30
BRIDGE=br0

重启网卡:

[root@centos ~]# service network restart
Restarting network (via systemctl):                        [  OK  ]
[root@centos ~]#

查看本地网络信息:

Docker之容器互联实现容器间通信_第4张图片

删除docker0的默认网桥信息:

[root@centos ~]# ifconfig docker0 down
[root@centos ~]# brctl delbr docker0

修改docker的桥接网卡为br0,centos7为例:

[root@centos ~]# vim /etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS="-b=br0"
[root@centos ~]# vim /lib/systemd/system/docker.service
....
ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_NETWORK_OPTIONS
EnvironmentFile=-/etc/sysconfig/docker-network

重启docker服务!

[root@centos ~]# systemctl daemon-reload
[root@centos ~]# systemctl start docker

创建docker容器:

[root@centos ~]# docker run -it --name=centos-test1 -d centos /bin/bash

进入容器并测试,201为另一台宿主机:

Docker之容器互联实现容器间通信_第5张图片

可以通过docker inspect命令查看容器网络该容器ip地址为192.168.158.5,信息如下:

Docker之容器互联实现容器间通信_第6张图片

在另一台宿主机做同样的网桥设置,创建容器,查看该容器ip地址:

Docker之容器互联实现容器间通信_第7张图片

在主机上Ping这台宿主机容器Ip,可以看到能够ping通:

Docker之容器互联实现容器间通信_第8张图片