docker compose up 명령을 사용하여 컨테이너 관리하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker compose up 명령어를 사용하여 컨테이너를 효과적으로 관리하는 방법을 배우게 됩니다. docker-compose.yml 파일에 정의된 서비스를 시작하기 위한 docker compose up의 기본적인 사용법을 다루며, 전경 (foreground) 모드와 분리 (detached) 모드로 서비스를 실행하는 방법을 포함합니다.

또한, force-recreate를 사용하여 컨테이너를 강제로 다시 생성하고, no-recreate를 사용하여 불필요한 재 생성을 방지하며, 컨테이너를 시작하기 전에 이미지를 자동으로 빌드하는 등 docker compose up의 고급 옵션을 살펴볼 것입니다. 이 랩을 마치면 다양한 컨테이너 관리 시나리오에서 docker compose up을 능숙하게 사용할 수 있게 될 것입니다.

docker compose up 으로 서비스 시작하기

이 단계에서는 docker compose up 명령어를 사용하여 docker-compose.yml 파일에 정의된 서비스를 시작하는 방법을 배우게 됩니다. 시작하기 전에, 이 환경에는 Docker Compose 가 미리 설치되어 있지 않으므로 Docker Compose 를 설치해야 합니다.

먼저, Docker Compose 를 설치해 보겠습니다. 최신 안정 버전을 다운로드하여 실행 가능하게 만들 것입니다.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

이제 Docker Compose 가 설치되었으므로, 서비스를 정의하는 간단한 docker-compose.yml 파일을 만들어 보겠습니다. ~/project 디렉토리에 docker-compose.yml이라는 파일을 생성합니다.

nano ~/project/docker-compose.yml

다음 내용을 파일에 추가합니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

docker-compose.yml 파일은 web이라는 단일 서비스를 정의합니다. nginx:latest 이미지를 사용하고 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑합니다.

이제 docker compose up을 사용하여 서비스를 시작해 보겠습니다. ~/project 디렉토리로 이동하여 명령을 실행합니다.

cd ~/project
docker compose up

Docker Compose 가 web 컨테이너를 생성하고 시작하고 있음을 나타내는 출력을 볼 수 있습니다. 기본적으로 docker compose up은 전경 (foreground) 에서 실행되어 실행 중인 서비스의 로그를 표시합니다.

Nginx 컨테이너가 실행 중인지 확인하려면 새 터미널을 열거나 curl을 사용하여 웹 서버에 액세스할 수 있습니다.

curl http://localhost

기본 Nginx 환영 페이지 HTML 출력을 볼 수 있습니다. 이는 web 서비스가 실행 중이며 액세스할 수 있음을 확인합니다.

서비스를 중지하려면 docker compose up이 실행 중인 터미널에서 Ctrl+C를 누릅니다. 이렇게 하면 컨테이너가 중지되고 제거됩니다.

분리 모드에서 서비스 실행

이전 단계에서는 docker compose up을 사용하여 서비스를 시작했는데, 이는 전경 (foreground) 에서 실행되었습니다. 이는 디버깅에 유용하지만, 프로덕션 환경이나 백그라운드에서 서비스를 실행하려면 분리 모드를 사용해야 합니다.

분리 모드는 Docker Compose 가 컨테이너를 시작한 다음 종료되어 컨테이너가 백그라운드에서 계속 실행되도록 하는 것을 의미합니다. 이렇게 하면 터미널을 다른 작업에 계속 사용할 수 있습니다.

분리 모드로 서비스를 실행하려면 docker compose up 명령어에 -d 플래그를 추가하기만 하면 됩니다. docker-compose.yml 파일이 있는 ~/project 디렉토리에 있는지 확인하십시오.

cd ~/project
docker compose up -d

컨테이너가 생성되고 시작되고 있음을 나타내는 출력을 볼 수 있지만, 서비스가 실행되면 명령어가 터미널 프롬프트로 돌아갑니다.

컨테이너가 백그라운드에서 실행 중인지 확인하려면 docker ps 명령어를 사용하여 실행 중인 컨테이너를 나열할 수 있습니다.

docker ps

project-web-1 컨테이너에 대한 항목을 볼 수 있습니다 (이름은 일반적으로 [directory_name]-[service_name]-[instance_number] 형식입니다).

curl을 사용하여 Nginx 웹 서버에 계속 액세스하여 작동하는지 확인할 수 있습니다.

