본문 바로가기

Dev

MacOS(Apple Silicon)에서 Docker Compose 최신버전으로 설치 및 사용 방법


Docker Compose란 무엇인가?

Docker Compose는 여러 개의 컨테이너로부터 이루어진 서비스를 구축하고 실행하는 툴입니다. Kubernetes처럼 YAML 파일로 여러 개의 컨테이너 내부 속성을 설정하고 한 번에 실행시킬 수 있습니다. 예를 들어, 웹 애플리케이션을 개발할 때 웹 서버, 데이터베이스, 캐시 등의 다양한 컨테이너를 필요로 할 수 있는데, Docker Compose를 사용하면 이러한 컨테이너들을 쉽게 관리하고 연동할 수 있습니다.

MacOS(Apple Silicon)에서 Docker Desktop 설치하기

MacOS(Apple Silicon)에서 Docker Compose를 사용하기 위해서는 먼저 Docker Desktop을 설치해야 합니다. Docker Desktop은 Mac과 Windows에서 도커 엔진과 함께 제공되는 애플리케이션으로, 도커 컨테이너와 이미지를 관리하고 설정할 수 있는 GUI 인터페이스와 CLI 명령어를 제공합니다.

Docker Desktop을 설치하는 방법은 다음과 같습니다.

  1. Docker 공식 홈페이지에 접속하여 자신의 OS 버전에 맞게 다운로드합니다.
  2. 다운로드한 파일을 실행하여 설치 과정을 따릅니다.
  3. 설치가 완료되면 Mac의 경우 우측 상단에 도커 아이콘이 표시되고 Windows의 경우 우측 하단 트레이에 도커 아이콘이 표시됩니다.
  4. 도커 아이콘을 클릭하여 Preferences 메뉴를 선택합니다.
  5. Experimental Features 탭에서 Use Docker Compose V2 체크박스를 선택합니다. 이렇게 하면 최신 버전의 Docker Compose가 활성화됩니다.

Docker Compose 최신버전 다운로드 및 업그레이드하기

Docker Desktop을 설치하면 기본적으로 Docker Compose도 함께 설치됩니다. 하지만 만약 최신 버전의 Docker Compose가 필요하거나 업그레이드하고 싶다면 다음과 같은 방법으로 할 수 있습니다.

  1. Docker Compose 공식 홈페이지에 접속하여 최신 버전의 바이너리 파일 링크를 복사합니다.
  2. 터미널에서 다음 명령어를 입력하여 바이너리 파일을 다운로드합니다.
sudo curl -L "복사한 링크" -o /usr/local/bin/docker-compose
  1. 터미널에서 다음 명령어를 입력하여 바이너리 파일에 실행 권한을 부여합니다.
sudo chmod +x /usr/local/bin/docker-compose
  1. 터미널에서 다음 명령어를 입력하여 현재 버전을 확인합니다.
docker-compose --version

Docker Compose로 컨테이너 관리하기

Docker Compose는 YAML 파일로 여러 개의 컨테이너 설정을 정의할 수 있습니다. YAML 파일은 보통 YAML 파일은 보통 docker-compose.yml이라는 이름으로 저장하고, 도커 컴포즈 명령어를 통해 실행할 수 있습니다. YAML 파일의 기본 구조는 다음과 같습니다.

version: "3.9" # 도커 컴포즈 버전
services: # 서비스 정의
  service1: # 서비스 이름
    image: image1 # 사용할 이미지 이름
    ports: # 포트 매핑
      - "5000:5000"
    volumes: # 볼륨 마운트
      - .:/code
    environment: # 환경 변수 설정
      - DEBUG=1
  service2:
    image: image2
    depends_on: # 의존성 설정
      - service1

이렇게 작성한 YAML 파일을 터미널에서 다음 명령어로 실행할 수 있습니다.

docker-compose up # 모든 서비스 실행하기

docker-compose up -d # 백그라운드에서 모든 서비스 실행하기

docker-compose up service1 service2 # 특정 서비스만 실행하기

docker-compose down # 모든 서비스 중지하고 제거하기

docker-compose stop # 모든 서비스 중지하기

docker-compose start # 모든 서비스 시작하기

docker-compose restart # 모든 서비스 재시작하기

docker-compose ps # 현재 실행중인 서비스 상태 확인하기

docker-compose logs # 로그 확인하기

Docker Compose로 멀티 컨테이너 애플리케이션 구성하기

Docker Compose를 사용하면 여러 개의 컨테이너로 이루어진 복잡한 애플리케이션을 쉽게 구성하고 관리할 수 있습니다. 예를 들어, 웹 애플리케이션을 개발할 때 웹 서버, 데이터베이스, 캐시 등의 다양한 컨테이너를 필요로 할 수 있는데, Docker Compose를 사용하면 이러한 컨테이너들을 하나의 YAML 파일로 정의하고 연동할 수 있습니다.

다음은 Flask 웹 프레임워크와 Redis 데이터베이스를 사용하는 간단한 웹 애플리케이션을 Docker Compose로 구성하는 예시입니다.

먼저, Flask 애플리케이션 코드를 작성합니다. app.py라는 파일에 다음과 같은 코드를 작성합니다.

from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host="redis", port=6379)

@app.route("/")
def hello():
    count = redis.incr("hits")
    return f"Hello World! I have been seen {count} times."

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

