Docker는 경량의 OS 수준 가상화에서 애플리케이션을 개발, 배포 및 관리하기 위한 무료 오픈 소스 솔루션입니다. 이 가이드에서는 Python 애플리케이션을 Docker 컨테이너 내에 생성하는 방법을 보여줍니다.
전제 조건
이 가이드에 소개된 단계를 수행하려면 다음 구성 요소가 필요합니다.
-
리눅스 시스템. 다음을 확인해 보세요: configuring your own Ubuntu VPS on CloudSigma.
-
최신 버전의 Docker가 설치 및 구성되어 있어야 합니다. 다음에 대해 자세히 알아보세요: installing Docker on Ubuntu.
Docker 컨테이너
동일한 환경 내에서 여러 프로그램을 실행할 때, 문제가 발생할 수 있으며 실제로 발생합니다. 프로그램을 더 많이 추가할수록 환경은 더 불안정해집니다. 일반적인 사용자에게는 큰 문제가 아닐 수 있습니다. 하지만 미션 크리티컬한 애플리케이션의 경우 심각한 결과를 초래할 수 있습니다.
시스템에 더 많은 애플리케이션이 도입될수록 공격 표면이 커집니다. 단 하나의 애플리케이션만 침해당해도 전체 시스템이 쉽게 무너질 수 있습니다.
이러한 문제를 해결하기 위해 소프트웨어 수준의 샌드박싱을 위한 Docker 컨테이너를 사용할 수 있습니다.
-
컨테이너 내의 애플리케이션은 파일에 대한 액세스가 제한됩니다.
-
컨테이너화된 애플리케이션은 시스템에서 실행 중인 다른 프로세스를 볼 수 없습니다.
-
컨테이너에 특정 양의 하드웨어 리소스를 할당할 수 있습니다.
-
컨테이너의 네트워크 포트는 외부에 노출되지 않습니다.
-
로컬 및 프로덕션 환경 전반에서 거의 모든 것을 일관되게 패키징할 수 있습니다.
이를 실습하기 위해 Docker 컨테이너 내에 간단한 Python 서버를 구축하고, 컨테이너를 이미지로 변환한 다음, 가상의 프로덕션 환경에 해당 이미지를 배포해 보겠습니다.
1단계 – 파일 시스템 구성
프로젝트를 호스팅하기 위해 먼저 전용 디렉터리를 생성합니다.
|
1 |
mkdir -pv python-server-container/ |
|
1 |
cd !$ |
디렉터리 내에 하위 디렉터리 src 를 생성하여 코드를 저장합니다:
|
1 |
mkdir -pv src/ |
2단계 – Python 서버 구축
이 단계에서는 Python으로 간단한 HTTP 서버를 생성합니다. 다음 파일을 생성합니다. server.py:
|
1 |
touch server.py |
텍스트 편집기에서 파일을 엽니다:
|
1 |
nano server.py |

다음 Python 코드를 입력합니다:
|
1 2 3 4 5 6 7 8 9 10 11 |
from http.server import HTTPServer, SimpleHTTPRequestHandler def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler): """server entrypoint""" server_address = ("0.0.0.0", 8080) httpd = server_class(server_address, handler_class) print("starting server...") httpd.serve_forever() if __name__ == "__main__": run() |

여기서,
-
우리는 프로그램을 단순하게 유지하기 위해 HTTPServer 클래스를 사용하고 표준 Python 라이브러리에서 핸들러를 요청합니다.
-
run 함수는 다음의 인스턴스를 시작합니다: HTTPserver.
-
의 인수 server_address가 나타내듯이, 서버는 8080 포트에서 들어오는 모든 연결을 수신 대기합니다.
이제 서버가 예상대로 작동하는지 확인하겠습니다. 서버를 실행합니다:
|
1 |
python3 server.py |
![]()
새 터미널에서 curl 을 사용하여 서버에 요청을 보낼 수 있습니다:
|
1 |
curl -iv localhost:8080 |

