컨테이너간 통신
1. --link 옵션 사용
- 해당 기능은 추후 docker 업데이트시 삭제 될 수 있음 / 사용자 정의 네트워크를 사용하자
- 사용자 정의 네트워크를 사용하는 컨테이너에서도 --link 옵션은 사용 가능
- 서로 통신해야하는 컨테이너가 많아지면 --link 옵션 정의가 복잡해진다.
- 컨테이너의 /etc/hosts에 --link에 사용한 컨테이너의 IP가 정의되어 있다.
# 컨테이너 생성
# 테스트용 리눅스(alpine) 3개 생성 / 백그라운드 상에서 계속 shell이 실행 된 상태를 유지
$ docker run -dit --name alpine1 alpine ash
$ docker run -dit --name alpine2 alpine ash
$ docker run -dit --name alpine3 alpine ash
# link 적용
# 테스트용ㅇ 리눅스 alpine4 생성 및 alpine1/alpine2 와 네트워크 연결
# --link <name or id>:alias 또는 --link <name or id>
$ docker run -dit --link alpine1:a1 --link alpine2 --name alpine4 alpine ash
# alpine4 접속
$ docker attach alpine4
# ping 테스트
$ ping a1 # 또는 ping alpine1
PING a1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.260 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.170 ms
$ ping alpine2
PING alpine2 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.249 ms
# alpine4에서 hosts 설정 파일을 보면 --link를 사용한 컨테이너가 추가된 것을 확인 할 수 있다.
$ cat /etc/hosts
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.2 a1 9cb90e3facf6 alpine1
172.17.0.3 alpine2 424aaf8ce579
172.17.0.5 565b40f058b3
2.사용자 정의 네트워크 사용
- automatic service discovery (자동 서비스 검색) 제공으로 대상 컨테이너의 IP가 아닌 이름으로 통신 할 수 있습니다.
# 사용자 정의 네트워크 생성
$ docker network create alpine-net
# alpine-net 네트워크를 사용하는 컨테이너 생성
$ docker run -dit --name alpine1 --network alpine-net alpine ash
$ docker run -dit --name alpine2 --network alpine-net alpine ash
# alpine1 컨테이너에 접속
$ docker container attach alpine1
# alpin2 에서 alpine2로 IP가 아닌 이름으로 ping 테스트 가능
$ ping -c 2 alpine2
- 네트워크가 서로 다를 경우 IP 대역이 다르기 때문에 아래와 같이 통신하고자 하는 대상 컨테이너가 속한 네트워크에 추가적으로 연결을 해야합니다.
# net1 / net2 네트워크 생성
$ docker network create net1
$ docker network create net2
# 컨테이너 생성
$ docker run -dit --name alpine1 --network net1 alpine ash
$ docker run -dit --name alpine2 --link alpine1:a1 --network net2 alpine ash
# alpine2 컨테이너에 net1 네트워크 추가 연결
$ docker network connect net1 alpine2
# ping 테스트
$ docker attach alpine2
$ ping -c 2 alpine1