Docker Compose 설치 및 사용법 & 실전예제 1가지

Docker Compose 로고

Docker Compose란?

Docker Compose는 여러 개의 도커 컨테이너(Docker Container)로 구성된 애플리케이션을 정의하고 실행하기 위한 막강한 도구입니다. 단일 호스트(Host) 또는 여러 호스트(Host)에서 동작할 수 있으며, YAML 파일 형식으로 작성하여 컨테이너 구성을 관리합니다.
Docker Compose를 사용하면 여러 컨테이너 간의 의존성도 쉽게 정의할수 있으며, 한 번에 여러 컨테이너를 실행하거나 중지할 수 있습니다.

공식 Docs

Docker Compose의 주요 특징

편리한 애플리케이션 관리

복잡한 애플리케이션을 하나의 파일에 정의하여 손쉽게 관리할 수 있습니다. 컨테이너 간의 상호 작용을 명확하게 정의하고, 한 번에 모든 컨테이너를 시작하거나 중지하는 등의 작업이 간단해집니다.

확장 가능한 서비스 구성

서비스(Service)라는 개념을 통해 컨테이너를 정의합니다. 이를 통해 애플리케이션의 구성을 모듈화하고, 필요에 따라 서비스를 확장하여 사용할 수 있습니다.

YAML 파일 기반 설정

YAML 파일을 사용하여 애플리케이션의 구성을 기술합니다. YAML 파일 형식은 읽기 쉽고 작성하기도 편리하여 현재 현업에서 많이 사용하는 방식입니다. (저는 DevOps 가 부업이다 보니, 몇 년을 사용했는데도 인덴트 문제도 간혹 겪고 과연 편한것인가 싶은 생각은 든다.)

Docker Compose 설치

먼저 시스템에 도커가 설치되어 있어야 하고, Docker Compose는 도커 공식 홈페이지에서 제공하는 설치 방법을 통해 쉽게 설치할 수 있습니다.

설치 방법

각 운영체제에 맞는 설치 방법이 제공됩니다. 아래 링크에서 자세한 설치 파일및 방법을 확인할 수 있습니다:

링크

macOS, Linux에선 아래와 같이 설치를 진행하면된다.

# docker compose 다운로드
sudo curl -L "https://github.com/docker/compose/releases/download/2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 심볼릭 링크 설정
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 잘 되었는지 버전 확인
docker-compose -v

윈도우(Windows) 에선

Docker for windows 를 설치하면 자동으로 설치된다.


Docker Compose Yaml 파일 작성하기

Docker Compose 파일은 도커 컨테이너를 정의하고 실행하기 위한 설정 파일입니다. 이 파일은 YAML 형식으로 작성되며, 서비스, 네트워크, 볼륨 등의 설정을 포함합니다.

기본적인 YAML 파일의 구조

YAML 파일은 다음과 같이 기본적인 구조를 가집니다:

version: '3'

services:
  서비스명:
    image: 이미지명:태그
    ports:
      - "호스트 Port:컨테이너 Port"
    environment:
      - 환경변수1=값1
      - 환경변수2=값2
    volumes:
      - 볼륨명:컨테이너 경로
  • version: Docker Compose 파일의 버전을 지정합니다. 현재는 버전 3을 사용하는 것이 일반적입니다.
  • services: 서비스(컨테이너)를 정의하는 섹션입니다. 각 서비스는 고유한 서비스명으로 사용합니다.
  • image: 사용할 도커 이미지의 이름과 태그를 지정합니다.
  • ports: 호스트(host) 와 컨테이너(container)의 포트(port)를 매핑합니다. 외부에서 접근할 수 있도록 포트를 열어주는 용도로 사용합니다.
  • environment: 컨테이너 내에서 사용할 환경 변수들을 설정합니다.
  • volumes: 컨테이너와 호스트 간의 볼륨을 마운트하여 데이터를 영구적으로 저장하거나 공유합니다.

서비스(Service) 의존성 설정

여러 개의 서비스를 정의할 수 있으며, 서비스 간의 의존성을 설정하여, 하나의 서비스가 다른 서비스를 참조하여 사용할 수 있도록 할 수 있습니다.

version: '3'

services:
  서비스1:
    image: 이미지1:태그
    depends_on:
      - 서비스2

  서비스2:
    image: 이미지2:태그

위 YAML 처럼 서비스1서비스2에 의존성을 가지고 있습니다. 따라서, 서비스1이 실행되기 전에 서비스2가 먼저 실행됩니다.

여러 환경에서 사용하기

Docker Compose 파일은 여러 Phase에서 사용할 수 있습니다. 개발, 테스트, 운영 등 각각의 Phase에 맞는 YAML을 작성하여 사용하면 됩니다.

예를 들어, docker-compose.dev.yml, docker-compose.prod.yml 등의 파일을 생성하여 각각의 환경에 맞는 설정을 지정합니다. 그리고 -f 옵션을 사용하여 원하는 컴포즈 파일을 선택적으로 지정할 수 있습니다.

