Program Tip

docker-compose에서 호스트 IP 사용

programtip 2020. 12. 5. 10:30
반응형

docker-compose에서 호스트 IP 사용


다른 서버에서 실행할 수 있는 도커 작성 파일 을 만들고 싶습니다 .

이를 위해 docker-compose.yml 의 여러 위치에서 서버의 호스트 IP 또는 호스트 이름 (모든 컨테이너가 실행중인)을 지정할 수 있어야합니다 .

예를 들어 동료 영사 컨테이너에서 서버를 찾을 수있는 방법을 정의하려는 영사 컨테이너의 경우입니다.

consul:
  image: progrium/consul
  command: -server -advertise 192.168.1.125 -bootstrap

나는 분명히 192.168.1.125를 하드 코딩하고 싶지 않습니다.

내가 사용할 수 env_file : 호스트 이름을 지정하거나 IP 및 모든 서버에 채택, 나는에 고정 표시기 - compose.yml 그 것을 한 곳에서 정보와 사용 그래서. 그러나 이것은 advertise 매개 변수가 아닌 환경 변수를 지정하는 데만 사용할 수 있습니다.

더 나은 해결책이 있습니까?


docker-compose는 compose 명령을 실행하는 환경에서 환경 변수를 사용할 수 있습니다.

https://docs.docker.com/compose/compose-file/#variable-substitution의 설명서를 참조하십시오.

@balver가 제안한 것과 같은 래퍼 스크립트를 만들 수 있다고 가정하면 EXTERNAL_IP값을 포함하는 라는 환경 변수를 설정할 수 있습니다 $(docker-machine ip).

예:

#!/bin/sh
export EXTERNAL_IP=$(docker-machine ip)
exec docker-compose $@

# docker-compose.yml
version: "2"
services:
  consul:
    image: consul
    environment:
      - "EXTERNAL_IP=${EXTERNAL_IP}"
    command: agent -server -advertise ${EXTERNAL_IP} -bootstrap

아쉽게도 임의의 포트 할당을 사용하는 경우를 추가 할 방법이 없으므로 EXTERNAL_PORT포트를 정적으로 연결해야합니다.

추신 : HashiCorp Nomad에서는 기본적으로 매우 유사한 기능이 활성화되며 매핑 된 포트도 포함됩니다. 문서 : https://www.nomadproject.io/docs/jobspec/interpreted.html#interpreted_env_vars


더 나은 해결책이 있습니까?

물론! 컨테이너 간의 통신을 위해 호스트 IP가 전혀 필요하지 않습니다. 파일의 link컨테이너 인 경우 docker-compose.yaml서비스의 IP 주소를 검색하는 데 사용할 수있는 여러 환경 변수에 액세스 할 수 있습니다.

예를 들어 두 개의 컨테이너가있는 docker-compose 구성을 생각해보십시오 consul.

consul:
  image: progrium/consul
  command: -server -bootstrap
webserver:
  image: larsks/mini-httpd
  links:
    - consul

먼저, 시작하여 consul단지로 -server -bootstrap, consul수치가 자신의 예를 들어, 주소를 광고의 아웃 :

consul_1    | ==> Consul agent running!
consul_1    |          Node name: 'f39ba7ef38ef'
consul_1    |         Datacenter: 'dc1'
consul_1    |             Server: true (bootstrap: true)
consul_1    |        Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 53, RPC: 8400)
consul_1    |       Cluster Addr: 172.17.0.4 (LAN: 8301, WAN: 8302)
consul_1    |     Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
consul_1    |              Atlas: <disabled>

에서 webserver컨테이너, 우리는 1 PID하는 데 사용할 수있는 다음과 같은 환경 변수를 찾을 수 있습니다 :