다음으로, Flask 애플리케이션을 위한 도커 이미지를 빌드하는 Dockerfile을 작성합니다. Dockerfile에 다음과 같은 코드를 작성합니다.

FROM python:3.9-alpine
WORKDIR /code
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]

requirements.txt 파일에는 Flask와 Redis 패키지가 필요합니다.

flask==2.0.2 
redis==4.0.2 

마지막으로, docker-compose.yml 파일을 작성하여 Flask와 Redis 컨테이너를 정의하고 연결합니다. docker-compose.yml에 다음과 같은 코드를 작성합니다.

version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

이제 터미널에서 다음 명령어로 애플리케이션을 실행할 수 있습니다.

docker-compose up

웹 브라우저에서 http://localhost:5000에 접속하면 Flask 애플리케이션이 실행되고 Redis 데이터베이스와 통신하는 것을 확인할 수 있습니다.

Docker Compose YAML 파일 작성법

Docker Compose YAML 파일은 여러 개의 컨테이너를 정의하고 설정하는 방법입니다. YAML 파일은 보통 docker-compose.yml이라는 이름으로 저장하고, 도커 컴포즈 명령어를 통해 실행할 수 있습니다. YAML 파일의 기본 구조는 다음과 같습니다.

version: "3.9" # 도커 컴포즈 버전
services: # 서비스 정의
  service1: # 서비스 이름
    image: image1 # 사용할 이미지 이름
    ports: # 포트 매핑
      - "5000:5000"
    volumes: # 볼륨 마운트
      - .:/code
    environment: # 환경 변수 설정
      - DEBUG=1
  service2:
    image: image2
    depends_on: # 의존성 설정
      - service1

YAML 파일에서 사용할 수 있는 주요 옵션들은 다음과 같습니다.

  • image: 사용할 도커 이미지의 이름을 지정합니다. 이미지가 로컬에 없으면 도커 허브에서 자동으로 다운로드합니다.
  • build: 도커 이미지를 빌드하기 위한 경로나 설정을 지정합니다. Dockerfile이 있는 디렉토리나 URL을 입력하거나 context, dockerfile 등의 옵션을 사용할 수 있습니다.
  • command: 컨테이너가 시작될 때 실행할 명령어를 지정합니다. Dockerfile의 CMD와 비슷하지만 오버라이드됩니다.
  • ports: 호스트와 컨테이너 간에 포트를 매핑합니다. 호스트 포트와 컨테이너 포트를 콜론(:)으로 구분하여 입력하거나 프로토콜(tcp/udp)도 함께 입력할 수 있습니다.
  • expose: 컨테이너가 내부적으로 열어두는 포트를 지정합니다. 외부에 노출되지 않으며 같은 네트워크에 있는 다른 서비스들과 연결됩니다.
  • volumes: 호스트와 컨테이너 간에 볼륨을 마운트합니다. 호스트 경로와 컨테이너 경로를 콜론(:)으로 구분하여 입력하거나 읽기 전용(read-only) 옵션도 추가할 수 있습니다.
  • environment: 컨테이너 내부에서 사용할 환경 변수를 지정합니다. 키=값 형식으로 입력하거나 .env 파일을 참조할 수 있습니다.
  • env_file: 환경 변수가 정의된 파일의 경로를 지정합니다. .env 형식의 파일을 사용하면 여러 개의 환경 변수를 한 번에 설정할 수 있습니다.
  • depends_on: 서비스 간에 의존성을 지정합니다. depends_on 옵션에 의존하는 서비스는 depends_on 옵션에 명시된 서비스들보다 나중에 시작됩니다.
  • networks: 컨테이너가 속할 네트워크를 지정합니다. 도커 컴포즈는 기본적으로 모든 서비스를 하나의 네트워크에 연결하지만, networks 옵션을 사용하면 여러 개의 네트워크를 생성하고 컨테이너를 할당할 수 있습니다.
  • links: 컨테이너 간에 링크를 생성합니다. 링크된 컨테이너는 서로 호스트 이름으로 접근할 수 있습니다. 네트워크 옵션과 함께 사용할 수 있습니다.
  • restart: 컨테이너가 종료될 때 재시작 정책을 지정합니다. no, always, on-failure, unless-stopped 중에서 선택할 수 있습니다.
  • healthcheck: 컨테이너의 건강 상태를 검사하는 방법을 지정합니다. test, interval, timeout, retries 등의 옵션을 사용할 수 있습니다.

YAML 파일에는 services 외에도 다른 항목들을 정의할 수 있습니다.

  • volumes: 여러 개의 서비스에서 공유하는 볼륨을 정의합니다. 이름과 드라이버 등의 옵션을 지정할 수 있습니다.
  • networks: 여러 개의 서비스에서 공유하는 네트워크를 정의합니다. 이름과 드라이버 등의 옵션을 지정할 수 있습니다.
  • configs: 여러 개의 서비스에서 공유하는 설정 파일을 정의합니다. 이름과 파일 경로 등의 옵션을 지정할 수 있습니다.
  • secrets: 여러 개의 서비스에서 공유하는 비밀 정보를 정의합니다. 이름과 파일 경로 등의 옵션을 지정할 수 있습니다.

Docker Compose YAML 파일 작성법에 대해 알아보았습니다. Docker Compose는 멀티 컨테이너 애플리케이션 구성하기에 유용한 도구입니다.