我在docker 1.9上部署
我首先运行一个nginx容器:
docker run \
--name=nginx \
--link=php1:php1 \
--link=php2:php2 \
--restart=always \
-p 80:80 -p 443:443 \
-v /var/docker/nginx/conf.d:/etc/nginx/conf.d \
-d nginx:latest
请注意,我链接了两个现有的php容器:php1
和php2
。
现在我开始了一个新容器php3
。
我可以在主机上使用单个bash脚本添加nginx
到php3
的链接吗?
因为我要部署许多不同的php应用程序,每个实例我都会创建一个新的php:fpm docker容器来运行代码。
他们共享相同的nginx
服务。
我想为php应用程序制作动态部署bash脚本,以进行一键部署。
但我被阻止了nginx并不知道新创建的php主机名。
答案 0 :(得分:3)
动态添加链接是issue 3155的一部分
Pre-libnetwork(1.9,主要是很快1.10),您可以使用jwilder/nginx-proxy生成正确的nginx.conf
,并在每次需要链接新容器时重新启动nginx服务。
但是使用libnetwork(及其0.6 release early february),docker 1.10附带了新的Docker networks features。
这意味着您可以将容器附加到用户定义的网络,使其可以通过名称自动显示在彼此之外!
$ docker run -itd --name=container2 busybox
498eaaaf328e1018042c04b2de04036fc04719a6e39a097a4f4866043a2c2152
然后创建一个隔离的桥接网络以进行测试。
$ docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw
06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8
$ docker run -itd --name=container2 busybox
498eaaaf328e1018042c04b2de04036fc04719a6e39a097a4f4866043a2c2152
$ docker network connect isolated_nw container2
$ docker run --net=isolated_nw --ip=172.25.3.3 -itd --name=container3 busybox
选定的IP地址是容器网络配置的一部分,将在容器重新加载时保留 此功能仅在用户定义的网络上可用,因为它们可以保证其子网配置不会在守护程序重新加载中发生更改。
在用户定义的
pingisolated_nw
上,Docker嵌入式DNS服务器可以为网络中的其他容器启用名称解析。在container2
内,可以按名称container3
这意味着,使用docker 1.10,连接到用户定义网络的容器可以通过名称相互看到。
但还有更多:Linking containers in user-defined networks
$ docker run --net=isolated_nw -itd --name=container4 --link container5:c5 busybox
01b5df970834b77a9eadbaff39051f237957bd35c4c56f11193e0594cfd5117c
在
--link
的帮助下,container4
也可以使用别名container5
到达c5
。请注意,在创建
container4
时,我们会链接到尚未创建的名为container5
的容器。
这是默认网桥中的传统链路与用户定义网络中的新链路功能之间的行为差异之一。- 遗留链接本质上是静态的,并且它使用别名强制绑定容器,并且它不会容忍链接容器重新启动。
- 虽然用户定义网络中的新链接功能本质上是动态的,并且支持链接容器重启,包括容忍链接容器上的IP地址更改。
你将在新的docker 1.10中有两个选择:
要么具有固定的NGiNX配置,要么将反向代理转换为可能尚未创建的容器c1
,c2
,c3
的固定列表...
每次创建新容器时,都会使用相应的链接重新启动NGiNX容器:--link c2:myNewContainer2
或者您的NGiNX容器主进程实际上监视用户定义的网络,并且对于检测到的每个新容器,重新生成NGiNX conf,并正常重启NGiNX守护进程。