Docker-ambassador


@seapy

2014. 7. 30
Docker Korea

AMBASSADOR 컨테이너를 이용한 

서버를 넘나드는 연결 


Cross-Host linking using Ambassador Containers
https://docs.docker.com/articles/ambassador_pattern_linking


http://qiita.com/reoring/items/75817a01f719328b99fe

HOST

54.191.106.107

# 레디스 서버 실행
$ docker run -d --name redis crosbymichael/redis 

# ambassador 실행
$ docker run -it --rm --link redis:redis --name redis_ambassador -p 6379:6379 svendowideit/ambassador 

CLIENT

54.191.140.233

# ambassador 실행
$ docker run -it --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://54.191.106.107:6379 svendowideit/ambassador
호스트의 IP, 포트번호를 환경변수로 설정

# redis 클라이언트 실행
$ docker run -i -t --rm --link redis_ambassador:redis relateiq/redis-cli

동작방식


socat 유틸리티를 이용해서 
$ socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:172.17.0.136:6379 

svendowideit/ambassador
Dockerfile 실행 명령어 한줄
CMD     env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/'  | sh && top
"REDIS_PORT_1234_TCP" 환경변수에서 PORT와 TCP사이의 포트 번호를 가져와서 TCP4-LISTEN할당. 실제 매핑주소, 포트를 TCP4에 할당 


환경변수로 주어진 데이터를 ambassador 컨테이너가 입력받은 포트 그대로 expose


SOCAT

(SOcket CAT)

두개의 양방향 바이트 스트림을 연결하고 데이터를 전송.
포트포워딩등 다양한 용도로 사용된다.

socat 문서
http://www.dest-unreach.org/socat/doc/socat.html 

다양한 사용예
http://www.dest-unreach.org/socat/doc/socat.html#EXAMPLES

사용된 이미지 Dockerfile


crosbymichael/redis
https://github.com/crosbymichael/redis-docker/blob/master/Dockerfile

svendowideit/ambassador
 https://github.com/SvenDowideit/dockerfiles/tree/master/ambassador
Made with Slides.com