본문 바로가기
dev-setup

[Docker] 서버 배포를 위한 Docker 코드 작성 및 실행

by doraemin_dev 2025. 3. 26.

배포를 위해 Docker를 사용해보자.

간략히 보면, 내 코드를 Images로 만들어서 서버에 올리는 과정이다.
STEP 1 :
내 코드를 어떻게 Images로 만들지에 대한 설명서인 ⇨ Dockerfile 작성
 
STEP 2 :
Dockerfile 기반으로 ⇨ Images를 생성.
해당 이미지를 바탕으로 ⇨ Container 생성 및 실행 ! (이미지가 설계도라면, 컨테이너는 그 설계도로 만든 실제 제품!)
 
* 사실상 끝. 근데 이것을 Hub라는 '인터넷 상의 클라우드 보관소'에 올려서 누구나 사용할 수 있도록 공유하는 과정을 진행할 수 있다. (마치 깃허브에 코드 올려놓는 것 처럼.)
 
STEP 3 : Images를 Docker Hub에 올리기 
* 다른 사람이 이미지를 pull 받아서, Container 실행하면 된다.


STEP 1 : Docker File 생성

Images를 어떻게 만드는지 알려주는, Dockerfile을 만들자.

# 1. 베이스 이미지 설정 (Python + 필요한 패키지)
FROM python:3.10-slim

# 2. 작업 디렉토리 생성
WORKDIR /app

# 3. 필요한 파일 복사
COPY . /app

# 4. 필요한 패키지 설치
RUN pip install --no-cache-dir \
    fastapi \
    uvicorn \
    soundfile \
    numpy \
    pandas \
    tensorflow==2.12 \
    keras==2.12 \
    python-multipart \
    librosa \
    matplotlib \
    pydantic \
    sqlalchemy


# 5. 기본 실행 명령 설정 (웹서버 실행)
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

STEP 2 : Images를 만들고, Images를 담은 container를 실행

2-1 : dockerfile에 적혀있는 데로, Images를 만들라는 명령어 실행

2-2 : 만든 Images를 기반으로, Container 생성하여 실행

 

이미지가 설계도라면, 컨테이너는 그 설계도로 만든 실제 제품!
 Container는 이미지로부터 생성된, 실행을 위한 인스턴스이다.

# 터미널에 입력

# 1. Docker 이미지 만들기 (이미지 이름은 alz-back이라 하자)
docker build -t alz-back .

# (docker login하고, 도커허브아이디/레포지토리이름 형식으로 이미지 만들어줄 수도 있다.
# 이렇게하면 나중에, Docker Hub에 곧바로 올릴 수 있다.
# Docker Hub에 올리려면 도커허브아이디/리포지토리이름 형식으로 태깅이 돼 있어야 하기 때문이다.)
# docker build -t doraemin/alz-backend .


# 2-1. (처음) 컨테이너 실행 (컨테이너 이름은 alz-container라 하자.)
docker run --name alz-container -v "${PWD}:/app" -p 8000:8000 alz-back  
# docker run --name alz-container -v "${PWD}:/app" -p 8000:8000 doraemin/alz-backend

# 2-2. (기존) 컨테이너 다시 시작
# docker start alz-container



# 명령어 참고
# docker run -v ${PWD}:/app alz-back    # -v는 로컬 디렉토리 ↔ 컨테이너 내부 파일 공유용 # 코드나 데이터셋, 결과를 내 PC 폴더와 공유 할 때 사용.
# docker run -p 8000:8000 alz-back      # 웹 서버 (FastAPI, Flask 등)으로 외부 접속 실행 할 때 사용.

더보기

 결과 >