또는 웹 브라우저에서 다음 링크에 접속할 수도 있습니다:
|
1 |
http://localhost:8080 |
3단계 – Dockerfile 생성
A Dockerfile 은 Docker 이미지를 생성하는 데 필요한 지침을 포함하고 있습니다. 파일의 지침은 순차적으로 실행됩니다. 다음에 대해 자세히 알아보세요: Dockerfile.
우리 프로젝트를 위한 새로운 Dockerfile 을 생성합니다:
|
1 |
touch Dockerfile |
이제 필요한 코드를 입력하겠습니다. 텍스트 편집기에서 파일을 엽니다:
|
1 |
nano Dockerfile |
다음 코드를 입력합니다:
|
1 2 3 4 5 6 7 8 9 |
FROM python:latest ENV SRC_DIR /usr/bin/src/test_server/src COPY src/* ${SRC_DIR}/ WORKDIR ${SRC_DIR} ENV PYTHONUNBUFFERED=1 CMD ["python", "server.py"] |
여기서,
-
모든 Dockerfile 은(는) 반드시 FROM 지시어로 시작해야 합니다. 이 예제에서는 Python을 Docker 이미지의 베이스로 선언하고 있습니다.
-
The ENV SRC_DIR 지시어는 컨테이너 디렉터리의 위치를 지정합니다.
-
The COPY 지시어는 현재 Python 서버가 있는 src 디렉터리에서 파일을 복사합니다.
-
변수 PYTHONBUFFERED=1 은(는) Python이 출력과 로그를 STDOUT에 직접 출력하도록 지정합니다. 그렇지 않으면 로그가 버퍼로 전송되지 않습니다.
-
The CMD 지시어는 컨테이너를 실행할 때 실행할 기본 명령을 지정합니다. 이 경우, 이 지시어를 사용하여 Python 서버를 시작합니다.
4단계 – Docker 이미지 생성
With the Dockerfile이(가) 준비되었으므로 이제 이미지를 빌드할 수 있습니다. 다음 Docker 명령을 실행하여 프로세스를 시작합니다:
|
1 |
docker build . -t python_server |

여기서,
-
The -t 플래그는 Docker 이미지의 태그를 python_server.
-
로 지정하는 데 사용됩니다. Docker는 필요한 모든 구성 요소를 다운로드하고 이를 하나의 이미지로 결합합니다.
5단계 – 이미지 실행
이미지가 배포할 준비가 되었습니다. 다음 명령을 사용하여 실행할 수 있습니다:
|
1 |
docker run -p 8080:8080 python_server |

여기서는 -p 플래그를 사용하여 로컬 머신의 8080 포트를 Docker 이미지로 포워딩하고 있습니다.
서버가 정상적으로 작동하는지 다음을 사용하여 쉽게 확인할 수 있습니다: curl:
|
1 |
curl -iv localhost:8080 |
6단계 – 서버 종료
터미널에서 “Ctrl + C”를 눌러 Docker 프로세스를 종료합니다:

7단계 – Docker 이미지 내보내기 및 가져오기
이제 Python 서버를 호스팅하는 작동 가능한 Docker 이미지가 준비되었습니다. Docker의 내보내기 및 가져오기 기능을 사용하여 이를 다른 시스템으로 마이그레이션할 수 있습니다.
먼저, 현재 시스템의 Docker 이미지 목록을 확인합니다:
|
1 |
docker images |

대상은 방금 생성한 python_server Docker 이미지입니다. 다음 명령은 이를 TAR 아카이브로 내보냅니다:
|
1 |
docker save python_server:latest > python_server.tar |

After transferring the python_server.tar 파일을 대상 머신으로 전송한 후, 다음 명령을 사용하여 Docker 이미지를 가져옵니다:
|
1 |
docker load < python_server.tar |
마치며
이 가이드에서는 Python 애플리케이션으로 Docker 이미지를 빌드하는 방법을 살펴보았습니다. 간단한 Python 웹 서버를 만들고 이를 기반으로 Docker 이미지를 빌드했습니다. 이제 이 Docker 이미지를 어떤 환경에나 배포하여 일관된 동작을 기대할 수 있습니다.
Docker에 대해 더 자세히 알고 싶으신가요? 다음 가이드를 확인해 보세요:
즐거운 컴퓨팅 되세요!




댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.