도커 컨테이너에서 도커 호스트로 연결


10

도커 컨테이너에서 웹 사이트의 모든 부분을 실행하는 설정이 있습니다. 포트 80 및 443에서 수신 대기하는 내 nginx는 컨테이너에서 실행됩니다.

363292a98545        scivm/nginx-django-scivmcom:latest   /usr/bin/supervisord   12 days ago         Ghost               0.0.0.0:40001->22/tcp, 88.198.57.112:443->443/tcp, 88.198.57.112:80->80/tcp     lonely_feynmann           

다른 컨테이너의 서비스에 프록시를 설정하고 싶습니다. 이 컨테이너는 호스트의 포트 3000에 바인딩됩니다.

b38c8ef72d0a        mazzolino/strider-dind:latest        wrapdocker /usr/bin/   41 minutes ago      Up 41 minutes       0.0.0.0:3000->3000/tcp, 22/tcp, 27017/tcp                                       distracted_einstein      

도커 호스트의 내 iptables는 다음과 같습니다.

root@Ubuntu-1204-precise-64-minimal /var/run # iptables -L
Chain INPUT (policy ACCEPT) target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8000
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

컨테이너 내에서 iptables 구성으로 인해 호스트 시스템의 포트 3000에 연결할 수 없습니다.

포트 3000을 공개 인터넷에 공개하고 싶지 않습니다.

포트 3000의 컨테이너와 호스트 사이에 직접 브리지를 여는 방법이 있습니까?

또는 docker ip 범위에서 수락하도록 iptables를 수정해야합니까?

답변:


5

Docker의 링크 기능 만 있으면됩니다 (더 이상 사용되지 않음).

시도한 모든 복잡한 작업을 제거하고 명명 된 컨테이너를 사용한 다음 서로 연결하십시오.


도커 링크 기능을 살펴 보았지만 올바르게 이해하면 몇 가지 문제가 있습니다. 1. 자식이 다시 시작되면 새로운 IP 주소를 얻게됩니다. 그런 다음 새 환경 변수를 얻으려면 해당 자녀의 모든 부모를 다시 시작해야합니다. 2. 연결하기 위해 해당 환경 변수를 읽으려면 애플리케이션에 로직을 추가해야합니다.
user3133475

다시 시작된 컨테이너 ( docker restart your_container)는 IP 주소를 유지해야합니다. 주어진 이미지를 기반으로 새 컨테이너를 실행하는 경우에만 새 IP ( docker run -d image command)를 얻게됩니다 .
Elias Probst

2
그것은 사실이지만, 적어도 docker 1.0에서 "docker restart"는 컨테이너에 새로운 IP 주소를 부여합니다. 변경되지 않은 이전 IP 동작에 의존하는 일부 스크립트 에서이 문제를 해결하십시오.
jamshid 2016 년

1
나는 이것이 OP가 옳은 일이라고 생각하지만 여기에 질문에 대한 답을 찾기 위해 여기에 왔습니다. 즉, 호스트의 서비스에 연결하는 방법입니다.
mc0e

2

엘리아스의 대답은 맞지만 링크는 길고 혼동됩니다. 다음은 간단한 요약입니다.

먼저 컨테이너를 실행하여 연결하고 이름을 지정하십시오.

sudo docker run -d --name db training/postgres

그런 다음 다른 컨테이너를 실행하여 첫 번째 컨테이너에 연결하십시오.

sudo docker run -d -P --name web --link db:db training/webapp python app.py

첫 번째 컨테이너에서 두 번째 컨테이너로의 링크가 들어갑니다 /etc/hosts. 따라서 호스트 이름처럼 사용할 수 있습니다. 예를 들면 다음과 같습니다.

sudo docker run --name web --link db:db training/webapp ping db
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.