본문 바로가기
DevOps/Docker

컨테이너들 간의 연결 - links, network, depends_on

by 데브겸 2023. 2. 9.

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/