一、Link方式实现本机容器间互联通信
自定义容器名
连接系统依据容器名称执行,所以首先需要自定义容器名称。
使用--name标记可以为容器自定义名称:
[root@centos7 ~]# docker run -d --name mysqldb -p3306:3306 -e MYSQL_ROOT_PASSWORD=fanshine mysql/mysql-server
也可以使用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容器使用。
二、使用自定义网桥实现容器跨主机互联通信
Docker默认的网桥是docker0。此网桥只会在本机连接所有容器。
容器的虚拟网卡在主机上看一般叫做veth*而docker0网桥把所有这些网卡桥接在一起,如下:
通过ip命令查看到的docker网络信息如下:
这样可以把这个网络看成一个私有网络,如果要让外网连接到容器中,就需要做端口映射,即-p参数。
例如:主机A和主机B的网卡一都连着物理交换机的同一vlan10,这样网桥一和网桥三就相当于在同一物理网络中,而容器一、容器三、容器四也在同一个网络中,它们之间可以相互通信,而且可以跟同一vlan种的其他物理机器互联,如下图所示:
创建跨多个主机容器联网:
创建网桥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 ~]#
查看本地网络信息:
删除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 inspect命令查看容器网络该容器ip地址为192.168.158.5,信息如下:
在另一台宿主机做同样的网桥设置,创建容器,查看该容器ip地址:
在主机上Ping这台宿主机容器Ip,可以看到能够ping通: