2017-09-07 2 views
1

일반적으로 도커 컨테이너의 포트를 호스트에 노출시키는 솔루션이 있습니다.한 도커 컨테이너에서 다른 컨테이너로 포트를 전달하는 방법은 무엇입니까?

내 경우에는 하나의 컨테이너에서 다른 컨테이너로 로컬 포트를 전달하려고합니다. 컨테이너 A에 서비스를 실행한다고 가정하면 로컬 호스트의 db에 액세스하기 위해 하드 코딩 된 구성이됩니다. 3306. 하지만 컨테이너 B에 db 서버를 실행하고 싶습니다.

양식 A- 로컬 호스트 : 3306을 B-IP로 포트 전달하는 가장 좋은 방법은 무엇입니까? 3306?

답변

2

이 당신의 3306에서 로컬 듣고 B-IP:3306에 양방향 트래픽을 전달합니다

socat TCP-LISTEN:3306,fork TCP:B-IP:3306 & 
컨테이너과 시작 실행에 socat를 설치하는 데 도움이됩니다. socat은 socat 패키지에서 사용할 수 있습니다. 그래서 만약 당신이 실행됩니다 아래의 그것을 설치 명령을

$ yum install -y socat 
$ apt install -y socat 
$ apk add socat 

편집-1 당신은 심지어 원래의 용기

Dockerfile

FROM alpine 
RUN apk update && apk add socat 
닿지 않도록하여이 작업을 수행 할 수 있습니다

아래와 같이 파일을 빌드하십시오.

docker build -t socat . 

는 지금의 네트워크에이 컨테이너를 실행합니다 같은

docker run --name mysql-bridge-a-to-b --net=container:<containerAid> socat socat TCP-LISTEN:3306,fork TCP:BIP:3306 

이에서 컨테이너를 실행합니다. 따라서 A 네트워크를 청취 할 때 A 콘테이너에 손을 대지 않았더라도 localhost:3306을 A로 사용할 수있게됩니다.

0

Docker-Compose으로 할 수 있습니다.

고정 표시기-compose.yml 예 : 웹 및 MySQL은, 각각의 고정 표시기 인스턴스는 서비스로 정의 된 이름을 사용하여 서로를 볼 수 있습니다 여기에 2 개 고정 표시기의 인스턴스가

version: '3' 
services: 
    web: 
    build: .web 
    ports: 
    - "5000:5000" 
    mysql: 
    build: .mysql 
    ports: 
    - "3306:3306" 

.

희망이

2

호스트와 동일한 네트워크 모드로 컨테이너를 실행할 수 있습니다.

이 경우 컨테이너 관점에서 볼 때 localhost 또는 127.0.0.1은 호스트 시스템을 나타냅니다. 따라서 db가 3306에서 수신 대기하는 다른 컨테이너 B에서 실행 중이면 컨테이너 A의 localhost : 3306 주소가 컨테이너 B의 데이터베이스에 충돌합니다.

관련 문제