CONSUL_PORT=udp://172.17.0.4:53
CONSUL_PORT_8300_TCP_START=tcp://172.17.0.4:8300
CONSUL_PORT_8300_TCP_ADDR=172.17.0.4
CONSUL_PORT_8300_TCP_PROTO=tcp
CONSUL_PORT_8300_TCP_PORT_START=8300
CONSUL_PORT_8300_UDP_END=udp://172.17.0.4:8302
CONSUL_PORT_8300_UDP_PORT_END=8302
CONSUL_PORT_53_UDP=udp://172.17.0.4:53
CONSUL_PORT_53_UDP_ADDR=172.17.0.4
CONSUL_PORT_53_UDP_PORT=53
CONSUL_PORT_53_UDP_PROTO=udp
CONSUL_PORT_8300_TCP=tcp://172.17.0.4:8300
CONSUL_PORT_8300_TCP_PORT=8300
CONSUL_PORT_8301_TCP=tcp://172.17.0.4:8301
CONSUL_PORT_8301_TCP_ADDR=172.17.0.4
CONSUL_PORT_8301_TCP_PORT=8301
CONSUL_PORT_8301_TCP_PROTO=tcp
CONSUL_PORT_8301_UDP=udp://172.17.0.4:8301
CONSUL_PORT_8301_UDP_ADDR=172.17.0.4
CONSUL_PORT_8301_UDP_PORT=8301
CONSUL_PORT_8301_UDP_PROTO=udp
CONSUL_PORT_8302_TCP=tcp://172.17.0.4:8302
CONSUL_PORT_8302_TCP_ADDR=172.17.0.4
CONSUL_PORT_8302_TCP_PORT=8302
CONSUL_PORT_8302_TCP_PROTO=tcp
CONSUL_PORT_8302_UDP=udp://172.17.0.4:8302
CONSUL_PORT_8302_UDP_ADDR=172.17.0.4
CONSUL_PORT_8302_UDP_PORT=8302
CONSUL_PORT_8302_UDP_PROTO=udp
CONSUL_PORT_8400_TCP=tcp://172.17.0.4:8400
CONSUL_PORT_8400_TCP_ADDR=172.17.0.4
CONSUL_PORT_8400_TCP_PORT=8400
CONSUL_PORT_8400_TCP_PROTO=tcp
CONSUL_PORT_8500_TCP=tcp://172.17.0.4:8500
CONSUL_PORT_8500_TCP_ADDR=172.17.0.4
CONSUL_PORT_8500_TCP_PORT=8500
CONSUL_PORT_8500_TCP_PROTO=tcp

There is a set of variables for each port EXPOSEd by the consul image. For example, in that second image, we could interact with the consul REST API by connecting to:

http://${CONSUL_PORT_8500_TCP_ADDR}:8500/

With the new version of Docker Compose (1.4.0) you should be able to do something like this:

docker-compose.yml

consul:
  image: progrium/consul
  command: -server -advertise HOSTIP -bootstrap

bash

$ sed -e "s/HOSTIP/${HOSTIP}/g" docker-compose.yml | docker-compose --file - up

This is thanks to the new feature:

  • Compose can now read YAML configuration from standard input, rather than from a file, by specifying - as the filename. This makes it easier to generate configuration dynamically:

    $ echo 'redis: {"image": "redis"}' | docker-compose --file - up
    

I've used docker internal network IP that seems to be static: 172.17.0.1


Environment variables, as suggested in the earlier solution, are created by Docker when containers are linked. But the env vars are not automatically updated if the container is restarted. So, it is not recommended to use environment variables in production.

Docker, in addition to creating the environment variables, also updates the host entries in /etc/hosts file. In fact, Docker documentation recommends using the host entries from etc/hosts instead of the environment variables.

Reference: https://docs.docker.com/userguide/dockerlinks/

Unlike host entries in the /etc/hosts file, IP addresses stored in the environment variables are not automatically updated if the source container is restarted. We recommend using the host entries in /etc/hosts to resolve the IP address of linked containers.

참고URL : https://stackoverflow.com/questions/29061026/using-the-host-ip-in-docker-compose

반응형