# 개발 환경에서 실행
docker-compose -f docker-compose.dev.yml up -d

# 운영 환경에서 실행
docker-compose -f docker-compose.prod.yml up -d

이렇게 하면 각각의 환경에 따라 다른 설정을 쉽게 적용할 수 있습니다.

위의 기본적인 작성 방법을 이용하여 여러 서비스를 정의하고, 원하는 환경에 맞게 설정하여 Docker Compose를 유연하게 활용할 수 있습니다.

YAML파일로 실행하기

앞서 작성한 YAML 파일을 사용하여 아래와 같이 명령어를 실행하면 됩니다.

docker-compose up

위 명령어를 실행하면, YAML의 정의한 서비스들이 동시에 시작됩니다. 만약 백그라운드에서 실행하고 싶다면, -d 옵션을 추가하여 실행하면 됩니다.

docker-compose up -d

애플리케이션을 중지하려면, 다음 명령어를 사용합니다.

docker-compose down

컨테이너 네트워크 설정하기

Docker Compose에서는 기본적으로 기본 네트워크를 사용하여 서비스들을 연결합니다. 하지만, 네트워크를 커스터마이징하여 세밀한 제어를 할 수도 있습니다.

네트워크 설정 예시

예를 들어, bridge 네트워크 대신 컨테이너를 devj_network라는 이름의 사용자 정의 네트워크에 연결하려면, 다음과 같이 컴포즈 파일을 수정합니다:

version: '3'

networks:
  devj_network:

services:
  app1:
    image: my_app1:latest
    networks:
      - devj_network

  app2:
    image: my_app2:latest
    networks:
      - devj_network

위 예시에서는 두 개의 서비스를 동일한 사용자 정의 네트워크에 연결하였습니다.

Volume 과 Volume Mount

컨테이너 간 데이터를 영구적으로 저장하기 위해 볼륨을 설정할 수 있습니다. 볼륨을 사용하면 컨테이너가 종료되어도 데이터를 보존할 수 있으며, 백업을 별도로 하지 않아도 사용할수 있기때문에, 볼륨 기능은 왠만하면 사용하는걸 추천한다.

볼륨 마운트 예시

사용하는 파일들을 별도의 볼륨에 저장하고 싶다면, 다음과 같이 YAML 파일에 설정을 수정한다.

version: '3'

services:
  devj_app:
    image: web_app:latest
    volumes:
      - devj_data:/devj/data

volumes:
  devj_data:

devj_app 컨테이너의 /devj/data 디렉토리를 host의 devj_data 라는 이름을 가진 볼륨에 마운트 한다.

환경 변수 설정하기

환경 변수를 사용하면 컨테이너의 설정을 유연하게 변경할 수 있습니다.

환경 변수 설정 예시

예를 들어, 웹 애플리케이션의 포트를 환경 변수로 설정하여 유연하게 변경할 수 있습니다. 다음은 YAML 파일의 예시입니다:

version: '3'

services:
  devj_app:
    image: devj_app:latest
    environment:
      - PORT=8080
    ports:
      - "${PORT}:80"

위 예시에서는 devj_app 컨테이너의 포트를 PORT 환경 변수 ports로 설정하고, 호스트의 ${PORT}와 연결하였습니다. 이렇게 설정하면, 필요에 따라 포트를 유연하게 변경할 수 있습니다.

여러 환경(Phase)에서 사용하기

Dokcer Compose는 개발, 테스트, 운영 등 여러 환경등에 맞게 사용할 수 있습니다. 각 환경에 맞는 YAML 파일만 작성하면, 아주 쉽게 관리할 수 있습니다.

여러 환경(Phase)에서 사용 예시

예를 들어, 개발 Phase과 운영 Phase을 구분하여 YAML 파일을 작성할 수 있습니다. 개발 환경에서는 디버깅을 위해 추가 설정을 포함하고, 운영 환경에서는 보안을 강화하기 위해 필요한 것들을 추가할수 있다.

# 개발 dev 환경용

version: '3'

services:
  devj_app:
    image: devj_app:latest
    environment:
      - DEBUG_MODE=true
    ports:
      - "8080:80"
# Product 환경용

version: '3'

services:
  devj_app:
    image: devj_app:latest
    environment:
      - DEBUG_MODE=false
    ports:
      - "80:80"
    networks:
      - public_network

networks:
  public_network:
    external: true

개발 환경용과 운영 환경용 YAML 파일을 나누어 작성하였습니다. 개발 환경에서는 디버깅을 위해 DEBUG_MODE 환경 변수를 설정하고, 포트 8080으로 웹 애플리케이션을 연결합니다. 반면에 운영 환경에서는 디버깅을 비활성화하기 위해 DEBUG_MODE 환경 변수를 false로 설정하고, 포트 80으로 웹 애플리케이션을 연결합니다. 또한, 운영 환경(Phase) 에서는 public_network라는 이름의 외부 네트워크를 사용하여 별도의 네트워크 설정을 적용하였습니다.

