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 EXPOSE
d 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
'Program Tip' 카테고리의 다른 글
벡터에서 const를 사용하여 요소를 추가 할 수 있지만 이미 추가 된 요소를 수정할 수는 없습니까? (0) | 2020.12.05 |
---|---|
print_function을 가져온 후에 왜 print를 호출합니까 (Python 2.6에서) (0) | 2020.12.05 |
자바 웹 애플리케이션 구성 패턴 (0) | 2020.12.05 |
Boost.ASIO 기반 HTTP 클라이언트 라이브러리 (예 : libcurl) (0) | 2020.12.05 |
"n + k 패턴"이란 무엇이며 Haskell 2010에서 금지 된 이유는 무엇입니까? (0) | 2020.12.05 |