Docker 좀더 활용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

Docker 컨테이너 연결하기

Docker로 이미지를 생성할 때 웹 서버, DB 등 필요한 프로그램을 모두 설치할 수도 있지만 보통 프로그램별로 이미지를 생성합니다. 이렇게 프로그램별로 이미지를 생성하고, 컨테이너를 생성했을 때 옆에 있는 컨테이너에 접속할 일이 많습니다. 예를 들면 웹 서버는 DB에 연결하여 데이터를 주고 받아야 합니다.


그림 6-3 Docker 컨테이너 연결

Docker 컨테이너끼리 연결할 때는 docker run 명령에서 --link 옵션을 사용합니다. 먼저 DB 이미지를 컨테이너로 실행합니다. 이번에는 MongoDB를 사용해보겠습니다(docker run 명령은 로컬에 이미지가 없으면 자동으로 이미지를 받아옵니다).

$ sudo docker run --name db -d mongo

DB 컨테이너 이름은 db로 설정하였습니다.

이제 web 컨테이너를 생성하면서 db 컨테이너와 연결합니다. 웹 서버로 사용할 컨테이너는 nginx 이미지로 생성하겠습니다.

$ sudo docker run --name web -d -p 80:80 --link db:db nginx

docker run 명령에서 연결 옵션은 --link <컨테이너 이름>:<별칭> 형식입니다.

컨테이너 목록을 출력합니다.

$ sudo docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED      STATUS        PORTS               NAMES
3971618834cd  nginx:latest  nginx                 About a min  Up About a m  0.0.0.0:80->80/tcp  web
8d4031106c57  mongo:2.6     /usr/src/mongo/docke  4 minutes a  Up 4 minutes  27017/tcp           db,web/db

db 컨테이너와 web 컨테이너가 연결되었습니다. web/db라고 표시되는데 web 컨테이너에서 db 컨테이너에 접속할 수 있다는 것입니다.

이제 web 컨테이너 안에서 db:27017 주소로 db 컨테이너의 MongoDB에 접속할 수 있습니다.

mongodb://db:27017/exampledb

컨테이너 안에서 다른 컨테이너에 접속할 때는 <별칭>:<포트 번호> 형식으로 사용합니다.

별칭과 IP 주소
다음과 같이 docker inspect 명령으로 web 컨테이너의 세부 정보에서 hosts 파일 경로를 구한 뒤 cat 명령으로 내용을 살펴봅니다(`는 탭키 위에 있는 문자입니다).

$ cat `sudo docker inspect -f "{{ .HostsPath }}" web`
172.17.0.13     aa1982fed33e
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.12     db

db--link db:db에서 설정한 별칭이고, 172.17.0.12db 컨테이너의 IP 주소입니다.

컨테이너를 연결하면 이렇게 hosts 파일에 IP 주소가 자동으로 설정되기 때문에 별칭을 통해 연결한 컨테이너에 접속할 수 있습니다.

추가 해설
도커 1.9.0 버전부터 네트워크를 생성할 수 있는 기능이 정식으로 추가되었습니다. 이때 네트워크를 생성하고 컨테이너를 연결시키면 해당 네트워크 안에 속한 컨테이너끼리는 서로 접속할 수 있습니다.

추후 --link 옵션은 사라질 예정입니다.
https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/

먼저 docker network create 명령으로 hello-network를 생성합니다.

$ sudo docker network create hello-network

DB 컨테이너를 생성하면서 hello-network에 연결합니다.

$ sudo docker run --name db -d --network hello-network mongo

web 컨테이너를 생성하면서 hello-network에 연결합니다.

$ sudo docker run --name web -d -p 80:80 --network hello-network nginx

web 컨테이너에서 Bash 셸을 실행한 뒤에 ping을 실행해봅니다.

$ sudo docker exec -it web bash
root@ed384f006421:/# ping db
PING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.023 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.058 ms

이렇게 같은 네트워크에 속한 컨테이너끼리는 컨테이너 이름으로 접속할 수 있습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014