如何在一个docker容器中使用环境变量获取ip和port?

时间:2017-03-22 15:28:23

标签: nginx docker containers docker-compose docker-container

我使用Docker-Compose。

前段时间我用过这段代码。 Nginx使用来自环境变量的ip和端口,例如" API_PORT_5432_TCP_ADDR" " API_PORT_5432_TCP_PORT"

现在我无法从一个容器连接到另一个容器。我在文档中找到了一些描述,"链接"应该做这样的工作,我的意思是它创建环境变量,然后我可以在其他容器中获取它。但我不知道,我做错了什么。有办法解决这个问题吗?如果你给我链接或一些代码行,将很高兴。

谢谢。

version: '3.0'
    services:
      ubuntubase:
        build: ./ubuntu-base 
      backend:
          build: ./backend
          links:
              - postgresql:db
          expose:
              - "6060"
          depends_on:
              - ubuntubase
              - postgresql
      nginxreverseproxy:
          build: ./nginx-reverse-proxy
          expose:
              - "80"
              - "443"
          links:
              - backend:api
          ports:
              - "80:80"
          volumes:
              - ./logs/:/var/log/nginx/
          depends_on:
              - ubuntubase
              - backend


      postgresql:
        restart: always
        image: sameersbn/postgresql:9.6-2
        expose:
          - "5432"
        depends_on:
            - ubuntubase
        environment:
          - DEBUG=false
          - DB_USER=...
          - DB_PASS=...
          - DB_NAME=...  
        volumes:
          - /srv/docker/postgresql:/var/lib/postgresql

1 个答案:

答案 0 :(得分:1)

links无法通过环境变量发挥作用。它的工作原理是将服务的名称公开,就像它是DNS主机名一样。所以在你的例子中,你的" nginxreverseproxy"服务可以连接到"后端"使用主机名" api"。

进行服务

默认情况下,这些链接使用服务名称,即如果您已指定:

links:
  - backend

然后你会连接到"后端"。如果您提供其他名称(正如您使用" api"那么),那么该名称将作为别名公开。

然而,这不会传达端口。如果您想使用非默认端口,您可能必须自己设置一个环境变量,然后告诉您的服务使用它。

例如,您的"后端"暴露端口6060.如果您的" nginxreverseproxy"不知道,你可以用环境变量告诉它。

nginxreverseproxy:
  environment:
    - BACKEND_PORT=6060

然后告诉nginx服务使用该环境变量,加上主机名" api"来连接。