Containerization/Docker

[Docker-Compose (1/2)] 도커 Compose 톺아보기

쉬지마 이굥진 2024. 5. 20. 13:58

이 글은 2024 05월 원티드 프리온보딩 BE 챌린지 '도커'편 수업을 회고하며 정리한 글입니다.



<이전 포스팅>

 

[Docker] 도커 이미지 만드는 법! (feat. Dockerfile)

이 글은 2024 05월 원티드 프리온보딩 BE 챌린지 '도커'편 2주차 수업을 회고하며 정리한 글입니다. 지난 번 포스팅들에서는 이미지들을 도커 허브와 같은 레지스트리에서 다운받아 실행시키는

developer-jinnie.tistory.com

이전 포스팅에서는 Dockerfile을 통해 나만의 도커 이미지를 만드는 법을 알아봤다. 이번 포스팅에선 Docker compose를 실습해보기 전에 Docker Compose란 뭔지, 왜 사용하는지에 대해서 알아보고 실습해보는 시간을 가져보자!

🐳 등장 배경

여태 도커파일과 도커 컨테이너와 같은 개념들을 배우고 이것들을 채우는 각종 명령어들에 대해서도 학습했다. 만약 컨테이너를 만들 때마다 복잡한 명령어들과 자주 사용하는 명령어를 개발자가 매번 입력해서 실행 시켜야 한다면? 같이 개발하는 동료가 Docker에 대해 아예 모른다면? 복잡한 명령어를 치기 위해 많은 시간을 Docker 공부에 쏟아야 할 것이다.

이는 곧 개발자의 리소스 낭비이고 동시에 비효율적인 개발이라고 생각한다. 하지만 위와 같은 명령어들을 하나의 파일로 만들어서 저장해 놓고, 콘솔에서 '저 파일을 실행해 줘!' 라는 단 한 줄의 명령어만 쳐서 컨테이너를 만들 수 있다면 얼마나 편할까!

여기서 위 명령어를 한 파일로 만든 것이 docker-compose.yml 파일이고, 실행하면 되는 명령어가 docker-compose up 이다.

 

🐳 Docker Compose 란?

 

위의 설명에 덧붙여, 실행해야 할 컨테이너가 하나가 아니라 수십개라면? 컨테이너를 실행하는 것은 여간 까다로운 일이 아니게 될 것이다. 따라서 이 특성들을 간단하게 아래와 같이 정의해 보았다.

  • 여러 개의 도커 컨테이너를 일괄적으로 정의하고 제어하는 도구
  • 설정 파일을 도커 CLI로 번역하는 역할

 

🐳 왜 쓸까요?

도커를 써야 하는 이유들에 대해 정리해봤다.

  • 복잡한 도커 명령어를 대체할 수 있어서 설정이 매우 편해짐
    • Docker Compose는 여러 컨테이너를 한 파일에 적어서 설정할 수 있음
    • 이 파일에는 컨테이너가 무슨 이미지를 쓸지, 어떤 포트를 사용할지, 환경 변수는 뭐가 필요한지 등을 적어둠
    • 이렇게 하면 여러 컨테이너를 한 번에 쉽게 설정할 수 있게 됨!
  • 컨테이너끼리 연결하기가 편함 (의존성 관리)
    • 컨테이너들이 서로 의존하는 관계가 있으면, Docker Compose가 이를 관리해 줌
    • 예를 들어, A 컨테이너가 B 컨테이너를 필요로 하면, A를 먼저 켜고 나서 B를 실행하는 식!
  • 자동으로 배포 가능
    • 설정 파일이 있으면, Docker Compose가 알아서 컨테이너들을 만들어 주고 실행해 줌
    • = 개발자가 일일이 명령어를 입력할 필요가 없음
  • 모니터링과 로깅
    • Docker Compose는 컨테이너들이 어떻게 돌아가는지 지켜보고, 로그도 모아줌
    • 이렇게 하면 문제가 생겼을 때 빨리 찾아서 고칠 수 있음
  • 확장성
    • 여러 컨테이너를 하나의 그룹으로 관리할 수 있음
    • 이게 좋은 이유는, 예를 들어 웹 앱을 만드는 여러 컨테이너를 한꺼번에 관리하고 확장하기 쉽기 때문임
  • 유연성
    • Docker Compose는 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지할 수 있음
  • 보안 강화
    • 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한하여 보안을 강화할 수 있음
  • 유지보수가 쉬워짐
    • 설정 파일 하나로 컨테이너들을 관리하기 때문에, 뭔가 바꿀 일이 있으면 파일만 수정하면 됨

