가장 빨리 만나는 Docker 6장 - 3. 다른 서버의 Docker 컨테이너에 연결하기
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Docker 좀더 활용하기
이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20
다른 서버의 Docker 컨테이너에 연결하기
앞에서 설명한 –link 옵션은 같은 서버의 컨테이너끼리 연결하는 옵션입니다. 이번에는 앰배서더 컨테이너(Ambassador Container)라는 것을 이용하여 다른 서버에 있는 컨테이너에 연결해보겠습니다.
앰배서더 컨테이너는 특별한 컨테이너가 아닌 그냥 일반적인 Docker 컨테이너입니다. 앰배서더 컨테이너는 socat이라는 프로그램을 이용하여 TCP 연결을 다른 곳으로 전달하도록 구성되어 있습니다.
그림 6-4 앰배서더 컨테이너 기본 개념
앰배서더 컨테이너의 Dockerfile을 보면 상당히 복잡하게 보이지만 생각보다 간단합니다. docker run
명령을 실행할 때 전달한 환경 변수를 이용하여 socat을 실행하는 셸 스크립트입니다.
CMD env | grep _TCP= | \
sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat \
TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' \
| sh && top
docker run
명령에서 --link
옵션을 사용하거나 -e EXAMPLE_PORT_1234_TCP=tcp://192.168.0.10:1234
라고 설정해주면 다음과 같이 환경 변수에 포트 정보가 설정됩니다.
env
명령으로 환경 변수를 출력하고, grep
명령으로 _TCP=를 포함하는 문자열을 찾습니다. 그리고 sed
명령으로 정규표현식을 사용하여 문자열에서 포트 번호와 IP 주소를 추출합니다. 그 뒤 추출한 포트 번호와 IP 주소를을 이용하여 socat 명령을 실행합니다.
EXAMPLE_PORT=tcp://192.168.0.10:1234
EXAMPLE_PORT_1234_TCP_ADDR=192.168.0.10
EXAMPLE_NAME=/example_ambassador/example
HOSTNAME=0cf479687cb0
EXAMPLE_PORT_1234_TCP_PORT=1234
HOME=/
EXAMPLE_PORT_1234_TCP_PROTO=tcp
EXAMPLE_PORT_1234_TCP=tcp://192.168.0.10:1234
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
위 예제 환경에서는 socat
명령으로 로컬의 TCP 프로토콜 1234번 포트를 192.168.0.10의 1234번 포트로 데이터를 전달하도록 설정합니다. 이러한 구조를 앰배서더 패턴(Ambassador Pattern)이라 합니다.
그냥 다른 서버의 컨테이너에서 포트를 노출시키고, 해당 포트에 연결하면 간단한데 왜 이렇게 복잡한 방법을 사용할까요? 컨테이너에서 포트를 노출시키면 해당 서버의 IP 주소나 도메인을 알아야 합니다. 이렇게 되면 작성한 애플리케이션의 소스 레벨에서 IP 주소나 도메인을 설정해주어야 합니다. 만약 서버의 IP주소, 도메인이 바뀌면 소스를 수정해야 하는데, 앰배서더 컨테이너를 이용하면 별칭으로 접근하므로 소스를 수정하지 않아도 됩니다. 즉 외부에 있는 서버라도 같은 서버의 Docker 내부망에 있는 것과 같은 효과가 납니다.