一、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
- 这种情况最好使用自定义到bridge网络,上面也提到了,自定义到bridge网络自带“容器名 =>
容器IP”的解析能力,因此在容器A要想访问容器B,直接使用容器名称即可。 - 新建网络
docker network create -d bridge test-net
参数说明:
-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 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加端口访问。