在部署这套博客的环境过程中遇到了一个困惑,大多数文档写的容器间的互联使用的是 docker run --link 这个参数,但有一个问题无法解决,
我无法进行以下操作:
docker run --name mysql --link tomcat mysql:latset
docker run --name tomcat --link mysql tomcat:latest
执行第一个操作会失败,因为link的容器mysql还没有建立,误解只好google,但也没发现一个解决方案,只好自己细心的看官方文档,来 http://docs.docker.com/engine/userguide/networking/default_network/configure-dns/
这里讲述了container互联的一些机制,简单的来说,就是docker会维护一份总体的hosts文件,然后挂载到容器中,有新的container加入,则会更新hosts文件,一旦更新了,container里也马上可见,所以解决方案就出来了——生成容器的时候指定主机名即可,如下:
docker run --name mysql -h mysql mysql:latset
docker run --name tomcat -h tomcat tomcat:latest
去掉了link参数,加上了h——host参数,指定容器的名字,现在容器内就可以直接根据别名访问其他的容器了。(经校验...本方法只适用于docker1.8及以上的版本,而centos6不支持1.8....)
当然这要求docker的防火墙配置是允许直接访问的,不然的话你还要更新docker防火墙配置。
----------------更新----------------------
最近docker更新成了1.9,1.9中 默认的网桥docker0不再维护hosts列表,只能使用link进行连接,而在用户自定义的网桥(driver:bridge)中,则会更新hosts列表,但不能使用link
这是因为docker为了网络的安全隔离,防止误访问而做的措施,因为docker0是默认网桥,所有未指定网络的container都会被扔到这。在docker0里的container就像没有包名的JAVA类,只能写写demo。
因此docker会推荐使用 自定义的网络 而非docker0。link只在docker0中可以使用,且docker的官方文档也已经指明link不推荐使用,可能会在后续的版本中去掉,因此 新建自定义网络,且用hostname来进行互联才是推荐的做法。如下:
docker network create -d bridge blog
docker run --net blog -h blog-mysql --name blog-mysql -d mysql:5.6
docker run --net blog -h blog-tomcat --name blog-tomcat -d tomcat:8.0
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于