ㅋㅋㅋㅋㅋ많기도 하다 !! 이렇듯 Docker Compose를 사용하면 여러 컨테이너를 더 쉽게 관리하고, 자동으로 설정하고, 확장하고, 보안을 강화할 수 있다. 개발자 입장에서는 이런 도구가 엄청나게 편리하니 외않써 ??? 이런 느낌

 

 

🐳 Docker Compose의 특장점

위와 같은 이유들을 종합해서 Docker Compose 장점을 정리해봤다.

  1. 한 번에 여러 컨테이너 설정 가능!
    • Docker Compose는 여러 컨테이너의 설정을 하나의 YAML 파일에 넣어서 관리함
    • 이 파일 하나로 여러 컨테이너의 모든 환경을 설정하고, 그걸로 여러 컨테이너를 한 번에 실행할 수 있음
  2. 빠른 서비스 실행
    • 설정 값들을 저장해 두고 다시 쓸 수 있음.
    • 만약 설정이 바뀌지 않았다면, Docker Compose는 이전에 저장해둔 정보를 다시 사용해서 서비스를 더 빨리 시작함
  3. 같은 네트워크에서 쉽게 연결
    • docker-compose.yml 파일에 있는 애플리케이션들은 모두 같은 네트워크에 자동으로 연결됨
    • 이렇게 해서 복잡한 네트워크 설정 없이도 여러 컨테이너가 서로 쉽게 통신할 수 있게 되는 것임

🐳 실행 순서

  1. 각 애플리케이션의 Dockerfile 작성하기
    • 보통 내가 만든 애플리케이션을 실행하기 위한 Dockerfile 만 작성
  2. docker-compose.yaml 파일 작성하기
    • 내가 만든 애플리케이션을 실행하기 위해 필요한 database라든지 redis라든지 다른 서비스들을 한꺼번에 정의하는 파일을 작성
  3. docker compose up 으로 실행하기 
++ 참고) YAML 파일이란?
YAML 파일은 컴퓨터가 읽을 수 있는 설정 파일이다.
사람이 읽기에도 쉬운 텍스트 형식으로 되어 있으며, 'YAML Ain't Markup Language'의 줄임말로 말 그대로 'YAML은 마크업 언어가 아니다'라는 뜻이다.

YAML 파일은 설정을 정리하고 관리하기에 아주 좋다. YAML 파일은 구조가 명확하고 간단해서 사람이 보기에도 이해하기 쉽기 때문! 들여쓰기를 사용해서 각 설정의 관계를 나타내는데 보통 들여쓰기가 잘못된 경우 yaml 파일을 의도와 다르게 해석하게 되니 들여쓰기에 주의해야 한다. 들여쓰기 검사 사이트에서 검사 가능!

 

🐳 Docker Compose 파일 구성

공식 문서를 참고했다. Docker Compose 파일은 주로 version, services, networks, volumes, configs, secrets 섹션으로 구성된다.

 

Overview

Find the latest recommended version of the Docker Compose file format for defining multi-container applications.

docs.docker.com

예시 Docker Compose 파일

 

  • version
    • compose 파일 형식을 지정한다.
    • 예를 들어, `version: "3.8"`은 Docker Compose 파일이 버전 3.8 형식을 따른다는 것을 의미한다.
  • services
    • 실행하려는 컨테이너들을 정의하는 역할
    • 이름, 이미지, 포트 매핑, 환경 변수, 볼륨 등을 포함
    • 해당 정보를 가지고 컨테이너를 생성하고 관리
      • image: 컨테이너를 생성할 때 쓰일 이미지 저장
      • build: 정의된 도커파일에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 설정
      • environment: 환경 변수 설정, docker run 명령어의 --env, -e 옵션과 동일
      • command: 컨테이너가 실행될 때 수행할 명령어, docker run 명령어의 마지막에 붙는 커맨드와 동일
      • depends_on: 컨테이너 간의 의존성 주입, 명시된 컨테이너가 먼저 생성되고 실행
      • ports: 개방할 포트 지정, docker run 명령어의 -p와 동일
      • expose: 링크로 연계된 컨테이너에게만 공개할 포트 설정
      • volumes: 컨테이너에 볼륨을 마운트함
      • restart: 컨테이너가 종료될 때 재시작 정책
        • no: 재시작 되지 않음 
        • always: 외부의 영향에 의해 종료 되었을 때 항상 재시작 (수동으로 끄기 전까지)
        • on-failure: 오류가 있을 시에 재시작
