간략히 보면, 내 코드를 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