실전: 워드프레스(WordPress)와 MySQL 를 하나로 실행하기

워드프레스 대표 이미지

현재 Synology 버전으로, 시리즈별로 설치 및 네트워크 설치까지 자세히 작성중에 있습니다.

해당 시리즈 1편 링크 를 보시면 도움이 될 것입니다.

워드프레스(WordPress)와 MySQL Compose 파일 작성

아래는 워드프레스와 MySQL 애플리케이션을 실행하기 위한 YAML 파일 예시입니다:

version: '3'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword
      WORDPRESS_DB_NAME: wpdatabase
    volumes:
      - wordpress_data:/var/www/html

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword
      MYSQL_DATABASE: wpdatabase
    volumes:
      - db_data:/var/lib/mysql

volumes:
  wordpress_data:
  db_data:

위 yaml 파일은 워드프레스와 MySQL 컨테이너를 정의하고, 서로 간의 의존성을 설정합니다. 워드프레스 컨테이너는 호스트의 8080 포트와 연결되며, MySQL 컨테이너는 데이터베이스 정보를 설정합니다. 또한, 각 컨테이너는 볼륨을 사용하여 데이터를 영구적으로 저장합니다.

워드프레스 애플리케이션 실행

위에서 작성한 YAML 파일을 사용하여 워드프레스 애플리케이션을 구동해보겠습니다.

  1. YAML 파일이 있는 디렉토리로 이동합니다.
  2. 아래처럼 컴포즈를 실행합니다.
docker-compose up -d

위 명령어로 도커 컴포즈를 실행하면, 워드프레스와 MySQL 컨테이너가 시작됩니다. 웹 브라우저에서 http://localhost:8080으로 접속하여 워드프레스로 연결되는 것을 볼 수 있습니다.

워드프레스 애플리케이션 종료

애플리케이션을 더 이상 사용하지 않을 때에는 아래와 같은 방법으로 컨테이너를 중지합니다.

  1. YAML 파일이 있는 디렉토리로 이동합니다.
  2. 다음 명령어를 실행하여 컴포즈를 종료합니다.
docker-compose down

위 명령어를 실행하면, 워드프레스와 MySQL 컨테이너가 중지되고, 사용하고 있던 리소스가 해제됩니다.

기본 Tips

컨테이너의 자동 재시작 설정

컨테이너가 비정상적으로 종료되었을 때 자동으로 재시작합니다. 애플리케이션의 높은 가용성을 유지할 수 있으며 안정성 확보에도 용이합니다. 특히 메모리 누수로 죽는 경우, 빠르게 복구가 됩니다.

version: '3'

services:
  devj_app:
    image: devj_app:latest
    restart: always
    ports:
      - "8080:80"

위 예시에서 restart: always 설정으로 컨테이너를 항상 자동 재시작하도록 설정하였습니다.

외부 환경 변수 파일 사용

애플리케이션의 설정 값이 많을 경우, YAML 파일에 직접 환경 변수를 입력하는 것은 번거로울 수 있습니다. 이럴 때는 외부 환경 변수(.env) 파일을 사용하여 간편하게 설정할 수 있습니다.

version: '3'

services:
  devj_app:
    image: devj_app:latest
    env_file:
      - .env
    ports:
      - "8080:80"

위 예시에서 env_file 설정으로 .env 파일을 사용하여 환경 변수를 정의하였습니다.

보안 및 주의사항

민감한 정보 보호

YAML에 민감한 정보(예: 비밀번호, API 키 등)를 포함하여 작성하지 마십시오. YAML 파일은 보통 Git같은 버전관리시스템에 올라갈 수 있기때문에, 민감한 정보가 노출될 수 있습니다. 그렇기 때문에, 환경 변수나 별도의 비밀 관리 도구를 사용하여 민감한 정보를 관리하는 것을 추천드립니다. 저도 잘못 세팅 하여 계정과 비밀번호가 노출될 뻔 했었다. 해당글의 프로젝트 생성 부분을 참조

컨테이너 이미지 검증

사용하는 컨테이너 이미지가 신뢰할 수 있는 곳에서 가져온 것인지 확인이 필요합니다. 당연한 말이지만 공식 이미지 또는 검증된 이미지를 사용하는 것이 좋습니다. 또한, 최신 보안 패치가 적용된 이미지를 사용하여 애플리케이션을 보호하세요.

결론

Docker Compose의 기본 개념부터 설치, 사용법, 그리고 실전 예제(WordPress의 설치)까지 완료하였습니다. Docker Compose를 사용하면 여러개의 컨테이너를 효율적으로 관리하고 배포할 수 있으며, 컨테이너 기반 환경에서 애플리케이션을 운영하는데 유용합니다. 기업용 애플리케이션은 당연히 k8s 로 운영을 많이 하지만, 개인 환경에선 Docker Compose정도만 써도 편하게 쓸 수 있다.

연관 포스팅

Leave a Comment