1 docker 설치된 ec2 1대 생성되는 CloudFormation을 다운받아 실행한다. 2 # EC2에 로그온한다. # 디렉토리 하나 만들어 시작한다. mkdir docker1 cd docker1 # 앞으로 아래 3개 파일을 만든다. main.py requirements.txt Dockerfile 2 cat < main.py from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/") def read_root(): return {"message": "Hello Docker World!", "status": "running"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) EOF # host="0.0.0.0" 설정 덕분에 도커 컨테이너 외부에서도 접속이 가능한 상태입니다. # 보통 파이썬 웹 프레임워크(Flask, FastAPI 등)를 쓸 때, 파일 끝에 서버를 실행시켜 대기하는 코드(run)가 있어야 한다. # 만약 코드를 수정하고 다시 반영하고 싶다면, 컨테이너를 중지(docker stop)하고 다시 build와 run 과정을 거치면 됩니다 3 # 필요한 어플리케이션 지정 cat < requirements.txt fastapi uvicorn EOF 4 cat < 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"] EOF 5 # 1. 이미지 빌드 docker build -t my-api . # 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 주소 형식: http://<공인IP>:8000 52.79.224.218:8000 9 aws 보안 그룹에서 8000 허용 EC2 > 보안그룹 KOPS-EC2-SG 모든 TCP , Anywhere-IPv4 10 웹 브라우저로 접속 - 아래 Hello 나오면 정상 52.79.224.218:8000 {"message":"Hello Docker World!","status":"running"} ------------------------------------ # 웹 접속 로그 확인해보자. 1 # 도커 CONTAINER ID 확인 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0a1f2689460 my-api "python main.py" 4 minutes ago Up 4 minutes 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp my-api-server c0a1f2689460 2 docker logs -f c0a1f2689460 # 도커 컨테이너 ID 입력 docker logs -f c0a1f2689460 # 웹접속 로그 확인 INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) INFO: 1.232.59.160:60497 - "GET / HTTP/1.1" 200 OK INFO: 1.232.59.160:60497 - "GET /favicon.ico HTTP/1.1" 404 Not Found INFO: 1.232.59.160:42531 - "GET / HTTP/1.1" 200 OK INFO: 1.232.59.160:42531 - "GET /favicon.ico HTTP/1.1" 404 Not Found 컨트롤+ C = 나가기 3 # 도커에 들어가 파일 확인하기 # 위에서 찾은 CONTAINER ID 으로 변경하기 docker exec -it CONTAINER ID /bin/bash docker exec -it c0a1f2689460 /bin/bash # 도커에 로그인했다. root@c0a1f2689460:/app# Dockerfile main.py requirements.txt 4 root@c0a1f2689460:/app# exit exit [root@kops-ec2 ~]# 5 만약 코드를 수정하고 다시 반영하고 싶다면, 컨테이너를 중지(docker stop)하고 다시 build와 run 과정을 거치면 됩니다. [root@kops-ec2 ~]# docker stop c0a1f2689460 c0a1f2689460 [root@kops-ec2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@kops-ec2 ~]# 6 -ec2 ~]# cd docker1/ [root@kops-ec2 docker1]# [root@kops-ec2 docker1]# ls Dockerfile main.py requirements.txt ## 아래 내용으로 수정 return {"message": "homepage 2222 World!", "status": "running"} 7 # 다시 빌드 docker build -t my-api . 8 # 기존 도커 확인 [root@kops-ec2 docker1]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0a1f2689460 48a79109be0c "python main.py" 9 hours ago Exited (0) 3 minutes ago my-api-server 9 # 기존 도커 삭제 docker rm -f my-api-server 10 # 도커 다시 시작 docker run -d -p 8000:8000 --name my-api-server my-api 11 # 내 EC2의 공인 IP 확인하기 [root@kops-ec2 docker1]# curl ifconfig.me 52.79.224.218 # 웹브라우저로 다시 접속하기 52.79.224.218:8000 ------------------- 12 52.79.224.218[root@kops-ec2 docker1]# ls Dockerfile main.py requirements.txt ----------------- # 서비스 포트 변경하기 13 # 내부 포트 확인하기 [root@kops-ec2 docker1]# more main.py from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/") def read_root(): return {"message": "homepage 2222 World!", "status": "running"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) [root@kops-ec2 docker1]# 14 # 80으로 변경하기 docker rm -f my-api-server docker run -d -p 80:8000 --name my-api-server my-api 11 # 내 EC2의 공인 IP 확인하기 curl ifconfig.me [root@kops-ec2 docker1]# curl ifconfig.me 52.79.224.218 12 웹브라우저로 접속하기 52.79.224.218 ------------------ 데이터 엔지니어 실습용으로 가장 간단하지만 실제로 많이 사용하는 형태의 Docker 예제 예시는 Python + Pandas로 CSV 데이터를 읽어서 분석하는 컨테이너입니다. 1 docker-data ├─ Dockerfile ├─ requirements.txt ├─ main.py └─ data.csv 2 [root@kops-ec2 ~]# cd [root@kops-ec2 ~]# mkdir docker-data [root@kops-ec2 ~]# cd docker-data 3 Docke file 생성 cat < Dockerfile FROM python:3.10 WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "main.py"] EOF 4 # requirements.txt 생성 cat < requirements.txt pandas EOF 5 # 데이터 파일 생성 cat < data.csv name,score kim,80 lee,90 park,75 choi,88 EOF 6 # Python 코드 생성 cat < main.py import pandas as pd df = pd.read_csv("data.csv") print("데이터 확인") print(df) print("\\n평균 점수") print(df["score"].mean()) EOF 7 # Docker 이미지 빌드 - 1분 걸려요 docker build -t data-engineer-demo . 8 # 컨테이너 실행 docker run --rm data-engineer-demo [root@kops-ec2 1]# docker run --rm data-engineer-demo 데이터 확인 name score 0 kim 80 1 lee 90 2 park 75 3 choi 88 평균 점수 83.25 ----------------------------- # 웨페이지로 보이도록 Flask 웹서버 Docker 예제로 수정 1 # 디렉터리 생성 mkdir docker-web cd docker-web 2 # Dockerfile 생성 cat < Dockerfile FROM python:3.10 WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "main.py"] EOF 3 # requirements.txt 생성 cat < requirements.txt flask pandas EOF 4 # 데이터 생성 cat < data.csv name,score kim,80 lee,90 park,75 choi,88 EOF 5 # 웹서버 코드 (main.py) cat < main.py from flask import Flask import pandas as pd app = Flask(__name__) @app.route("/") def home(): df = pd.read_csv("data.csv") html = "

데이터 엔지니어 실습

" html += df.to_html() html += "

평균 점수

" html += str(df["score"].mean()) return html app.run(host="0.0.0.0", port=5000) EOF 6 # Docker 이미지 빌드 - 2분 소요됨. docker build -t data-web . 7 # 기존 웹서비스 삭제 [root@kops-ec2 docker-web]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 93f91483af62 data-web "python main.py" 41 seconds ago Created web1 5ee09522d527 my-api "python main.py" 12 minutes ago Up 12 minutes 0.0.0.0:80->8000/tcp, :::80->8000/tcp my-api-server docker rm -f my-api-server docker rm -f web1 # 컨테이너 실행 docker run -d -p 80:5000 --name web1 data-web EC2 80포트 컨테이너 5000포트 8 # 현재 상태 확인 docker ps -a [root@kops-ec2 docker-web]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0c4efde94fe5 data-web "python main.py" 26 seconds ago Up 25 seconds 0.0.0.0:80->5000/tcp, :::80->5000/tcp web1 9 # 접속 테스트 브라우저 접속 http://52.79.224.218 수고하셨습니다.