Docker-Compose로 여러 대의 컨테이너를 띄우고 관리하다보면 자연스럽게 컨테이너들 간 연결이나 통신에 대해서 궁금해지는 것 같다. 그런데 워낙 개념들이 많고 혼잡하게 얽혀있다보니, 한 번 정리해두는게 여러모로 좋을 것 같아 포스팅한다.
1. Docker links
결론부터 말하자면 docker links 옵션은 legacy 옵션으로 사용하지 않는 것이 권장되고 있다. (공식 도큐먼트 - Docker / Compose)
The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link.
Docker network feature가 나오면서 links는 레거시 옵션으로 된 듯하다.
그럼 Compose의 outer_links는?? (솔직히 요 부분 정확성은 모르겠음. 도큐먼트 원문 보고 직접 해석해보길 권장...) outer_links는 compose의 외부의 서비스와 연결할 때 사용한다 (Link to containers started outside this docker-compose.yml or even outside of Compose, especially for containers that provide shared or common services) 사용할 수는 있을 것 같긴한데 1) outer_links를 연결하기 위해서는 최소 하나의 네트워크에 연결되어 있어야 한다는 점 (The externally-created containers must be connected to at least one of the same networks as the service that is linking to them) 2) swarm mode에서 docker stack deploy할 때는 external_links가 무시된다는 점 (The external_links option is ignored when deploying a stack in swarm mode) 를 볼 때 host network나 overlay network를 사용하는게 좋을 것 같다 |
2-1. Docker Network
도커 컨테이너는 서로 독립적으로, 격리되어 작동하기 때문에 기본적으로는 서로 통신이 불가능함. 컨테이너들끼리 통신을 하게 만들고 싶다면 Docker network feature를 이용하면 됨. Docker network를 생성하고, 거기에 컨테이너를 연결시키면 되는 것.
docker network ls로 현재 생성되어 있는 네트워크를 확인할 수 있다
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
ad7b467f1373 bridge bridge local
2b8318e08648 host host local
01da117095cc none null local
예시에 나온 bridge, host, none은 모두 docker daemon이 실행되면서 디폴트로 생성되는 네트워크.
컨테이너를 생성할 때 지원되는 네트워크 드라이버들은 아래와 같음 (공식 도큐먼트 link)
1) bridge : 동일한 호스트 내에서 컨테이너들끼리 통신하도록 지원하는 네트워크
2) host : 호스트와 컨테이너 간 격리를 제거하고 직접 호스트의 네트워크를 사용
3) none: 모든 네트워킹을 하지 못하도록 함
4) overlay : 여러 도커 데몬들을 연결하여 통신하도록 하는 네트워크
5) ipvlan: IPv4와 IPv6 addressing에 대한 제어를 가능하게 함
6) macvlan: 컨테이너에 MAC 주소를 할당하여 물리 디바이스로서 나타날 수 있도록 함
2-2. Docker Compose와 Network
Docker Compose를 사용하여 띄운 컨테이너들끼리는 자동으로 하나의 디폴트 네트워크에 연결되어 통신이 가능함. 디폴트 네트워크의 이름은 docker compose를 실행하기 위한 'YAML 파일이 위치한 디렉토리 이름_default'로 설정됨.
- 각 서비스들에 어떤 네트워크를 사용할지 적어주고,YAML 파일 하단에 networks라고 적어주고 관련된 내용들을 작성하여 docker-compose 진행하면 된다
services:
web:
image: nginx
ports:
- 80:8080
networks:
- my_network
networks:
my_network:
driver: bridge
- 물론 YAML 파일 작성할 때 neworks 아래 미리 생성한 다른 네트워크(커스텀 네트워크 등)을 적어 다르게 설정하는 것도 가능
단, 네트워크 외부 주체가 컨테이너에 접속할 때와 네트워크 내부 주체가 컨테이너에 접속할 때에 따라 사용하는 port가 달라질 수 있다는 것을 주의하면서 사용. (접속과 관련되어 있는 것임!)
services:
web:
image: nginx
ports:
- 80:8080
networks:
- my_network
yaml 파일에서 nginx 서비스의 포트 설정이 위와 같고, my_network를 사용한다고 했을 때
- my_network 외부에서 접속한다면 80번 포트를 사용하고
- my_network 내부 컨테이너에서 접속할 때는 8080번 포트를 사용
3. depends_on
depends_on은 위에 link나 network와는 확실히 결이 다르다. links나 network는 컨테이너들 간의 통신과 관련되어 있다면, depends_on은 docker compose에서 컨테이너를 띄우는 실행 순서와 관련이 있기 때문.
services:
db:
image: postgres
environment:
- POSTGRES_USER=postgres_user
- POSTGRES_PASSWORD=postgres_pwd
ports:
- 5432:5432
networks:
- my_network
web:
image: nginx
ports:
- 80:8080
depends_on:
- db
networks:
- my_network
networks:
my_network:
driver: bridge
참고하면 좋을 포스팅들
docker contatiner port & host port
- https://blog.naver.com/alice_k106/220278762795
docker network
- https://bluese05.tistory.com/38
- https://joont92.github.io/docker/network-%EA%B5%AC%EC%A1%B0/
- https://julie-tech.tistory.com/50
- https://www.daleseo.com/docker-networks/
docker compose network
- https://www.daleseo.com/docker-compose-networks/