소개
이 랩에서는 docker compose alpha scale 명령을 사용하여 Docker Compose 프로젝트에 정의된 서비스를 확장하는 방법을 배우게 됩니다. 먼저 Docker Compose 를 설치하고, 기본적인 웹 애플리케이션을 생성하며, 해당 Dockerfile 과 종속성을 정의하는 간단한 Docker Compose 프로젝트를 준비하는 것으로 시작합니다.
프로젝트 설정을 완료한 후에는 docker compose alpha scale을 사용하여 단일 서비스를 확장하는 방법, 여러 서비스를 동시에 확장하는 방법, 그리고 종속성을 시작하지 않고 서비스를 확장하는 방법을 살펴보겠습니다. 이 실습을 통해 서비스의 실행 인스턴스 수를 관리하기 위한 scale 명령의 유연성과 강력함을 경험할 수 있습니다.
간단한 Docker Compose 프로젝트 준비
이 단계에서는 간단한 Docker Compose 프로젝트를 준비합니다. LabEx 환경에는 Docker Compose 가 미리 설치되어 있지 않으므로, 먼저 설치합니다. 그런 다음, 간단한 웹 애플리케이션과 이를 정의하고 실행하기 위한 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 --version
출력에서 설치된 Docker Compose 버전을 확인할 수 있습니다.
다음으로, 간단한 웹 애플리케이션을 생성합니다. 기본적인 Python Flask 애플리케이션을 사용합니다. 프로젝트 디렉토리를 생성하고 해당 디렉토리로 이동합니다.
mkdir my-web-app
cd my-web-app
my-web-app 디렉토리 내에서 다음 내용으로 app.py라는 파일을 생성합니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker Compose!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
이것은 "Hello, Docker Compose!"를 반환하는 간단한 Flask 애플리케이션입니다.
이제 Flask 애플리케이션용 Docker 이미지를 빌드하기 위한 Dockerfile이 필요합니다. my-web-app 디렉토리에서 다음 내용으로 Dockerfile이라는 파일을 생성합니다.
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
이 Dockerfile 은 slim Python 3.9 이미지를 사용하고, 작업 디렉토리를 설정하고, requirements.txt에서 종속성을 복사하여 설치하고, 애플리케이션 코드를 복사하고, 포트 5000 을 노출하고, 애플리케이션을 실행하는 명령을 지정합니다.
Flask 종속성을 위한 requirements.txt 파일도 필요합니다. my-web-app 디렉토리에서 다음 내용으로 requirements.txt라는 파일을 생성합니다.
Flask==2.2.2
마지막으로, 서비스를 정의하기 위해 docker-compose.yml 파일을 생성합니다. my-web-app 디렉토리에서 다음 내용으로 docker-compose.yml이라는 파일을 생성합니다.
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
이 docker-compose.yml 파일은 web이라는 서비스를 정의합니다. Docker Compose 에게 현재 디렉토리 (.) 의 Dockerfile을 사용하여 이미지를 빌드하고 호스트의 포트 5000 을 컨테이너의 포트 5000 에 매핑하도록 지시합니다.
이제 Docker Compose 를 사용하여 서비스를 빌드하고 실행해 보겠습니다. ~/project/my-web-app 디렉토리에 있는지 확인하십시오.
docker-compose up -d
이 명령은 이미지를 빌드하고 (아직 빌드되지 않은 경우), web 서비스에 대한 컨테이너를 생성하고, 분리된 모드 (-d) 로 시작합니다.
docker ps 명령을 사용하여 컨테이너가 실행 중인지 확인할 수 있습니다.
docker ps
my-web-app-web-1 서비스에 대한 컨테이너가 실행 중인 것을 볼 수 있습니다.
애플리케이션이 작동하는지 확인하려면 curl을 사용하여 액세스할 수 있습니다.
curl http://localhost:5000
"Hello, Docker Compose!" 출력을 확인해야 합니다.
docker compose alpha scale 을 사용하여 서비스 확장
이 단계에서는 docker compose alpha scale 명령을 사용하여 서비스를 확장하는 방법을 배우겠습니다. 서비스를 확장한다는 것은 해당 서비스에 대해 실행 중인 인스턴스 (컨테이너) 의 수를 늘리거나 줄이는 것을 의미합니다. 이는 증가된 부하를 처리하거나 고가용성을 위해 유용합니다.
docker compose alpha scale 명령을 사용하면 특정 서비스에 대해 원하는 복제본 수를 설정할 수 있습니다. alpha 하위 명령은 이것이 Docker Compose 의 새로운 기능임을 나타냅니다.
docker-compose.yml 파일이 있는 ~/project/my-web-app 디렉토리에 있는지 확인하십시오.
현재 web 서비스의 인스턴스가 하나 실행 중입니다. 실행 중인 컨테이너를 나열하고 서비스 이름으로 필터링하여 이를 확인할 수 있습니다.
docker ps --filter "name=my-web-app-web"
하나의 컨테이너만 나열되어야 합니다.
이제 web 서비스를 3 개의 인스턴스로 확장해 보겠습니다. docker compose alpha scale 명령을 사용하고 서비스 이름과 원하는 복제본 수를 입력합니다.
docker compose alpha scale web=3
이 명령은 web 서비스에 대한 두 개의 새 컨테이너를 시작하여 총 인스턴스 수를 3 개로 만듭니다.
명령을 실행한 후, 실행 중인 컨테이너를 다시 확인하여 확장된 인스턴스를 볼 수 있습니다.
docker ps --filter "name=my-web-app-web"
이제 세 개의 컨테이너가 나열되어야 하며, 각 컨테이너는 서로 다른 컨테이너 ID 와 이름 (예: my-web-app-web-1, my-web-app-web-2, my-web-app-web-3) 을 갖습니다.
docker compose alpha scale 명령은 docker-compose.yml 파일을 수정하고 docker compose up을 다시 실행하지 않고도 서비스 복제본 수를 동적으로 조정하는 편리한 방법입니다.
서비스를 다시 축소하려면 더 작은 숫자를 사용하여 동일한 명령을 사용할 수 있습니다. 예를 들어, 1 개의 인스턴스로 다시 축소하려면 다음과 같이 합니다.
docker compose alpha scale web=1
이렇게 하면 추가 컨테이너가 중지되고 제거되어 하나의 인스턴스만 실행됩니다.
다음 단계를 위해 다시 3 개의 인스턴스로 확장해 보겠습니다.
docker compose alpha scale web=3
여러 서비스를 동시에 확장
이 단계에서는 docker compose alpha scale 명령을 사용하여 여러 서비스를 동시에 확장하는 방법을 배우겠습니다. 이는 증가된 부하를 처리하거나 균형 잡힌 아키텍처를 유지하기 위해 함께 확장해야 하는 여러 서비스가 애플리케이션에 있는 경우 유용합니다.
이를 시연하기 위해 docker-compose.yml 파일에 다른 간단한 서비스를 추가해 보겠습니다. 정적 콘텐츠를 제공하는 간단한 Nginx 서비스를 생성합니다.
먼저, Nginx 정적 콘텐츠를 위한 디렉토리를 생성합니다.
mkdir static
static 디렉토리 내에서 다음 내용으로 index.html이라는 간단한 HTML 파일을 생성합니다.
<!doctype html>
<html>
<head>
<title>Static Content</title>
</head>
<body>
<h1>Hello from Nginx!</h1>
</body>
</html>
이제 ~/project/my-web-app 디렉토리에서 docker-compose.yml 파일을 업데이트하여 Nginx 서비스를 포함해 보겠습니다. nano를 사용하여 docker-compose.yml 파일을 엽니다.
nano docker-compose.yml
web 서비스 아래에 다음 서비스 정의를 추가합니다.
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./static:/usr/share/nginx/html
업데이트된 docker-compose.yml 파일은 다음과 같아야 합니다.
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./static:/usr/share/nginx/html
이렇게 하면 nginx:latest 이미지를 사용하고, 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑하고, ./static 디렉토리를 Nginx 기본 웹 루트 (/usr/share/nginx/html) 에 마운트하는 nginx 서비스가 추가됩니다.
docker-compose.yml 파일을 저장하고 nano를 종료합니다 (Ctrl+X, Y, Enter).
이제 새 서비스를 시작해 보겠습니다. docker-compose.yml 파일을 수정했으므로 docker compose up을 다시 실행해야 합니다. -d 플래그는 컨테이너를 분리된 모드로 실행합니다.
docker compose up -d
Docker Compose 는 nginx 서비스를 생성하고 시작합니다. web 서비스는 이전 단계에서 이미 실행 중이어야 합니다.
docker ps를 사용하여 두 서비스가 모두 실행 중인지 확인할 수 있습니다.
docker ps
my-web-app-web-1, my-web-app-web-2, my-web-app-web-3 및 my-web-app-nginx-1 컨테이너가 모두 표시되어야 합니다.
이제 web 서비스를 5 개의 인스턴스로, nginx 서비스를 2 개의 인스턴스로 동시에 확장해 보겠습니다. docker compose alpha scale 명령에서 서비스와 원하는 복제본 수를 나열하여 이를 수행할 수 있습니다.
docker compose alpha scale web=5 nginx=2
이 명령은 web 서비스를 5 개의 인스턴스로, nginx 서비스를 2 개의 인스턴스로 확장합니다.
명령을 실행한 후, 실행 중인 컨테이너를 다시 확인합니다.
docker ps
이제 web 서비스에 대한 5 개의 컨테이너와 nginx 서비스에 대한 2 개의 컨테이너가 표시되어야 합니다.
이것은 단일 docker compose alpha scale 명령으로 여러 서비스를 확장하는 방법을 보여주며, 애플리케이션 구성 요소의 확장을 관리하는 데 효율적입니다.
종속성 시작 없이 서비스 확장
이 단계에서는 종속성을 시작하지 않고 docker compose alpha scale을 사용하여 특정 서비스를 확장하는 방법을 살펴보겠습니다. 기본적으로 서비스를 확장하면 Docker Compose 는 해당 종속성을 시작하거나 실행 중인지 확인하기도 합니다. 그러나 다른 서비스에 영향을 주지 않고 단일 서비스만 확장하려는 시나리오가 있습니다.
이를 설명하기 위해 web 서비스에 종속성을 추가해 보겠습니다. 이 예제에서는 웹 애플리케이션에 데이터베이스 로직을 구현하지 않지만, 간단한 데이터베이스 서비스를 추가합니다. 이는 종속성 개념을 시연하기 위한 것입니다.
nano를 사용하여 ~/project/my-web-app 디렉토리에서 docker-compose.yml 파일을 엽니다.
nano docker-compose.yml
데이터베이스 (예: 간단한 postgres 이미지) 에 대한 새 서비스 정의를 추가하고 web 서비스에 depends_on 섹션을 추가합니다.
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./static:/usr/share/nginx/html
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
업데이트된 docker-compose.yml 파일에는 postgres:latest 이미지를 사용하는 db 서비스가 포함되어 있으며, web 서비스에는 depends_on: - db 줄이 있어 web 서비스가 db 서비스에 종속되어 있음을 나타냅니다.
docker-compose.yml 파일을 저장하고 nano를 종료합니다 (Ctrl+X, Y, Enter).
이제 업데이트된 구성으로 서비스를 시작해 보겠습니다.
docker compose up -d
Docker Compose 는 이제 web 서비스가 db 서비스에 종속되어 있기 때문에 db 서비스도 생성하고 시작합니다.
docker ps를 사용하여 모든 서비스가 실행 중인지 확인할 수 있습니다.
docker ps
web, nginx 및 db 컨테이너가 표시되어야 합니다.
이제 db 서비스를 시작하거나 영향을 주지 않고 (이미 실행 중이 아닌 경우) web 서비스만 4 개의 인스턴스로 확장하려는 경우를 가정해 보겠습니다. 기본적으로 docker compose alpha scale 명령은 종속성을 존중합니다. 그러나 지정된 서비스 만 확장하려는 이 특정 시나리오의 경우, 표준 docker compose alpha scale 명령은 대상 서비스에 주로 초점을 맞추므로 충분합니다. depends_on 관계는 주로 docker compose up을 사용할 때 시작 순서에 영향을 미칩니다. docker compose alpha scale을 사용하면 지정된 서비스의 인스턴스 수를 조정하는 데 중점을 둡니다.
web 서비스를 4 개의 인스턴스로 확장해 보겠습니다.
docker compose alpha scale web=4
이 명령은 web 서비스를 4 개의 인스턴스로 확장합니다. 실행 중이지 않은 경우 db 서비스를 명시적으로 시작하지 않지만, 이전 docker compose up에 의해 시작되었으므로 계속 실행됩니다. 여기서 중요한 점은 docker compose alpha scale이 이미 실행 중이 아닌 경우 종속성의 시작을 반드시 트리거하지 않고 지정된 서비스를 확장하도록 설계되었다는 것입니다.
실행 중인 web 서비스 컨테이너 수를 확인합니다.
docker ps --filter "name=my-web-app-web"
web 서비스에 대한 4 개의 컨테이너가 표시되어야 합니다. db 서비스 컨테이너도 계속 실행 중이어야 합니다.
이는 docker compose alpha scale이 확장을 위해 대상 서비스에 초점을 맞춘다는 것을 보여줍니다.
마지막으로, 모든 서비스를 중단해 보겠습니다.
docker compose down
이 명령은 이 프로젝트에 대해 Docker Compose 가 생성한 모든 컨테이너, 네트워크 및 볼륨을 중지하고 제거합니다.
요약
이 랩에서는 간단한 Docker Compose 프로젝트를 준비하는 방법을 배웠습니다. 여기에는 LabEx 환경에서 Docker Compose 를 설치하고, 설치를 확인한 다음, 기본 Python Flask 웹 애플리케이션을 생성하는 작업이 포함되었습니다. 또한 애플리케이션용 Docker 이미지를 빌드하기 위한 Dockerfile과 애플리케이션의 종속성을 나열하기 위한 requirements.txt 파일을 생성했습니다. 이 초기 설정은 Docker Compose 기능을 탐색하기 위한 기반을 제공하며, 특히 후속 단계에서 서비스 확장에 중점을 둡니다.



