一、docker互联场景
Docker搭建开发环境用的非常多,通常开发机器上既有容器形式的应用,又有本机跑着或者调试的程序,它们之间互相依赖,如何让它们之间通信顺畅,有时候是一个挺困难的事情。容器应用和容器外应用互相访问分为三种情况:

1、容器内应用和容器内应用
2、容器内应用访问容器外应用
3、容器外应用访问容器内应用
而根据两个互相通信的容器或应用在不在一台服务器上,我们又多出一个维度的情况:
1、容器或应用在一台服务器
2、容器或应用不在一台服务器

要想彻底搞清楚互相访问的问题,就需要先弄清楚docker的网络是怎么一回事。
常用的docker网络模式有三种:bridge、host 和 overlay三种模式各有适用场景:

bridge,应用都是容器形式,且都在一个宿主机上,各个容器需要互相通信的场景;
host,容器和本机应用混杂且需要相互访问的情况;
overlay,在不同宿主机的容器之间需要互相通信的情景。

Bridge网络

分为“default bridge”和“user-defined bridge”(自定义bridge),docker安装好后会默认创建一个bridge网络(docker0),也就是“default bridge”,未指定网络的容器会默认使用这个网络。一般使用自定义bridge较多,我们定义一个私有网络,可以将我们的应用与其他应用相隔离,这在一个共享的开发服务器上非常有用,此外,自定义网络也有下面两个优点:

只有用户定义的bridge网络才有DNS功能,可通过容器名称互相访问,否则只能使用IP进行容器间访问,而IP一是会变,二是不好记;
容器可以在不停的情况下,更换自定义的bridge。

Host网络

host网络比较容易理解,如果指定容器使用host网络模式,容器会使用宿主机的网络,不会相隔离。也就是说,容器暴露的端口会直接映射到宿主机的相同端口。如果容器没有暴露端口,那么指定不指定host是没啥效果的。

Overlay网络

overlay网络用于docker自带的集群模式(docker swarm),如果没有使用swarm,创建overlay网络会报错

相较于docker swarm,使用kubernetes的较多,工作中也是使用kubernetes,overlay网络相当于kubernetes中flannel创建的联通各个node的网络,这里就不多介绍overlay网络了。

如果不想那么复杂,但又想不同机器上容器或应用互相访问,可以使用extra_hosts来解决,下面我们会谈到

二、不同情况互相访问的方法

1、容器或应用在一台宿主机上
1.1 容器A访问容器B

  1. 这种情况最好使用自定义到bridge网络,上面也提到了,自定义到bridge网络自带“容器名 =>
    容器IP”的解析能力,因此在容器A要想访问容器B,直接使用容器名称即可。
  2. 新建网络
docker network create -d bridge test-net

docker之间网络通讯 docker之间网络互联_IP


参数说明:

-d:参数指定 Docker 网络类型,有 bridge、overlay。

其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
运行两个容器并连接到新建的 test-net 网络

docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。

apt-get update
apt install iputils-ping

docker之间网络通讯 docker之间网络互联_docker之间网络通讯_02


如果你有多个容器之间需要互相连接,推荐使用 Docker Compose,后面会介绍。

1.2 容器内访问容器外应用
如何从容器内访问宿主机应用呢?我们上面提到docker默认启动一个bridge网络(docker0),如果启动的容器没有指定自定义的网络,docker会在docker0中选取一个未被使用的IP赋给容器。既然是bridge,所以我们可以通过docker0的Gateway访问到宿主机。查看一下docker0的gateway,在容器中使用gateway的ip就可以访问到宿主机。

1.3 容器外应用访问容器A
将端口映射到宿主机的端口

2、容器或应用不在一台宿主机上

2.1 机器A容器访问机器B本地应用

机器A容器中访问机器B的IP地址和应用的端口即可。

2.2 机器A本地应用访问机器B容器
和1.3类似,只要机器B中的容器使用host网络或者将端口映射到宿主机(机器B)端口,就可以通过宿主机IP加端口访问。

2.3 机器A容器访问机器B容器

机器A的容器无需特殊配置,机器B中的容器使用host网络或者将端口映射到宿主机(机器B)端口,就可以通过宿主机IP加端口访问。