1 [root@kops-ec2 docker1]# ls Dockerfile main.py requirements.txt 2 [root@kops-ec2 docker1]# more main.py from fastapi import FastAPI import uvicorn # 서버 실행을 위해 import app = FastAPI() @app.get("/") def read_root(): return {"message": "Hello Docker World!", "status": "running"} # [중요] 이 부분이 있어야 파일 실행 시 서버가 켜집니다. if __name__ == "__main__": # host="0.0.0.0"은 외부(컨테이너 밖)에서 접속을 허용한다는 뜻입니다. uvicorn.run(app, host="0.0.0.0", port=8000) [root@kops-ec2 docker1]# 웹 서버(Server)는 계속 켜져서 요청을 기다려야 하는데, 지금 작성하신 main.py는 코드를 한 번 쭉 읽고 "할 일 끝!" 하고 퇴근해버린 상황입니다. 보통 파이썬 웹 프레임워크(Flask, FastAPI 등)를 쓸 때, 파일 끝에 서버를 실행시켜 대기하는 코드(run)가 없으면 이런 현상이 발생합니다. 3 [root@kops-ec2 docker1]# ls Dockerfile main.py requirements.txt [root@kops-ec2 docker1]# more requirements.txt fastapi uvicorn [root@kops-ec2 docker1]# 4 [root@kops-ec2 docker1]# more Dockerfile # 1. 가볍고 빠른 파이썬 공식 이미지를 기반으로 시작합니다. FROM python:3.9-slim # 2. 컨테이너 내부의 작업 디렉토리를 설정합니다. WORKDIR /app # 3. 라이브러리 설치를 위해 파일을 복사합니다. COPY requirements.txt . # 4. 종속 라이브러리들을 설치합니다. RUN pip install --no-cache-dir -r requirements.txt # 5. [중요] 호스트의 모든 파일(main.py 포함)을 컨테이너 내부(/app)로 복사합니다. COPY . . # 6. 파일 이름이 main.py이므로 명령어도 main.py로 변경해야 합니다. CMD ["python", "main.py"] 5 # 1. 이미지 빌드 docker build -t my-api . # 2. 기존 죽은 컨테이너 정리 docker rm my-api-server # 3. 실행 docker run -d -p 8000:8000 --name my-api-server my-api # 4. 상태 확인 (이제 Up 상태가 유지되어야 합니다!) docker ps 6 이제 docker ps 목록에 Up이라고 뜨고, curl localhost:8000을 입력하면 Hello Docker World! 메시지가 보일 것입니다. 확인해 보시겠어요? 7 curl -s ifconfig.me 8 curl -s ifconfig.me 주소 형식: http://<공인IP>:8000 9 aws 보안 그룹에서 8000 허용 10 웹 브라우저로 접속