curl http://localhost

다시 기본 Nginx 환영 페이지 HTML 출력을 볼 수 있습니다.

분리 모드로 시작된 서비스를 중지하려면 docker-compose.yml 파일과 동일한 디렉토리에서 docker compose down 명령어를 사용할 수 있습니다.

docker compose down

이 명령어는 docker compose up으로 생성된 컨테이너, 네트워크 및 볼륨을 중지하고 제거합니다.

force-recreate 옵션으로 컨테이너 다시 생성

이전 단계에서는 분리 모드로 서비스를 실행하는 방법을 배웠습니다. 기본적으로, 동일한 docker-compose.yml 파일로 docker compose up을 다시 실행하고 컨테이너가 이미 실행 중인 경우, Docker Compose 는 서비스 정의 (이미지 또는 포트와 같은) 에 변경 사항이 없는 한 컨테이너를 다시 생성하지 않습니다.

때로는 서비스 정의에 변경 사항이 없더라도 Docker Compose 가 컨테이너를 중지하고 다시 생성하도록 강제하고 싶을 수 있습니다. 이는 docker-compose.yml 파일을 변경하지 않는 업데이트를 적용하거나, 단순히 컨테이너를 새로 시작하기 위해 유용할 수 있습니다.

컨테이너를 강제로 다시 생성하려면 docker compose up 명령어와 함께 --force-recreate 플래그를 사용할 수 있습니다.

먼저, 이전 단계에서 web 서비스가 분리 모드로 실행 중인지 확인합니다. 그렇지 않은 경우, 다음을 실행합니다.

cd ~/project
docker compose up -d

이제 --force-recreate 플래그를 사용하여 docker compose up을 다시 실행해 보겠습니다.

cd ~/project
docker compose up -d --force-recreate

Docker Compose 가 web 컨테이너를 중지한 다음 다시 생성하고 있음을 나타내는 출력을 볼 수 있습니다. docker-compose.yml 파일이 변경되지 않았음에도 불구하고 --force-recreate 플래그는 Docker Compose 에게 기존 컨테이너를 제거하고 현재 구성을 기반으로 새 컨테이너를 구축하도록 지시합니다.

docker ps를 사용하여 컨테이너 ID 를 확인하여 컨테이너가 다시 생성되었는지 확인할 수 있습니다. 컨테이너 ID 는 --force-recreate를 사용하여 명령을 실행하기 전에 보았던 ID 와 달라야 합니다.

docker ps

출력에서 컨테이너 ID 를 확인합니다.

정리하려면 실행 중인 서비스를 중지합니다.

cd ~/project
docker compose down

no-recreate 옵션으로 컨테이너 재 생성 방지

이전 단계에서는 --force-recreate 플래그를 사용하여 컨테이너를 강제로 다시 생성하는 방법을 배웠습니다. 이제 반대 시나리오, 즉 재구축을 방지하는 방법을 살펴보겠습니다.

앞서 언급했듯이, 기본적으로 docker compose up은 컨테이너가 이미 실행 중이고 docker-compose.yml 파일의 구성이 변경되지 않은 경우 컨테이너를 다시 생성하지 않습니다. 그러나 사소한 변경 사항으로 인해 재구축이 트리거될 수 있는 경우에도 기존 컨테이너가 재구축되지 않도록 명시적으로 보장하려는 상황이 있을 수 있습니다.

컨테이너의 재구축을 방지하려면 docker compose up 명령어와 함께 --no-recreate 플래그를 사용할 수 있습니다.

먼저, web 서비스가 중지되었는지 확인합니다. 실행 중인 경우 다음을 사용하여 중지합니다.

cd ~/project
docker compose down

이제 docker compose up -d를 사용하여 서비스를 시작해 보겠습니다.

cd ~/project
docker compose up -d

컨테이너가 실행 중인지 확인합니다.

docker ps

컨테이너 ID 를 확인합니다.

이제 --no-recreate 플래그를 사용하여 docker compose up을 다시 실행해 보겠습니다.

cd ~/project
docker compose up -d --no-recreate

서비스가 최신 상태이며 컨테이너가 재구축되지 않음을 나타내는 출력을 볼 수 있습니다. docker ps를 다시 확인하면 컨테이너 ID 가 이전과 동일한 것을 볼 수 있습니다.

docker ps

