Docker #1 Python 실행 컨테이너 만들기 #
#2025-08-01
Background #
- RDE #1 Local PC에서 RDE 환경 구성에서 Harbor registry로부터 RdE Container download를 수행했음
- 아이콘을 클릭해서 RDE 런처를 실행한다.
#
1. 웹 서비스 실행 컨테이너 만들기 #
- /config/workspace/cloud/container/00.container-linux 경로로 이동
cd /config/workspace/cloud/container/00.container-linux
- 디렉토리 구조는?
00.container-linux/
├── Dockerfile // 컨테이너 환경 설정
├── Dockerfile.pytho-slim
├── Dockerfile.ubuntu
├── docker-build.sh
├── docker-push.sh
├── mycode.py
├── fastserver.py
├── webserver.py
└── mydata/
- Dockerfile 내용 확인하기
FROM python:3.11-alpine
RUN apk add --no-cache bash curl gcc musl-dev linux-headers jq
# FastAPI 및 기타 라이브러리 설치
RUN pip install fastapi uvicorn psutil python-multipart VOLUME ["/mycode"]
#COPY mycode.py /mycode/mycode.py
COPY webserver.py /mycode/webserver.py
CMD ["sh","-c", "echo 'start server' && sleep infinity"]
내용은?
- Alpine 리눅스를 기반으로 Python 3.11 환경 사용
- Python 빌드에 필요한 기본 패키지 설치 (bash, curl, gcc, musl-dev, linux-headers, jq)
- Python 패키지 설치 (fastapi uvicorn psutil python-multipart) 그리고 “/mycode"를 볼륨으로 지정.
- webserver.py를 컨테이너 내 디렉토리 /mycode 아래에 복사하기 (-> 컨테이너가 종료되더라도 그대로 남아있게)
- 웹 서버를 무한 대기 상태로 유지 (컨테이너가 실행되었을 때 바로 종료되지 않고 계속 살아있도록)
#
2. Docker 이미지 빌드 #
# docker image 빌드
docker build --tag container-linux:1.0 .
# container와 공유하기 위한 디렉토리 만들기
mkdir mydata
cd mydata
# docker 실행
sudo docker run -d --name my-first-container --network bridge -p 8888:8080 container-linux:1.0
# 실행되고있는 컨테이너 확인
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94f92313eb56 localhost/container-linux:1.0 sh c echo 'start... 3 hours ago Up 3 hours ago my-first-container
#
3. mydata에 webserver.py 복사 후 실행 #
- 현재 파일 구조
00.container-linux/
├── Dockerfile
├── Dockerfile.pytho-slim
├── Dockerfile.ubuntu
├── docker-build.sh
├── docker-push.sh
├── mycode.py
├── fastserver.py
├── webserver.py
└── mydata/ // 생성된 디렉토리
└── (empty)
pwd
>> /config/workspace/cloud/container/00.container-linux/mydata
내부 확인해보면?
ls
>>
비어있음.
- 다른 터미널 열어서 복사해주고 확인
cp webserver.py ./mydata
pwd
>> /config/workspace/cloud/container/00.container-linux/mydata
ls
>> webserver.py
- 수행후 파일 구조
00.container-linux/
├── Dockerfile
├── Dockerfile.pytho-slim
├── Dockerfile.ubuntu
├── docker-build.sh
├── docker-push.sh
├── mycode.py
├── fastserver.py
├── webserver.py
└── mydata/
└── webserver.py // 파일 복사됨
- webserver.py 수행
cd ..
python /mycode/webserver.py
하면 “http://localhost:8888/login"에서 welcome page가 뜬다.
#
4. 컨테이너를 실행 즉시 webserver가 되도록 해보자 #
- Dockerfile 내용 수정
FROM python:3.11-alpine
RUN apk add --no-cache bash curl gcc musl-dev linux-headers jq
# FastAPI 및 기타 라이브러리 설치
RUN pip install fastapi uvicorn psutil python-multipart
VOLUME ["/mycode"]
#COPY mycode.py /mycode/mycode.py
COPY webserver.py /mycode/webserver.py
#CMD ["sh", "-c", "echo 'start server' && sleep infinity"]
CMD ["python", "/mycode/webserver.py"]
컨테이너가 실행되면 FastAPI 서버가 자동으로 실행되게함
- 컨테이너 실행
# docker image 빌드
docker build --tag container-linux:1.1 .
# container와 공유하기 위한 디렉토리 만들기
mkdir mydata
cd mydata
# docker 실행
sudo docker run -d --name my-first-container --network bridge -p 8888:8080 container-linux:1.1
# 실행되고있는 컨테이너 확인
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94f92313eb56 localhost/container-linux:1.0 sh c echo 'start... 3 hours ago Up 3 hours ago my-first-container
하면 “http://localhost:8888/login"에서 welcome page가 뜬다.
- 아까랑 다른점?
아까는 python /mycode/webserver.py
해야 떴는데 이제는 바로뜬다는 차이가있음.
#
5. 의문점 정리 #
- RDE 아이콘 클릭하는것의 의미는?
RDE 런처를 수행하면 사전에 정의된 Docker 컨테이너를 자동으로 구동한다. 이 컨테이너는 실습에 필요한 파일, 디렉토리, 개발 환경 설정, 코드 파일, 그리고 VS Code 서버를 포함한 완성된 개발 환경이 포함된 이미지로 구성되어있음.
- /config/workspace/cloud/container/00.container-linux와 같은 경로에 접근 가능한 이유는?
컨테이너 이미지 안에 이미 내장되어 있어서 컨테이너가 실행됨과 동시에 해당 경로가 자동으로 구성된다.
즉 디렉토리를 다운로드했다는 개념보다는 컨테이너 실행과 동시에 그 안에 포함된 실습 디렉토리가 자동 마운트되었다고 이해하는 것이 더 정확하다.
- 볼륨으로 지정?
Docker 컨테이너는 기본적으로 임시 환경이기 때문에, 컨테이너 내부에서 생성한 파일이나 수정한 내용은 컨테이너가 삭제되면 모두 함께 사라진다. 하지만 VOLUME 명령을 통해 지정된 경로는 영속적인 볼륨으로 연결되며, 컨테이너가 삭제되어도 해당 경로에 저장된 데이터는 유지된다.
“/mycode"를 볼륨으로 지정하고 컨테이너 내부에서 /mycode 경로에 파일을 생성하거나 수정하면 그 경로가 호스트 시스템의 익명 볼륨에 저장되기 때문에 컨테이너가 종료되더라도 그대로 남아 있게 된다.