docker-compose scale with nginx且没有环境变量

时间:2016-07-02 10:38:52

标签: docker docker-compose

我使用docker-compose来描述我的一个应用程序的部署。该应用程序由

组成
  • mongodb数据库,
  • 一个nodejs应用程序
  • nginx前端nodejs的静态文件。

如果我缩放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

1 个答案:

答案 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图像。