이는 --no-recreate 플래그가 Docker Compose 가 기존 컨테이너를 재구축하는 것을 성공적으로 방지했음을 보여줍니다.

정리하려면 실행 중인 서비스를 중지합니다.

cd ~/project
docker compose down

컨테이너 시작 전 이미지 빌드

이전 단계에서는 Docker Hub 에서 제공되는 미리 빌드된 Docker 이미지 (예: nginx:latest) 를 사용했습니다. 그러나 애플리케이션에 맞게 사용자 정의 Docker 이미지를 직접 빌드해야 하는 경우가 많습니다.

Docker Compose 는 서비스를 시작하기 전에 docker-compose.yml 파일에 정의된 이미지를 자동으로 빌드할 수 있습니다. 이는 일반적으로 서비스에 대한 image 이름 대신 build 컨텍스트를 지정하여 수행됩니다.

간단한 사용자 정의 Nginx 이미지를 빌드하도록 docker-compose.yml 파일을 수정해 보겠습니다.

먼저, ~/project 내에 nginx_custom이라는 새 디렉토리를 생성합니다.

cd ~/project
mkdir nginx_custom

이제 nginx_custom 디렉토리 내에 Dockerfile을 생성합니다.

nano ~/project/nginx_custom/Dockerfile

다음 내용을 Dockerfile에 추가합니다.

FROM nginx:latest
RUN echo '<h1>Hello from Custom Nginx!</h1>' >/usr/share/nginx/html/index.html

Dockerfile은 공식 nginx:latest 이미지에서 시작하여 기본 index.html 파일을 사용자 정의 파일로 바꿉니다.

다음으로, ~/project/docker-compose.yml 파일을 수정하여 web 서비스 이미지를 빌드하는 데 이 Dockerfile을 사용하도록 합니다. 파일을 편집하기 위해 엽니다.

nano ~/project/docker-compose.yml

web 서비스 정의를 image 대신 build를 사용하도록 변경합니다.

version: "3.8"
services:
  web:
    build: ./nginx_custom
    ports:
      - "80:80"

이제 docker compose up을 실행하면 Docker Compose 는 먼저 ./nginx_custom 디렉토리의 Dockerfile에 의해 정의된 이미지를 빌드한 다음, 새로 빌드된 이미지를 사용하여 컨테이너를 시작합니다.

~/project 디렉토리에 있는지 확인하고 다음을 실행합니다.

cd ~/project
docker compose up -d

Docker Compose 가 이미지를 빌드한 다음 컨테이너를 생성하고 시작하고 있음을 나타내는 출력을 볼 수 있습니다.

사용자 정의 Nginx 페이지가 제공되고 있는지 확인하려면 curl을 사용합니다.

curl http://localhost

<h1>Hello from Custom Nginx!</h1> 출력을 확인하여 이미지가 빌드되었고 컨테이너가 사용자 정의 콘텐츠로 실행 중임을 확인해야 합니다.

정리하려면 실행 중인 서비스를 중지합니다.

cd ~/project
docker compose down

요약

이 랩에서는 docker compose up 명령을 사용하여 컨테이너를 관리하는 방법을 배웠습니다. Docker Compose 를 설치하고 Nginx 이미지를 사용하여 웹 서비스를 정의하는 간단한 docker-compose.yml 파일을 생성하는 것으로 시작했습니다. 그런 다음 docker compose up을 사용하여 서비스를 시작했으며, 기본적으로 전경에서 실행되고 컨테이너 로그를 표시하는 것을 확인했습니다. Nginx 시작 페이지에 액세스하여 실행 중인 서비스를 확인했습니다.

또한 이 랩에서는 -d 플래그를 사용하여 서비스를 분리된 모드 (detached mode) 로 실행하는 방법을 소개했습니다. 이를 통해 컨테이너가 백그라운드에서 계속 실행되는 동안 명령을 종료할 수 있습니다. --force-recreate 플래그를 사용하여 구성이 변경되지 않은 경우에도 컨테이너를 강제로 다시 생성하는 방법과 --no-recreate 플래그를 사용하여 기존 컨테이너의 재구축을 방지하는 방법을 배웠습니다. 마지막으로, 컨테이너를 시작하기 전에 이미지를 빌드하거나 다시 빌드하여 최신 이미지가 사용되도록 하는 --build 플래그를 살펴보았습니다.