什么,容器太多操作不过来?我选择Docker Compose梭哈(上)

一、容器之间通信


1、单向通信


1.1、什么意思


什么,容器太多操作不过来?我选择Docker Compose梭哈(上)


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


什么,容器太多操作不过来?我选择Docker Compose梭哈(上)


现在知道数据库的ip了,那赶紧进入我们的mytomcat的容器去ping一波


docker exec -it mytomcat /bin/bash
ping 172.17.0.6


什么,容器太多操作不过来?我选择Docker Compose梭哈(上)


完美!


等等,貌似不是很完美,我们给数据库指定了名称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


什么,容器太多操作不过来?我选择Docker Compose梭哈(上)


这次是真的完美~!


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命令进行挂载实现宿主机和容器的数据共享她不香吗?






上一篇:mongodb 安装使用遇到的问题记录


下一篇:Excel 技术篇-解决“单元格不能自动适应大小“问题