도커 컴포즈(Docker Compose)

dong5854·2022년 3월 26일
0

docker

목록 보기
8/8
post-thumbnail
post-custom-banner

도커를 위한 많은 명령어들은 CLI를 통해 실행 시킬 수 있다. 하지만 넣어주어야 하는 옵션이 많아질수록 오타를 내기도 쉽고 한눈에 보기 어려우며 명령어들을 까먹어서 구글링이나 docker --help명령어를 통해 찾아봐야하는 일이 왕왕 발생한다.
도커 컨테이너에 환경변수를 넣어주고, 볼륨을 연결하고 이를 detach mode를 실행시켜주면서 컨테이너명을 설정해주고 네트워크까지 추가시켜 주어야한다고 생각해보자. 심지어 이런 컨테이너를 한가지만 실행하는 것이 아니고 여러 컨테이너를 실행시키고 이를 같은 네트워크에 넣어서 연결해주어야 하는데 이걸 CLI 명령어로 전부 실행시키자고 하니 속이 뒤집어진다.
이런 문제점을 해결하기 위한 툴이 Docker-Compose이다.


도커 컴포즈(Docker-Compose)란 무엇인가?

도커 컴포즈의 장점

도커 컴포즈는 여러 개의 docker builddocker run 명령어들을 하나의 Configuration 파일에 넣고 간단한 명령어들로 이를 제어할 수 있게 해준다.
도커 컴포즈를 사용하면 여러개의 컨테이너를 한번에 제어할 수 있고 같은 도커 컴포즈 파일에 정의된 컨테이너들은 자동으로 같은 네트워크에 넣어준다는 장점도 있다. 또한 도커 컴포즈 파일은 git과 같은 형상관리도구로 형상관리가 가능하고, 다른 팀원들과 작업할 때 이를 쉽게 공유할 수 있다는 장점도 있다.

도커 컴포즈의 한계

도커 컴포즈는 Dockerfile을 대체할 수 없다. 커스텀 이미지를 만들어 빌드하기 위해서는 도커 컴포즈를 사용한다고 해도 Dockerfile은 필요하다.
도커 컴포즈는 여러 호스트 머신에 흩어져있는 컨테이너들을 제어하는데는 적합하지 않다. 이런 관리를 위해서는 쿠버네티스와 같은 컨테이너 오케스트레이션 툴이 필요하다.

도커 컴포즈 작성하기

도커 컴포즈를 작성하기 위해서 가장 중요한 요소는 Services이다. 도커 컴포즈에서의 Services는 도커 컨테이너라고 생각하면 편하다. 도커 컴포즈의 Services의 하위에 환경변수, 볼륨, 네트워크, 포트 포워딩과 같은 부분을 작성할 수 있다. 이렇게 도커 컴포즈 파일을 작성함으로써 우리가 CLI 명령어를 통해 실행할 때 넣어주어야 했던 옵션을 대체할 수 있다.
아래는 도커 컴포즈 파일의 예시이다. 아래 예시는 내가 필요에 따라 만든 파일이기 때문에 좀 더 모범적인 예시는 공식 문서를 통해 확인하는 것이 좋다.

version: '3.8'

services:
  nginx1:
    image: 'nginx:stable'
    ports:
      - '127.0.0.1:8000:80'
    volumes:
      - ./nginx1/conf.d:/etc/nginx/conf.d:ro
      - ./nginx1/nginx.conf:/etc/nginx/nginx.conf:ro
  nginx2:
    image: 'nginx:stable'
    ports:
      - '127.0.0.1:8001:80'
    volumes:
      - ./nginx2/conf.d:/etc/nginx/conf.d:ro
      - ./nginx2/nginx.conf:/etc/nginx/nginx.conf:ro
  test1:
    build:
      context: ./node
      dockerfile: dockerfile
    env_file:
      - ./env/node1.env
    volumes:
      - ./node/server.js:/app/server.js
    extra_hosts:
      - "host.docker.internal:host-gateway"
    cpus: ".25" # CPU 프로세스 사용률 25%로 제한
    mem_limit: "2g" # 2GB로 메모리 제한
  test2:
    build:
      context: ./node
      dockerfile: dockerfile
    env_file:
      - ./env/node2.env
    volumes:
      - ./node/server.js:/app/server.js
   extra_hosts:
   	  - "host.docker.internal:host-gateway"
    cpus: ".25" # CPU 프로세스 사용률 25%로 제한
    mem_limit: "2g" # 2GB로 메모리 제한
  test3:
    build:
      context: ./node
      dockerfile: dockerfile
    env_file:
      - ./env/node3.env
    volumes:
      - ./node/server.js:/app/server.js
    extra_hosts:
      - "host.docker.internal:host-gateway"
    cpus: ".25" # CPU 프로세스 사용률 25%로 제한
    mem_limit: "2g" # 2GB로 메모리 제한
  test4:
    build:
      context: ./node
      dockerfile: dockerfile
    env_file:
      - ./env/node4.env
    volumes:
      - ./node/server.js:/app/server.js
    extra_hosts:
      - "host.docker.internal:host-gateway"
    cpus: ".25" # CPU 프로세스 사용률 25%로 제한
    mem_limit: "2g" # 2GB로 메모리 제한

