소개
Docker 는 애플리케이션을 컨테이너화하는 강력한 도구로, 소프트웨어 개발, 배포 및 관리를 용이하게 합니다. 이 튜토리얼에서는 Docker 컨테이너가 시작될 때 Python 스크립트를 실행하는 방법을 살펴봅니다. 이 접근 방식은 애플리케이션 배포를 자동화하고 개발 워크플로우를 간소화할 수 있게 해줍니다. 이 랩을 마치면 시작 시 자동으로 Python 스크립트를 실행하는 Docker 컨테이너를 만들 수 있습니다.
Docker 는 애플리케이션을 컨테이너화하는 강력한 도구로, 소프트웨어 개발, 배포 및 관리를 용이하게 합니다. 이 튜토리얼에서는 Docker 컨테이너가 시작될 때 Python 스크립트를 실행하는 방법을 살펴봅니다. 이 접근 방식은 애플리케이션 배포를 자동화하고 개발 워크플로우를 간소화할 수 있게 해줍니다. 이 랩을 마치면 시작 시 자동으로 Python 스크립트를 실행하는 Docker 컨테이너를 만들 수 있습니다.
첫 번째 단계에서는 Docker 컨테이너가 시작될 때 실행될 간단한 Python 스크립트를 생성합니다. 이 스크립트는 메시지와 현재 날짜 및 시간을 출력합니다.
프로젝트를 위한 새 디렉토리를 생성하는 것으로 시작해 보겠습니다.
mkdir -p ~/project/python-docker
cd ~/project/python-docker
이제 nano 텍스트 편집기를 사용하여 app.py라는 간단한 Python 스크립트를 생성해 보겠습니다.
nano app.py
nano 편집기에서 다음 Python 코드를 추가합니다.
import datetime
import time
print("Hello from the Docker container!")
print(f"Current date and time: {datetime.datetime.now()}")
## Keep the container running to demonstrate it's working
print("Container is running...")
while True:
print("Container still running... Press Ctrl+C to stop.")
time.sleep(10)
Ctrl+O를 누른 다음 Enter를 눌러 파일을 저장하고, Ctrl+X를 눌러 nano 를 종료합니다.
이 스크립트는 다음을 수행합니다.
Python 스크립트가 제대로 작동하는지 테스트해 보겠습니다.
python3 app.py
다음과 유사한 출력을 볼 수 있습니다.
Hello from the Docker container!
Current date and time: 2023-10-12 14:30:45.123456
Container is running...
Container still running... Press Ctrl+C to stop.
Ctrl+C를 눌러 스크립트를 중지합니다.
이제 작동하는 Python 스크립트가 있으므로, 이 스크립트가 시작될 때 실행되는 Docker 컨테이너를 생성할 수 있습니다.
이제 Python 스크립트가 준비되었으므로, Docker 컨테이너를 빌드하는 방법을 정의하는 Dockerfile 을 생성해 보겠습니다.
Dockerfile 은 Docker 이미지를 빌드하는 데 필요한 모든 명령이 포함된 텍스트 파일입니다. 이 이미지에는 Python 스크립트와 필요한 모든 종속성이 포함됩니다.
동일한 디렉토리 (~/project/python-docker) 에서 Dockerfile이라는 새 파일을 생성합니다.
nano Dockerfile
Dockerfile 에 다음 내용을 추가합니다.
## Use the official Python image as base
FROM python:3.9-slim
## Set working directory
WORKDIR /app
## Copy the Python script to the container
COPY app.py .
## Command to run when the container starts
CMD ["python", "app.py"]
Ctrl+O를 누른 다음 Enter를 누르고, Ctrl+X를 눌러 저장하고 nano 를 종료합니다.
Dockerfile 의 각 줄이 무엇을 하는지 이해해 보겠습니다.
FROM python:3.9-slim: 사용할 기본 이미지를 지정합니다. 크기를 작게 유지하기 위해 slim 변형을 사용하여 공식 Python 3.9 이미지를 사용하고 있습니다.
WORKDIR /app: 컨테이너 내부의 작업 디렉토리를 /app으로 설정합니다.
COPY app.py .: 호스트 머신에서 컨테이너의 현재 작업 디렉토리 (/app) 로 Python 스크립트를 복사합니다.
CMD ["python", "app.py"]: 컨테이너가 시작될 때 실행할 명령을 지정합니다. 이 경우 Python 스크립트가 실행됩니다.
이제 이 Dockerfile 을 사용하여 Docker 이미지를 빌드해 보겠습니다.
docker build -t python-app .
이 명령은 현재 디렉토리 (.) 의 Dockerfile 에서 Docker 이미지를 빌드하고 python-app이라는 이름으로 태그를 지정합니다 (-t는 tag 를 의미합니다).
다음과 유사한 출력을 볼 수 있습니다.
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM python:3.9-slim
---> 1bc6a8a2a52f
Step 2/4 : WORKDIR /app
---> Using cache
---> 2a3b7a28c9e5
Step 3/4 : COPY app.py .
---> Using cache
---> 9a0b7a1c8c2d
Step 4/4 : CMD ["python", "app.py"]
---> Using cache
---> 3b0c7a2d9f1e
Successfully built 3b0c7a2d9f1e
Successfully tagged python-app:latest
출력은 다를 수 있지만, 모든 것이 제대로 진행되었다면 "Successfully built" 및 "Successfully tagged" 메시지를 볼 수 있습니다.
이제 Python 스크립트가 포함되어 있고 이 이미지에서 컨테이너가 시작될 때 실행될 Docker 이미지를 성공적으로 생성했습니다.
이제 Docker 이미지를 빌드했으므로, 이 이미지를 기반으로 컨테이너를 실행할 수 있습니다. 컨테이너는 시작될 때 자동으로 Python 스크립트를 실행합니다.
이미지에서 컨테이너를 실행하려면 다음 명령을 사용합니다.
docker run --name python-container python-app
이 명령은 이전 단계에서 생성한 python-app 이미지에서 python-container라는 새 컨테이너를 시작합니다.
다음과 유사한 출력을 볼 수 있습니다.
Hello from the Docker container!
Current date and time: 2023-10-12 15:45:30.123456
Container is running...
Container still running... Press Ctrl+C to stop.
Container still running... Press Ctrl+C to stop.
이제 컨테이너가 실행 중이며 Python 스크립트를 실행하고 있습니다. 스크립트는 무한정 실행되도록 설계되어 10 초마다 메시지를 출력합니다.
로그 보기를 중지하려면 Ctrl+C를 누르십시오. 하지만 컨테이너는 백그라운드에서 계속 실행 중입니다.
컨테이너가 실행 중인지 확인하려면 다음 명령을 사용합니다.
docker ps
실행 중인 컨테이너 목록에서 컨테이너를 볼 수 있습니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a2b3c4d5e6f python-app "python app.py" 1 minute ago Up 1 minute python-container
컨테이너를 중지하려면 다음 명령을 사용합니다.
docker stop python-container
컨테이너를 다시 시작하려면 다음을 사용합니다.
docker start python-container
실행 중인 컨테이너의 로그를 보려면 다음을 사용합니다.
docker logs python-container
이것은 Python 스크립트의 출력을 표시합니다. Ctrl+C를 눌러 로그 보기를 종료할 수 있습니다.
작업이 완료되면 컨테이너를 제거하려면 먼저 실행 중인 경우 중지한 다음 제거합니다.
docker stop python-container
docker rm python-container
이제 시작 시 Python 스크립트를 실행하는 Docker 컨테이너를 성공적으로 생성하고 실행했습니다.
환경 변수는 코드를 변경하지 않고 애플리케이션을 구성하는 훌륭한 방법입니다. 이 단계에서는 Python 스크립트를 수정하여 환경 변수를 사용하고 Dockerfile 을 업데이트하여 이러한 변수를 제공합니다.
먼저, 환경 변수를 읽도록 Python 스크립트를 업데이트해 보겠습니다.
nano app.py
스크립트를 수정하여 환경 변수 지원을 포함합니다.
import datetime
import time
import os
## Get the environment variable with a default value if not set
user_name = os.environ.get('USER_NAME', 'Guest')
print(f"Hello, {user_name}, from the Docker container!")
print(f"Current date and time: {datetime.datetime.now()}")
## Keep the container running to demonstrate it's working
print("Container is running...")
while True:
print("Container still running... Press Ctrl+C to stop.")
time.sleep(10)
Ctrl+O를 누른 다음 Enter를 누르고, Ctrl+X를 눌러 저장하고 nano 를 종료합니다.
이제 환경 변수를 포함하도록 Dockerfile 을 업데이트해 보겠습니다.
nano Dockerfile
Dockerfile 을 업데이트하여 환경 변수를 포함합니다.
## Use the official Python image as base
FROM python:3.9-slim
## Set working directory
WORKDIR /app
## Set environment variable
ENV USER_NAME="Docker User"
## Copy the Python script to the container
COPY app.py .
## Command to run when the container starts
CMD ["python", "app.py"]
저장하고 nano 를 종료한 다음 Docker 이미지를 다시 빌드합니다.
docker build -t python-app-env .
이제 기본 환경 변수로 컨테이너를 실행합니다.
docker run --name python-env-container python-app-env
출력에서 "Docker User"로 시작하는 인사를 볼 수 있습니다.
Hello, Docker User, from the Docker container!
Current date and time: 2023-10-12 16:30:45.123456
Container is running...
Ctrl+C를 눌러 로그 보기를 중지합니다.
컨테이너를 중지하고 제거합니다.
docker stop python-env-container
docker rm python-env-container
컨테이너를 실행할 때 환경 변수를 재정의할 수도 있습니다.
docker run --name python-env-container -e USER_NAME="LabEx Student" python-app-env
이번에는 인사말에서 사용자 정의 이름을 볼 수 있습니다.
Hello, LabEx Student, from the Docker container!
Current date and time: 2023-10-12 16:35:15.789012
Container is running...
Ctrl+C를 눌러 로그 보기를 중지합니다.
컨테이너를 중지하고 제거합니다.
docker stop python-env-container
docker rm python-env-container
환경 변수를 사용하는 것은 Docker 에서 작은 변경 사항에 대해 이미지를 다시 빌드하지 않고도 컨테이너를 더 쉽게 구성할 수 있도록 하는 일반적인 방법입니다.
Docker 에는 컨테이너가 시작될 때 실행해야 하는 명령을 지정하는 두 가지 명령어가 있습니다: CMD와 ENTRYPOINT. 이들은 서로 다른 목적과 동작을 가지며, 그 차이점을 이해하는 것은 컨테이너 관리에 중요합니다.
ENTRYPOINT: 컨테이너가 시작될 때 실행될 실행 파일을 정의합니다. 런타임에 재정의하기가 더 어렵습니다.CMD: ENTRYPOINT에 대한 기본 인수를 제공하거나, ENTRYPOINT가 사용되지 않는 경우 전체 명령을 지정할 수 있습니다. 런타임에 쉽게 재정의할 수 있습니다.두 개의 서로 다른 Dockerfile 을 생성하여 차이점을 살펴보겠습니다.
먼저, 명령줄 인수를 허용하는 새로운 Python 스크립트를 생성합니다.
nano greeting.py
다음 코드를 추가합니다.
import sys
print("Script started!")
if len(sys.argv) > 1:
print(f"Arguments provided: {sys.argv[1:]}")
for arg in sys.argv[1:]:
print(f"- {arg}")
else:
print("No arguments provided.")
print("Script finished!")
저장하고 nano 를 종료합니다.
이제 CMD를 사용하는 Dockerfile 을 생성해 보겠습니다.
nano Dockerfile.cmd
다음 내용을 추가합니다.
FROM python:3.9-slim
WORKDIR /app
COPY greeting.py .
CMD ["python", "greeting.py", "default", "arguments"]
저장하고 nano 를 종료합니다.
이미지를 빌드합니다.
docker build -t python-cmd -f Dockerfile.cmd .
이제 ENTRYPOINT를 사용하는 다른 Dockerfile 을 생성합니다.
nano Dockerfile.entrypoint
다음 내용을 추가합니다.
FROM python:3.9-slim
WORKDIR /app
COPY greeting.py .
ENTRYPOINT ["python", "greeting.py"]
CMD ["default", "arguments"]
저장하고 nano 를 종료합니다.
이미지를 빌드합니다.
docker build -t python-entrypoint -f Dockerfile.entrypoint .
두 이미지에서 컨테이너를 실행하고 차이점을 관찰해 보겠습니다.
먼저, 추가 인수 없이 CMD 이미지를 사용하여 컨테이너를 실행합니다.
docker run --name cmd-container python-cmd
출력은 다음과 유사해야 합니다.
Script started!
Arguments provided: ['default', 'arguments']
- default
- arguments
Script finished!
이제 CMD 이미지를 사용하여 컨테이너를 실행하지만 사용자 지정 인수를 제공합니다.
docker run --name cmd-container-custom python-cmd hello world
출력:
Script started!
No arguments provided.
Script finished!
전체 명령이 hello world로 대체되었으며, 이는 스크립트에 인수로 전달되지 않았음을 알 수 있습니다.
이제 추가 인수 없이 ENTRYPOINT 이미지를 사용하여 컨테이너를 실행해 보겠습니다.
docker run --name entrypoint-container python-entrypoint
출력:
Script started!
Arguments provided: ['default', 'arguments']
- default
- arguments
Script finished!
마지막으로, ENTRYPOINT 이미지를 사용하여 컨테이너를 실행하고 사용자 지정 인수를 제공합니다.
docker run --name entrypoint-container-custom python-entrypoint hello world
출력:
Script started!
Arguments provided: ['hello', 'world']
- hello
- world
Script finished!
이번에는 ENTRYPOINT가 실행 파일을 정의하고 docker run에 제공된 추가 인수가 해당 실행 파일에 전달되므로 인수가 Python 스크립트에 제대로 전달됩니다.
ENTRYPOINT를 사용합니다.CMD를 사용합니다.ENTRYPOINT를 사용하고 기본 인수에 CMD를 사용하여 둘을 결합합니다.컨테이너를 정리합니다.
docker rm cmd-container cmd-container-custom entrypoint-container entrypoint-container-custom
이제 Docker 에서 CMD와 ENTRYPOINT의 차이점을 배웠습니다. 이는 컨테이너가 시작될 때 Python 스크립트가 실행되는 방식을 제어하는 데 필수적입니다.
이 랩에서는 Docker 컨테이너가 시작될 때 Python 스크립트를 실행하는 방법을 배웠습니다. 다음은 여러분이 달성한 내용입니다.
이러한 기술은 Python 애플리케이션을 컨테이너화하고 배포를 자동화하는 데 기본입니다. 이제 다음을 수행할 수 있습니다.
이러한 지식을 통해 시작 시 Python 스크립트를 자동으로 실행하는 더 복잡한 Docker 애플리케이션을 구축하여 배포 프로세스를 더욱 효율적이고 안정적으로 만들 수 있습니다.