소개
이 랩에서는 docker compose stop 명령을 사용하여 Docker Compose 파일에 정의된 서비스를 관리하는 방법을 배우게 됩니다. 먼저 Docker Compose 를 설치하고 기본적인 docker-compose.yml 파일을 생성하는 등 간단한 Docker Compose 프로젝트를 준비하는 것으로 시작합니다.
프로젝트 설정을 완료한 후, Compose 파일에 정의된 서비스를 시작하는 연습을 할 것입니다. 이 랩의 핵심은 docker compose stop 명령을 사용하여 실행 중인 모든 서비스를 중지하고, 특정 서비스를 중지하며, 지정된 시간 제한 (timeout) 으로 서비스를 중지하는 데 중점을 둡니다. 이 실습 경험을 통해 Docker Compose 를 사용하여 멀티 컨테이너 Docker 애플리케이션의 라이프사이클을 제어하는 실질적인 기술을 습득할 수 있습니다.
간단한 Docker Compose 프로젝트 준비
이 단계에서는 간단한 Docker Compose 프로젝트를 준비합니다. Docker Compose 는 멀티 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다. Compose 를 사용하면 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음, 단일 명령으로 구성에서 모든 서비스를 생성하고 시작합니다.
LabEx 환경에는 Docker Compose 가 미리 설치되어 있지 않으므로, 먼저 설치해야 합니다. Docker Compose 바이너리를 다운로드하고 실행 가능하게 만들 것입니다.
먼저 Docker Compose 바이너리를 다운로드해 보겠습니다. curl을 사용하여 최신 안정 릴리스를 다운로드합니다.
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
이 명령은 시스템 아키텍처에 맞는 Docker Compose 바이너리를 다운로드하여 /usr/local/bin/docker-compose에 저장합니다.
다음으로, 다운로드한 바이너리를 실행 가능하게 만들어야 합니다.
sudo chmod +x /usr/local/bin/docker-compose
이 명령은 Docker Compose 바이너리에 실행 권한을 추가합니다.
이제 Docker Compose 버전을 확인하여 설치를 확인해 보겠습니다.
docker-compose --version
출력에서 설치된 Docker Compose 버전을 확인할 수 있으며, 이는 설치가 성공했음을 확인합니다.
이제 Docker Compose 가 설치되었으므로 간단한 Docker Compose 프로젝트를 만들어 보겠습니다. 프로젝트 디렉토리를 만들고 그 안에 docker-compose.yml 파일을 생성합니다.
먼저 홈 디렉토리에 my-compose-app이라는 디렉토리를 만듭니다.
mkdir ~/project/my-compose-app
새로 생성된 디렉토리로 이동합니다.
cd ~/project/my-compose-app
이제 docker-compose.yml 파일을 만들 것입니다. 이 파일은 애플리케이션의 서비스를 정의합니다. nano를 사용하여 파일을 생성하고 편집합니다.
nano docker-compose.yml
nano 편집기 내에서 다음 내용을 붙여넣습니다.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: ubuntu:latest
command: tail -f /dev/null
이 docker-compose.yml 파일을 자세히 살펴보겠습니다.
version: '3.8'은 Docker Compose 파일 형식 버전을 지정합니다.services:는 애플리케이션을 구성하는 서비스를 정의합니다.web:은web이라는 서비스를 정의합니다.image: nginx:latest는 이 서비스가nginx:latestDocker 이미지를 사용하도록 지정합니다. 이미지가 로컬에서 사용할 수 없는 경우 Docker Compose 는 Docker Hub 에서 이미지를 가져옵니다.ports:는 호스트 머신의 포트 80 을web컨테이너의 포트 80 에 매핑합니다.
app:은app이라는 서비스를 정의합니다.image: ubuntu:latest는 이 서비스가ubuntu:latestDocker 이미지를 사용하도록 지정합니다.command: tail -f /dev/null은app컨테이너가 시작될 때 실행할 명령을 지정합니다. 이 명령은 컨테이너가 종료되지 않고 무기한으로 실행되도록 유지합니다.
Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.
서비스를 시작하기 전에 필요한 Docker 이미지를 사용할 수 있는지 확인해야 합니다. Docker Compose 는 이미지가 없으면 이미지를 가져오지만, 특히 인터넷 접근이 제한된 환경이나 더 빠른 시작을 위해 미리 명시적으로 가져오는 것이 좋습니다.
nginx:latest 이미지를 가져오겠습니다.
docker pull nginx:latest
이 명령은 Docker Hub 에서 nginx:latest 이미지를 다운로드합니다.
다음으로, ubuntu:latest 이미지를 가져오겠습니다.
docker pull ubuntu:latest
이 명령은 Docker Hub 에서 ubuntu:latest 이미지를 다운로드합니다.
이제 web 및 app의 두 가지 서비스가 있는 간단한 Docker Compose 프로젝트를 성공적으로 준비하고 필요한 Docker 이미지를 가져왔습니다.
Compose 파일에 정의된 서비스 시작
이 단계에서는 이전 단계에서 생성한 docker-compose.yml 파일에 정의된 서비스를 시작합니다. Docker Compose 는 구성의 모든 서비스를 빌드, 생성 및 시작하는 간단한 명령을 제공합니다.
docker-compose.yml 파일이 있는 ~/project/my-compose-app 디렉토리에 있는지 확인하십시오.
cd ~/project/my-compose-app
서비스를 시작하려면 docker-compose up 명령을 사용합니다. 기본적으로 docker-compose up은 컨테이너를 전경에서 시작하고 각 컨테이너의 로그를 출력합니다.
docker-compose up
이 명령을 실행하면 Docker Compose 는 다음을 수행합니다.
- 현재 디렉토리에서
docker-compose.yml파일을 찾습니다. - 각 서비스에 필요한 Docker 이미지가 아직 없는 경우 빌드하거나 가져옵니다.
- 각 서비스에 대한 컨테이너를 생성하고 시작합니다.
- 터미널에 실행 중인 모든 컨테이너의 로그를 표시합니다.
네트워크와 컨테이너가 생성되고 시작되고 있음을 나타내는 출력을 볼 수 있습니다. web (nginx) 및 app (ubuntu) 컨테이너의 로그가 표시됩니다.
터미널을 계속 사용할 수 있도록 서비스를 백그라운드에서 실행하려는 경우 Ctrl + C를 눌러 현재 실행을 중지할 수 있습니다.
서비스를 분리된 모드 (백그라운드) 에서 실행하려면 docker-compose up 명령과 함께 -d 플래그를 사용할 수 있습니다.
docker-compose up -d
이 명령은 서비스를 백그라운드에서 시작하고 생성된 컨테이너의 이름을 출력합니다.
이제 서비스가 분리된 모드에서 실행 중이므로 docker ps 명령을 사용하여 실행 중인 컨테이너의 상태를 확인할 수 있습니다.
docker ps
web 서비스 (nginx 이미지를 기반으로 함) 와 app 서비스 (ubuntu 이미지를 기반으로 함) 에 대한 두 개의 컨테이너가 실행 중인 것을 볼 수 있습니다. 출력에는 컨테이너 ID, 이미지, 상태 및 포트를 포함한 컨테이너에 대한 정보가 표시됩니다.
web 서비스에 액세스할 수 있는지 확인하기 위해 curl을 사용하여 포트 80 에서 실행 중인 nginx 서버에 액세스할 수 있습니다. 호스트의 포트 80 을 web 컨테이너의 포트 80 에 매핑했으므로 LabEx VM 에서 직접 액세스할 수 있습니다.
curl http://localhost:80
nginx 웹 서버에서 제공하는 기본 HTML 콘텐츠를 볼 수 있으며, 이는 web 서비스가 실행 중이고 액세스할 수 있음을 확인합니다.
실행 중인 모든 서비스 중지
이 단계에서는 Docker Compose 프로젝트의 일부로 현재 실행 중인 모든 서비스를 중지하는 방법을 배웁니다. Docker Compose 는 docker-compose.yml 파일에 정의된 모든 컨테이너를 중지하는 편리한 명령을 제공합니다.
docker-compose.yml 파일이 있는 ~/project/my-compose-app 디렉토리에 있는지 확인하십시오.
cd ~/project/my-compose-app
실행 중인 모든 서비스를 중지하려면 docker-compose down 명령을 사용합니다. 이 명령은 docker-compose.yml 파일에 정의된 컨테이너, 네트워크 및 볼륨을 중지하고 제거합니다.
docker-compose down
이 명령을 실행하면 Docker Compose 는 다음을 수행합니다.
- 실행 중인 컨테이너를 정상적으로 중지합니다.
- 중지된 컨테이너를 제거합니다.
- 이 프로젝트에 대해 Docker Compose 가 생성한 네트워크를 제거합니다.
docker-compose.yml파일에 정의된 모든 볼륨을 제거합니다 (명시적으로 제거하지 않도록 지시하지 않는 한).
컨테이너와 네트워크가 중지되고 제거되고 있음을 나타내는 출력을 볼 수 있습니다.
docker-compose down을 실행한 후 docker ps 명령을 사용하여 컨테이너가 더 이상 실행되지 않는지 확인할 수 있습니다.
docker ps
이 명령은 현재 실행 중인 컨테이너를 나열합니다. 모든 서비스를 중지했으므로 출력에서 web 또는 app 컨테이너를 볼 수 없습니다. 출력은 헤더 행만 표시하거나 시스템에서 다른 컨테이너가 실행되지 않는 경우 비어 있어야 합니다.
docker-compose down으로 서비스를 중지하는 것은 Docker Compose 프로젝트 리소스를 사용한 후 정리하는 표준 방법입니다.
특정 서비스 중지
이 단계에서는 모든 서비스를 한 번에 중지하는 대신 Docker Compose 프로젝트 내에서 특정 서비스를 중지하는 방법을 배웁니다. 이는 애플리케이션의 단일 구성 요소를 다시 시작하거나 중지해야 할 때 유용합니다.
먼저, 서비스가 실행 중인지 확인해 보겠습니다. 프로젝트 디렉토리로 이동하여 분리된 모드에서 서비스를 시작합니다.
cd ~/project/my-compose-app
docker-compose up -d
docker ps를 사용하여 web 및 app 서비스가 모두 실행 중인지 확인합니다.
docker ps
두 컨테이너가 실행 중으로 나열되어야 합니다.
이제 app 서비스만 중지해 보겠습니다. 특정 서비스를 중지하려면 서비스 이름 뒤에 docker-compose stop 명령을 사용합니다.
docker-compose stop app
이 명령은 app 서비스의 컨테이너에 중지 신호를 보내고 정상적으로 중지될 때까지 기다립니다.
명령을 실행한 후 컨테이너의 상태를 다시 확인해 보겠습니다.
docker ps
이제 web 컨테이너만 실행 중으로 나열되어야 합니다. app 컨테이너는 더 이상 실행 중인 컨테이너 목록에 없어야 합니다.
app 컨테이너가 중지되었는지 확인하려면 중지된 컨테이너를 포함한 모든 컨테이너를 표시하는 docker ps -a를 사용할 수도 있습니다.
docker ps -a
app 컨테이너가 Exited 상태로 나열되어야 합니다.
특정 서비스를 중지하면 다른 서비스에 영향을 주지 않고 애플리케이션의 개별 구성 요소를 관리할 수 있습니다. 이는 개발 중이거나 특정 서비스의 문제를 해결할 때 특히 유용합니다.
타임아웃과 함께 서비스 중지
이 단계에서는 지정된 타임아웃으로 서비스를 중지하는 방법을 살펴봅니다. 컨테이너를 중지하면 Docker 는 컨테이너의 주 프로세스에 SIGTERM 신호를 보내 정상적으로 종료할 시간을 줍니다. 프로세스가 특정 기간 내에 종료되지 않으면 Docker 는 SIGKILL 신호를 보내 강제로 중지합니다. 기본적으로 이 타임아웃은 10 초입니다. docker-compose stop 또는 docker-compose down 명령과 함께 -t 또는 --timeout 플래그를 사용하여 이 타임아웃을 조정할 수 있습니다.
먼저, 서비스가 실행 중인지 확인해 보겠습니다. 프로젝트 디렉토리로 이동하여 분리된 모드에서 서비스를 시작합니다.
cd ~/project/my-compose-app
docker-compose up -d
두 서비스가 모두 실행 중인지 확인합니다.
docker ps
이제 5 초의 타임아웃으로 web 서비스를 중지해 보겠습니다.
docker-compose stop -t 5 web
이 명령은 Docker Compose 에 web 서비스를 중지하고 SIGTERM 신호를 보낸 후 컨테이너가 정상적으로 중지될 때까지 최대 5 초 동안 대기하도록 지시합니다. 컨테이너가 5 초 이내에 중지되지 않으면 Docker 는 SIGKILL 신호를 보냅니다.
web 서비스가 중지되고 있음을 나타내는 출력을 볼 수 있습니다.
컨테이너의 상태를 다시 확인해 보겠습니다.
docker ps
이제 app 컨테이너만 실행 중인 것을 볼 수 있습니다. web 컨테이너는 중지되어야 합니다.
마찬가지로 docker-compose down을 사용하여 모든 서비스를 중지할 때 타임아웃을 적용할 수 있습니다. 3 초의 타임아웃으로 모든 서비스를 중지해 보겠습니다.
docker-compose down -t 3
이 명령은 docker-compose.yml 파일에 정의된 모든 서비스를 중지하려고 시도하며, 각 컨테이너가 강제로 중지되기 전에 정상적으로 중지될 때까지 최대 3 초 동안 대기합니다.
명령을 실행한 후 컨테이너가 실행 중이지 않은지 확인합니다.
docker ps
출력에는 실행 중인 컨테이너가 표시되지 않아야 합니다.
타임아웃 옵션을 사용하는 것은 애플리케이션이 중지되기 전에 정리 작업을 수행할 충분한 시간을 확보하여 데이터 손상 또는 기타 문제를 방지하는 데 중요합니다.
요약
이 Lab 에서는 간단한 Docker Compose 프로젝트를 준비하는 방법을 배웠습니다. 여기에는 바이너리를 다운로드하고 실행 가능하게 만들어 Docker Compose 를 설치하고 설치를 확인하는 작업이 포함되었습니다. 그런 다음 프로젝트 디렉토리와 docker-compose.yml 파일을 생성하여 애플리케이션의 서비스를 정의했습니다.
또한 docker compose stop 명령을 사용하여 Compose 파일에 정의된 서비스의 수명 주기를 관리하는 방법을 배웠습니다. 여기에는 모든 서비스 시작, 실행 중인 모든 서비스 중지, 특정 서비스 중지 및 지정된 타임아웃으로 서비스 중지가 포함되었습니다.