도커 컴포즈 파일은 docker-compose.yaml 혹은 docker-compose.yml이라는 이름으로 작성되어야 한다. yaml 파일은 들여쓰기를 통해 설정 파일의 계층을 파악하기 때문에 들여쓰기에 유의하며 작성해야한다.

도커 컴포즈 파일을 작성했다면 docker-compose up을 통해 도커 컴포즈 파일에 있는 컨테이너들을 생성하여 실행할 수 있고, docker-compse down을 사용하면 생성한 컨테이너를 중지하고 삭제할 수 있다.

도커 컴포즈 파일 작성 시 유의 점

도커 컴포즈는 따로 설치해 주어야 한다

  • 도커 컴포즈는 도커와 별개로 설치를 해주어야한다. 내 경험상 무언가를 설치할 때는 공식문서를 보는게 최고기 때문에 공식 문서의 설치 방법 링크를 남기고 따로 기록하지 않겠다.

docker compose version

  • 도커 컴포즈 파일 가장 위의 version은 도커 컴포즈 스펙에 대한 버전으로 이 버전에 따라 사용할 수 있는 기능들이 다를 수 있고, 같은 기능이라도 정의하는 방법, 즉 문법에 차이가 있을 수 있기 때문에 공식 문서를 참고해가며 사용하는 버전에 맞는 형식으로 작성을 해야 한다. 현재 사용가능한 버전과 각 버전에 따른 가이드라인은 가이드라인 문서에서 확인 가능하고 사용가능한 기능들도 확인할 수 있다.

docker-compose up, down

  • docker-compose up은 디폴트가 attach mode이기 때문에 detach mode로 실행하기 위해서는 -d 옵션을 주어야 한다.

  • docker-compose down은 컨테이너를 멈추고(stop) 삭제(rm)까지 한다는 것을 유의해야 한다. 만약 도커 컴포즈로 컨테이너를 내리고도 데이터가 유지되어야 한다면 볼륨을 사용하자.

  • 도커 컴포즈를 실행하면 해당 컴포즈 파일의 컨테이너들을 위한 네트워크를 생성하고 그 컴포즈 파일 안의 컨테이너들을 자동으로 같은 컨테이너로 넣는다. 도커 컴포즈 파일에 설정을 넣어주어 다른 커스텀 네트워크로 컨테이너가 들어가도록 설정해 주는 방법이 있다. 또한 이렇게 자동 생성된 네트워크는 docker-compse down을 통해 컨테이너들이 내려갈 때 같이 제거된다.

network, volume

  • 도커 컴포즈에 커스텀 네트워크를 추가하려면 컴포즈 파일에 커스텀 네트워크를 추가해주어야 한다. 도커 컴포즈의 네트워크에 관한 좋은 글이 있어 링크를 걸어둔다.

  • 도커 컴포즈의 named volume의 경우 아래에 따로 정의를 해주어야 한다. 자세한 내용은 다음 문서를 참고하자.

version: '3.7'

services:

  fpm:
    build:
      context: .
    extra_hosts:
      - "host.docker.internal:host-gateway"

리눅스의 경우에는 host.docker.internal을 다음과 같이 extra_hosts에 추가해 주어야 사용 가능하다.
출처: stackoverflow, What is linux equivalent of "host.docker.internal"

미세먼지 팁

작은 팁으로는 vscode를 사용할 시 docker 익스텐션을 사용한다면 도커 컴포즈 파일의 작성에 있어서 도움을 받을 수 있다.

profile
https://github.com/dong5854?tab=repositories
post-custom-banner

0개의 댓글