docker容器间基于Link单向通信
情景概述
在进行Java开发时,一般会部署两台服务器,一个是Tomcat,一个是数据库。
对应到docker环境,会在一台物理机上,部署docker,在docker中运行两个容器,分别是Tomcat容器和数据库容器。当两个容器都启动后,docker会自动为每个容器赋予ip地址。这两个容器可以通过ip地址互相访问。
直接通过ip访问会有一些局限性,比如在项目刚上线的时候通过ip访问,后期如果要更换容器,假如MySQL容器被更换为了一个新的MySQL容器。ip地址由原来的107.1.31.24变为了107.1.31.25。此时Tomcat容器访问的ip还是107.1.31.24,这时候就需要去更改Tomcat容器中的配置。
在大集群应用中,如果存在几百个容器,每个都去一 一更换,将非常麻烦。所以利用ip访问容器的方式,不是最好的方式。
取而代之的方式是为每个容器赋予独立的名称。通过名称去访问,当ip发生变化,只要容器名称不变,不需要更改访问配置。
如下图所示,Tomcat会访问MySQL容器获取数据,MySQL一般不会去访问Tomcat容器,这种形式的访问,称为单项访问。针对单向访问,可以使用link技术,完成使用容器名称而不是ip来访问的工作。
使用容器ip访问案例
1创建一个容器,名称为mydb
docker run --name mydb -d centos sleep 1d
mydb这个容器是基于centos镜像创建的一个名称为mydb的容器(只是为了模拟演示,并不是一个真实的数据库容器)。
sleep 1d 表示在该容器创建1天后退出。也就是说,这个容器启动后,会执行sleep 1d命令,让容器处于 “睡眠” 状态一天。用于一些简单的测试场景,比如只想让容器保持运行状态一段时间来检查资源占用等情况,或者作为一个简单的占位,后续再通过其他方式进入容器并执行更有意义的操作。
2.查看容器信息
docker ps
3.获取指定容器的详细信息
docker inspect 容器编号
可以看到容器的ip为:172.17.0.5
4.再创建一个容器,名称为myweb
docker run --name myweb -d centos sleep 1d
5.查看容器信息
docker ps
6.查看新容器的详细信息
容器ID:172.17.0.6
7.进入myweb容器
docker exec -it f1398936d154 /bin/bash
进入之后,ping一下mydb这个容器的ip
ping 172.17.0.5
可以看到,这两个容器,可以通过ip进行互联。
通过ip访问并不是推荐的访问方式,回到开头所说的,ip可能会更换,如果更换ip就要去重新配置相关的参数,比较麻烦,使用link来完成根据名称的访问。
使用容器名称访问案例
有一种解决方法就是通过link,将myweb这个web应用,单项连接到mydb上。具体操作如下:
1.先把myweb容器删除
docker rm -f f1398936d154
2.重新创建名称为myweb的容器,并连接到mydb容器
docker run --name myweb --link mydb -d centos sleep 1d
3.查看已有容器
4.进入到myweb容器内部
docker exec -it 9ebbbdf075b5 /bin/bash
5.然后ping mydb
这次没有ping mydb这个容器的ip地址,而是直接ping mydb这个容器名称,发现也可以ping通。这就是设置了link的作用。
6.尝试在mydb中ping myweb
此时进入到mydb容器里面,然后ping myweb
发现是ping不通的,如果要在mydb中用容器名称的方式ping通myweb容器,这个就涉及到容器之间的双向通信。
容器之间的双向通信,在下一个文章中介绍。