42서울/Inception

docker compose를 사용한 네트워크 [42 inception 과제 개념 8]

뜨거운 개발자 2023. 6. 24. 17:58

docker compose를 사용한 네트워크

Networking in Compose
How Compose sets up networking between containers
https://docs.docker.com/compose/networking/

Docker Compose에서는 network_mode를 이용하여 네트워크를 정할 수 있습니다. 그리고 특히 여러 네트워크를 생성하여 서비스에 여러 네트워크를 적용하는 것도 가능하다는 장점이 있습니다.

default 네트워크

Docker Compose에서 네트워크를 정의하는 것도 가능하지만, Docker Compose와 별개로 Docker Engine으로 생성한 네트워크를 이용하는 것도 가능합니다.

👨🏻‍💻
아무런 설정을 해주지 않으면 docker composedefault 네트워크를 설정합니다. 기본적으로 Docker Compose는 하나의 default 네트워크에 모든 컨테이너를 연결합니다.

디폴트 네트워크의 이름은 docker-compose.yml가 위치한 디렉토리 이름 뒤에 _default가 붙습니다. 예를 들어, 디렉토리 이름이 my_app라면 디폴트 네트워크 이름은 my_app_default가 됩니다.

docker-compose up 을 통해 보는 default 네트워크

default_network의 이름은 docker-compose up -d 하면 처음으로 나오는 메세지를 보시면

Creating network "my_app_default" with the default driver 라고 나오는 것을 볼 수 있습니다.

명령을 통해서 보면, Docker Compose는 먼저 네트워크를 생성합니다.

그리고 컨테이너를 빌드한 후 네트워크에 연결되는 순서로 작동하는 것을 볼 수 있습니다.

이렇게 도커 컴포즈를 사용해서 생긴 default 네트워크를 확인해 볼 수 있습니다.

docker-compose down 을 통해 보는 default 네트워크

반대로 docker-compose down 을 하게 되면, 컨테이너를 종료/제거한 후 제일 마지막에 네트워크를 제거합니다.

즉, Docker Compose 를 통해정의한 네트워크는Docker Compose Up과 함께 생성되었다가 Docker Compose Down과 함께 삭제됩니다.

컨테이너 간 통신

👨🏻‍💻
컨테이넌 간 통신에서 주의할 점은 접속하는 위치가 디폴트 네트워크 내부냐 외부인지에 따라서 포트(port)가 달라질 수 있다는 것입니다.

예를 들어, docker-compose.yml에 web 서비스의 ports 설정이 아래와 같다면,

services:
  web:
    build: .
    ports:
      - "8001:8000"

호스트 컴퓨터에서 접속할 때는 8001 포트를 사용해야 하고, 같은 디폴트 네트워크 내의 다른 컨테이너에서 접속할 때는 포트 8000을 사용해야 합니다.

즉 ,컨테이너간 통신에서는 컨테이너 포트를 사용해야하고, 로컬 호스트에 포트포워딩 된 포트를 사용해야 합니다.

따라서 다음과 같이 접속을 해야합니다.

  • 호스트 컴퓨터에서 web 서비스 컨테이너 접속 : curl -I localhost:8001
  • 같은 네트워크 내의 다른 컨테이너에서 web 서비스 컨테이너 접속 : docker-compose exec alpine curl -I web:8000

네트워크 추가

👨🏻‍💻
Docker Compose는 따로 생성하지 않는 디폴트 네트워크 뿐만 아니라 다른 네트워크도 필요에 따라 추가해줄 수 있습니다.

docker-compose.yml의 networks 항목 아래에 네트워크를 설정합니다. 아래 설정파일을 보면 db 서비스는 디폴트 네트워크에만 연결되지만, web 서비스는 디폴트 네트워크 뿐만 아니라 our_net 네트워크에도 연결되게 됩니다.

services:
  web:
    build: .
    ports:
      - "8000:8000"
    networks:
      - default
      - our_net

  db:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

networks:
  our_net:
    driver: bridge

외부 네트워크 사용

👨🏻‍💻
외부 네트워크는 docker compose down을 해도 네트워크가 사라지지 않는 특성이 있습니다. Docker Compose가 제공하는 디폴트 네트워크 대신에 외부에서 미리 생성해놓은 다른 네트워크를 사용할 수도 있습니다.\

예를 들어서 이미 docker network create our_net 으로 our_net이라는 네트워크가 있다면, 아래 설정을 다음과 같이 할 수 있습니다.

networks:
  default:
    external:
      name: our_net

이렇게 설정을 해주면, 이 네트워크는 도커 컴포즈를 통해서 정의된 네트워크가 아니기 때문에 docker compose down을 해도 네트워크가 사라지지 않습니다.


Uploaded by N2T

728x90