我使用docker-compose来描述我的一个应用程序的部署。该应用程序由
组成如果我缩放nodejs应用程序,我希望nginx自动缩放到三个应用程序。
最近我使用以下代码片段:
https://gist.github.com/cmoore4/4659db35ec9432a70bca
这是基于以下事实:在链接上创建了一些环境变量,并在新服务器出现时更改。
但现在使用docker-compse文件的第2版和docker的新链接系统,环境变量不再存在。
我的nginx现在如何检测我的应用程序的缩放?
version: '2'
services:
nodejs:
build:
context: ./
dockerfile: Dockerfile.nodejs
image: docker.shadoware.org/passprotect-server:1.0.0
expose:
- 3000
links:
- mongodb
environment:
- MONGODB_HOST=mongodb://mongodb:27017/passprotect
- NODE_ENV=production
- DEBUG=App:*
nginx:
image: docker.shadoware.org/nginx:1.2
links:
- nodejs
environment:
- APPLICATION_HOST=nodejs
- APPLICATION_PORT=3000
mongodb:
image: docker.shadoware.org/database/mongodb:3.2.7
答案 0 :(得分:0)
文档说明here:
链接服务的容器可以在与别名相同的主机名上访问,如果没有指定别名,则可以访问服务名称。
所以我相信您可以在nginx conf文件中设置服务名称,如:
upstream myservice {
yourservice1;
yourservice2;
}
因为它们将作为每个容器的/etc/hosts
中的主机条目导出。
但是如果你真的想拥有那个主机:端口信息作为环境变量,你可以编写一个脚本来解析docker-compose.yml和define an .env file,或者手动完成。
<强>更新强>
您可以从容器外部获取该端口信息,这将返回端口
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' your_container_id
但是如果你想从容器内部做到这一点,那么你想要的是一个服务发现系统,如zookeeper
有一个很长的feature request thread in docker's repo,关于那个。
One workaround solution引起了我的注意。您可以尝试基于此构建自己的nginx图像。