PS C:\Users\LG\Documents\MJU\Activity\Alzheimer_detect\AI_Alzheimer> docker build -t alz-back .
[+] Building 715.9s (10/10) FINISHED                               docker:default
 => [internal] load build definition from dockerfile                         0.1s
 => => transferring dockerfile: 963B                                         0.0s 
 => [internal] load .dockerignore                                            0.0s 
 => => transferring context: 2B                                              0.0s 
 => [internal] load metadata for docker.io/library/python:3.9-slim           4.3s
 => [auth] library/python:pull token for registry-1.docker.io                0.0s
 => [1/4] FROM docker.io/library/python:3.9-slim@sha256:e52ca5f579cc58fed4  24.8s
 => => resolve docker.io/library/python:3.9-slim@sha256:e52ca5f579cc58fed41  0.0s 
 => => sha256:e52ca5f579cc58fed41efcbb55a0ed5dccf6c7a156c 10.41kB / 10.41kB  0.0s 
 => => sha256:246e088f8d9bae1efc1d3f0ab4a800616403520b3aecd 1.75kB / 1.75kB  0.0s 
 => => sha256:bea3dea871787412b8fa17205b317e46dd3f37bdfb195 5.28kB / 5.28kB  0.0s
 => => sha256:6e909acdb790c5a1989d9cfc795fda5a246ad6664bb 28.20MB / 28.20MB  8.7s
 => => sha256:cec49b84de9df5777ee48546b2fd933b7ae87ec6746f4 3.51MB / 3.51MB  2.3s 
 => => sha256:da1cbe0d584f421af08256ce9d3d64b361a433126b7 14.93MB / 14.93MB  7.0s 
 => => sha256:9a95d1744747ce9c4e854b9f5822065468265f57a58dae4d8 249B / 249B  3.3s 
 => => extracting sha256:6e909acdb790c5a1989d9cfc795fda5a246ad6664bb27b5c68  9.2s 
 => => extracting sha256:cec49b84de9df5777ee48546b2fd933b7ae87ec6746f4aa181  1.0s 
 => => extracting sha256:da1cbe0d584f421af08256ce9d3d64b361a433126b700d76ac  4.5s 
 => => extracting sha256:9a95d1744747ce9c4e854b9f5822065468265f57a58dae4d8f  0.0s 
 => [internal] load build context                                          390.1s 
 => => transferring context: 3.32GB                                        389.8s 
 => [2/4] WORKDIR /app                                                       0.8s 
 => [3/4] COPY . /app                                                       16.6s 
 => [4/4] RUN pip install --no-cache-dir     fastapi     uvicorn     soun  263.9s 
 => exporting to image                                                      40.5s 
 => => exporting layers                                                     40.5s 
 => => writing image sha256:c947ad78e010177de89ce825d223be56934dab6efc90f1a  0.0s 
 => => naming to docker.io/library/alz-back                                  0.0s 

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview
  


PS C:\Users\LG\Documents\MJU\Activity\Alzheimer_detect\AI_Alzheimer> docker run -v "${PWD}:/app" -p 8000:8000 alz-back
2025-03-26 08:44:44.014959: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. 
2025-03-26 08:44:44.072046: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.
2025-03-26 08:44:44.352881: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.
2025-03-26 08:44:44.353988: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2025-03-26 08:44:46.004704: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     172.17.0.1:57730 - "GET / HTTP/1.1" 200 OK
INFO:     172.17.0.1:57730 - "GET /favicon.ico HTTP/1.1" 404 Not Found
INFO:     172.17.0.1:57730 - "GET /docs HTTP/1.1" 200 OK
INFO:     172.17.0.1:57730 - "GET /openapi.json HTTP/1.1" 200 OK
INFO:     172.17.0.1:35422 - "POST /signup HTTP/1.1" 200 OK
INFO:     172.17.0.1:35422 - "POST /signup HTTP/1.1" 200 OK
INFO:     172.17.0.1:34846 - "POST /signup HTTP/1.1" 200 OK
INFO:     172.17.0.1:43590 - "GET / HTTP/1.1" 200 OK
INFO:     172.17.0.1:43590 - "GET / HTTP/1.1" 200 OK
INFO:     Shutting down
INFO:     Waiting for application shutdown.
INFO:     Application shutdown complete.
INFO:     Finished server process [1]

 


STEP 3 : Docker Hub에 Image를 올리자

# 1. Docker에 로그인
Docker login

# 2. # 이미 도커허브아이디/리포지토리이름 형식으로 되어 있다면, 이번 2단계 태깅 필요 없다!!
# 리포지토리이름 형식으로만 되어 있다면, 도커허브아이디를 태깅해주자.
# Docker Hub에 올리려면 도커허브아이디/리포지토리이름 형식으로 태깅이 돼 있어야 한다.
# Docker Hub에 올릴 태그 붙이기	(나의 도커 허브 아이디 : doraemin, 리포지토리 이름 : alz-backend)
docker tag alz-back doraemin/alz-backend:latest

# 3. Docker Hub에 푸시	
docker push doraemin/alz-backend:latest

# 4. Docker Hub 계정(doraemin)에 alz-backend라는 리포지토리가 생기고, 다른 사람도 나의 리포지토리를 pull 할 수 있다.
docker pull doraemin/alz-backend:latest

# 5. 실행
docker run -v "${PWD}:/app" -p 8000:8000 doraemin/alz-backend

 

Docker Hub에 업로드 완료!

더보기

결과 > Docker Hub에 업로드 완료

 


추가 STEP : Docker Compose
이미지 빌드부터 컨테이너 실행까지(step2 과정) 자동으로 진행



코드가 변경되어, Docker Hub에 다시 올려야 한다면.

이후 EC2에서 pull 해오면 된다.

# 1.Docker 이미지 만들기
docker build -t doraemin/alz-backend .

# 2. Docker Hub에 푸시	
docker push doraemin/alz-backend:latest

# 실행
# docker run --name alz-container --env-file .env -v "${PWD}:/app" -p 8000:8000  doraemin/alz-backend