使用docker0网关默认IP解除容器间的强关联
今天灵机一动,尝试了一下,结果成功了。
之前一直用的是一个笨方法:在创建各容器时把它们都加入同一个自建网络,各容器之间通讯使用容器名来访问,由其内建的DNS把容器名解析出容器的IP来实现通讯。
这样的做法的坏处有:
1,关联的各个容器必须全部运行,如果容器A停止或者是不存在,则调用了它名字的容器B也由于找不到该容器名而报错,无法运行。
2,容器A的名字必须固定,而且重新创建或者重新启动后需要重启容器B。
而使用docker0网关来做中转的话,可以完全避免这个问题,容器B完美运行,只是在访问不存在或者已经停止的容器A时返回无法访问的提示。重新运行容器A之后,也无须重启容器B。
具体操作是,把容器B里调用容器A的方法由容器A的名字改为docker0的网关默认IP:172.17.0.1: port (宿主机映射到容器A的端口)。
这个IP是docker0网络的默认IP,无须做任何额外修改即可使用。
这样的调用可能会使得容器间的通讯比直接写名字慢一点(可能是几十几百毫秒?),但日常使用完全感觉不出来。但是换来的便利却是巨大的,再也无须担心停止某容器后影响另一个容器的运行,容器的名字也不必再固定了。
当然,也可以在创建容器时加入自建网络,指定各容器的IP,但跟用名字差不多,只是稍微好点(容器的名字可以随便取了)。最便捷的,还是通过docker0网关中转。
这个中转也有坏处,一是上面提到的,可能会使得各容器之间的通讯时间变长,二是容器的端口必须映射宿主机端口。
终于可以随意把暂时不用的容器停掉来节省内存了。
附:之前的容器通讯方法:
容器B--->读取容器A名字--->解析出容器A的IP--->连接到容器A,这样无须映射容器A的端口。
现在的容器通讯方法:
容器B--->访问docker0网关--->网关根据容器B里指定的端口,确定要访问的容器(此端口映射已经在容器创建时指定,是唯一的,所以在这里也可以起到IP的作用)--->连接到容器A进行通讯。
就这样,轻松愉快地解除了各容器之间的强关联,但彼此之间的通讯完全不受影响。
Docker0 ten thousand years old!!!
发表评论: