一、容器之间通信
1、单向通信
1.1、什么意思
mysql和tomcat是两个独立的容器,但是tomcat需要和mysql通信,而mysql完全不用和tomcat通信,这就叫容器之间的单向通信。
1.2、怎么通信
要谈通信,就需要谈一下ip,因为不知道ip是无法通信的。最简单的例子你jdbc要连接mysql数据库,你也需要配置mysql的ip地址。容器之间也不例外,都是靠虚拟ip来完成的。
何为虚拟ip?
虚拟ip:容器创建完成后都会生成一个唯一的ip,这个ip外界不能直接访问,他只用于容器之间进行通信交互用。这就是虚拟ip。
容器之间的虚拟ip是互通的。
通信是什么意思、靠什么通信我们都知道了,那还不抓紧实战一把?
1.3、实战演示
1.3.1、创建tomcat容器
docker run -d --name mytomcat tomcat # --name指定的名称再docker ps里是可以看到的,最后一列Name docker ps
知识点出现了!!!--name
是神马鬼?先看如下一个场景
在公司或者你直接买的阿里云数据库/redis等服务为什么给你个数据库域名而不是推荐用ip?因为ip的话可变,比如你业务系统写死了ip,这时候人家那边内网ip变了,你这所有用这个数据库的业务系统都要跟着改。用域名的话一劳永逸,底层ip变了后再映射到新域名上就行,不影响业务系统。
--name
就是给docker配置名称来与虚拟ip做映射,因为ip老变化,每次变化的时候其他容器都需要跟着改动才行。配个名称一劳永逸。创建容器的时候通过 --name xxx
即可指定。
1.3.2、创建mysql容器
我也没拉取mysql镜像,就用centos模拟一下数据库吧,主要是看能不能ping 通,能ping 通就代表能通信。
docker run -d --name database -it centos /bin/bash
1.3.3、小试一把
我们需要进入mytomcat的容器然后去ping database的ip看看是否通,那么容器的虚拟ip怎么查呢?
# 这又是一个知识点 docker inspect 容器id # 比如:(9bf58b4014dd是我们database的容器id) docker inspect 9bf58b4014dd
现在知道数据库的ip了,那赶紧进入我们的mytomcat的容器去ping一波
docker exec -it mytomcat /bin/bash ping 172.17.0.6
完美!
等等,貌似不是很完美,我们给数据库指定了名称database,那我们赶紧ping database 试一下。结果啪啪啪打脸,完全不通,那是因为相当于你就起了个名字,并没有做映射。那怎么映射呢?mytomcat启动容器的时候指定一个--link参数即可。
# 强制删除老的 docker rm -f mytomcat # 创建新的容器,用--link指定我们想连的配置的数据库“域名” docker run -d --name mytomcat --link database tomcat # 进入mytomcat容器 docker exec -it mytomcat /bin/bash # ping ping database
这次是真的完美~!
1.4、总结
- 容器简单虚拟ip是互通的
-
用--name 和 --link可以完成自定义“域名”来取代可变化的ip
2、双向通信
方式有很多,一般都采取桥接方式。由于篇幅过长,自行Google即可。重点搞懂了容器间的通信是什么意思,大概怎么做即可。比如上面的--link也是其一做法。
二、容器间数据共享
1、场景
需要宿主机和容器之间共享数据的业务场景。比如Mysql的
比如:集群部署的时候,我们的应用程序需要部署到10个docker容器里,那么比如要想改动一个文件的内容,就要重新打包然后部署10次。我们可以将我们需要部署的应用程序挂载到宿主机上,这样改一处就行了。比如静态html文件,再一个宿主机上启动了10个容器,这时候需求需要改文案(修改html),我们需要修改10个容器里的html,过于麻烦,所以可以把这个html挂载到宿主机,容器直接使用挂载到宿主机的文件即可。
再比如:Mysql的数据目录可配置文件(一些高级配置或者优化配置啥的肯定要用一份),这也可以用此场景。
2、语法
# 语法 docker run -v 宿主机路径:容器内挂载路径 镜像名 # 比如如下:他会把/home/main/programe下面的所有目录都挂载到容器的/usr/local/tomcat/webapps下 docker run -v /home/main/programe:/usr/local/tomcat/webapps tomcat
3、实战
3.1、准备
在如下目录里创建如下文件,并写上Hello Volumn~
/home/main/docker/webapps/volumn-test/index.html
3.2、操作
很简单,按照上面的语法来就成了,如下就是将/home/main/docker/webapps
下的目录挂载到容器内部/usr/local/tomcat/webapps
的目录下
docker run --name t2 -d -p 8200:8080 -v /home/main/docker/webapps:/usr/local/tomcat/webapps tomcat
3.3、验证
我们先进入容器
docker exec -it t2 /bin/bash
然后查看/usr/local/tomcat/webapps
下是否有我们挂载的目录以及文件
root@4be396ff443b:/usr/local/tomcat/webapps# ls -R volumn-test/ volumn-test/: index.html
最后我们访问下看看效果
[root@izm5 volumn-test]# curl 'localhost:8200/volumn-test/index.html' Hello Volumn~~
我们修改下宿主机上的index.html的内容,修改为Hello Volumn~~ How are you?
然后再次访问看效果:
这里修改的是宿主机
/home/main/docker/webapps/volumn-test
下的index.html,为不是容器内部的。
[root@izm5 volumn-test]# curl 'localhost:8200/volumn-test/index.html' Hello Volumn~~ How are you?
很完美,容器无感知的就生效了。
3.4、好处
我这是启动了一个容器举例,如果多启动几个呢?然后产品要修改文案,那么你登录每个容器里去修改?或者重新打包然后重新启动所有容器?有点小题大做呀,利用-v命令进行挂载实现宿主机和容器的数据共享她不香吗?