services:
  web:
    image: nginx
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
  • networks
    • 컨테이너 간의 네트워크를 정의한다.
    • 여러 서비스가 같은 네트워크를 사용하도록 설정하여 통신할 수 있도록 한다.
networks:
  my-network:
    driver: bridge
  • volumes
    • 컨테이너 간의 데이터 공유를 위해 사용된다.
    • 데이터 지속성을 위해 호스트와 컨테이너 간의 볼륨을 설정할 수 있다.
volumes:
  my-volume:
    driver: local
  • configs
    • 서비스에서 사용할 수 있는 설정 파일을 정의한다.
    • 주로 애플리케이션 설정 파일 등을 관리하는 데 사용된다.
configs:
  my-config:
    file: ./config.json

services:
  web:
    image: nginx
    configs:
      - source: my-config
        target: /etc/nginx/config.json
  • secrets
    • 민감한 정보를 관리하는 데 사용된다.
    • 데이터베이스 비밀번호, API 키 등의 보안 정보가 포함될 수 있다.
secrets:
  my-secret:
    file: ./secret.txt

services:
  web:
    image: nginx
    secrets:
      - my-secret

 🐳 자주 쓰는 Compose 명령어

중요한 명령어는 별표 표시 해두었다 :-) 

* docker-compose  VS  docker compose ?
docker-compose 명령어가 docker compose로 흡수되었다. 이전의 Docker에서는 docker-compose 명령어가 별도로 설치되어야했지만, Docker 1.13 이후로는 docker-compose 명령어가 Docker CLI에 통합되었다. 
docker-compose ps

- 현재 실행 중인 서비스 목록을 보여준다.

 

docker-compose pull [service]

- 필요한 이미지를 다운받는다.

 

docker-compose build [service]

- 필요한 이미지를 빌드한다.

 

docker-compose start [service]

- 서비스의 컨테이너를 구동한다.

 

docker-compose up [service] = (build) + create + start

- ⭐(build) + create + start를 포함한 명령어로, 서비스를 구동한다.  (즉 서비스와 네트워크가 없으면 만들고, 이미지가 없으면 빌드도 한다)

  • -d: 데몬 모드로 실행한다.
  • --build: 이미 빌드가 되었더라도 강제로 이미지를 다시 빌드한다.
  • --force-recreate: 컨테이너를 새로 생성한다.

지정된 서비스(컨테이너)만 제어가 가능하다. 예를 들어 web, redis 중 web만 기동하고 싶을 경우 docker-compose up -d web과 같이 실행하면 된다.

 

docker-compose logs [service]

- 컨테이너 로그를 확인한다.

  • -f: 컨테이너 로그를 실시간으로 확인한다. (follow)
docker-compose stop [service]

- 서비스를 멈춘다.

 

docker-compose kill [service]

- 서비스의 컨테이너들을 삭제한다.

 

docker-compose down [service]

- stop + kill을 포함한 명령어로, 서비스를 멈추고 컨테이너를 삭제한다.

  • -v: 도커 볼륨도 함께 삭제한다.
docker-compose run {service} {command}

- 해당 서비스에 컨테이너를 하나 더 실행한다.

  • -e: 환경변수를 설정한다.
  • -p: 연결할 포트를 설정한다.
  • --rm: 컨테이너 종료 시 자동으로 삭제한다.
docker-compose exec {container} {command}

- 해당 서비스의 컨테이너에서 명령어를 실행한다.

  • -e: 환경변수를 설정한다.

 

 

이렇게 이번 포스팅에서는 Docker Compose의 개념과 장점, 파일 구성 요소들과 주요 CLI 등에 대해서 학습해봤다. 이어지는 다음 포스팅에서는 Docker Compose yaml 파일을 통해 워드프레스를 실행해보는 실습을 진행해 볼 예정이다.

<다음 글>

 

 

[Docker-Compose (2/2)] 도커 Compose를 통해 워드프레스를 실행해보자

[Docker] 도커 Compose 톺아보기이 글은 2024 05월 원티드 프리온보딩 BE 챌린지 '도커'편 수업을 회고하며 정리한 글입니다. [Docker] 도커 이미지 만드는 법! (feat. Dockerfile)이 글은 2024 05월 원티드 프리

developer-jinnie.tistory.com

 


References

https://www.youtube.com/watch?v=EK6iYRCIjYs

https://www.inflearn.com/course/%EB%8F%84%EC%BB%A4-%EC%BB%B4%ED%8F%AC%EC%A6%88

https://docs.docker.com/compose/compose-file/