Docker 실습 - Container
참고강의: 10개 프로젝트로 한 번에 끝내는 MLOps 파이프라인 구현 초격차 패키지 Online.
이전시간에 docker의 기본적인 사용법에 대해 알아봤고, 이번엔 두 번의 실습을 진행하도록 하겠다.
[실습 목차]
- Nginx기반 서버 컨테이너 생성 및 실습
- Scikit-learn으로 모델 학습 컨테이너 생성 및 실습
0. Docker Hub란?
Docker Container를 실행시키는 방법은
- 직접 Dockerfile을 만들어서 Docker Image를 생성하는 법
- Docker Hub를 통해서 Container를 생성하는 법
이 있다.
이번에는 직접 Docker Image를 생성하지 않고 Docker Hub를 통해서 Container를 실행시키는 법을 알아보자.
Docker Hub 주소 : https://hub.docker.com/explore
[Docker Hub]
Docker Hub에서 'tensorfolw'를 검색한 Docker Image 정보이다.
상단의 tensorflow/tensorflow를 선택하면
이렇게 해당 Image의 상세 정보를 확인 할 수 있다.
docker search tensorflow 명령어를 활용하면
이렇게 docker hub에서 조회된 데이터와 동일한 데이터가 보임을 확인 할 수 있다.
1-1. Nginx기반 서버 컨테이너 생성 및 실습
docker를 생성할 폴더 생성 (사전준비)
폴더명은 server_docker_container라고 해줬다.
1. nginx 서버 설치
가장 상위의 official build of Nginx.를 설치 할 것이다.
(base) ysb@ysbtmp docker_exmaple % docker pull nginx
- docker pull nginx : docker hub에 있는 nginx라는 이름의 docker Image를 가져온다.
위처럼 pull이 되는 것을 확인 할 수 있다.
- docker images : 현재 생성된 Images 확인
❗️나의 경우는 docker pull nginx 명령어를 사용했을 때 error는 발생하지 않지만 docker images 명령어를 쳤을 때 해당 Image가 보이지 않는 현상이 있었다.
캐시문제가 있었던 것인지 다음 명령어를 쳐서 캐시를 지운 후 다시 수행했더니 이번엔 제대로 pull이 되었다.
docker system prune -a docker restart
Docker Desktop에서도 생성된 Image를 확인할 수 있다.
2. Docker Container 실행
docker run -it -d -p 8001:80 --name nginxserver nginx:latest &
- -p 8001:80 : 8001:80번의 포트번호 사용
- --name nginxserver : nginxserver라는 Container이름을 설정
- nginx:latest : nginx라는 Image의 최신버전을 사용
- & : 백그라운드로 실행
done 되었음을 확인하자.
- docker ps : 실행중인 docker 정보 확인
우리가 실행했던 nginxserver이름의 Container가 잘 실행중인 것을 확인 할 수 있다.
3. nginx server 정상동작 확인
url : localhost:8001
curl 명령어로 확인
동일한 html이 나오는 것을 확인 할 수 있다.
그렇다면 이때 Docker Desktop에서는 실행중인 Container의 상태는 어떻게 나타날까?
상태값이 Running으로 되어있다.
만약 해당 Container의 실행을 중지 시킨다면?
docker stop [CONTAINER ID]
curl을 날려봤을 때 서버연결에 실패한 것이 보인다.
웹페이지에서도 서버 연결이 끊긴 것이 확인된다.
Docker Desktop에서도 상태값이 Running -> Exited 로 변경 된 것을 확인 할 수 있다.
서버 재실행
이미 Container가 만들어졌기 때문에 이전과 동일하게 해당 Container를 start 시켜주면 된다.
docker start [CONTAINER NAME]
서버 동작 확인
1-2. Nginx 서버의 index.html 수정하기
밋밋한 index.html을 변경해보자!
- 실행한 Container에 접속해서 index.html을 수정하기
- terminal에서 직접 local에 있는 html파일을 nginx의 index.html과 바꾸기
위와 같은 두 방법을 실습해 볼 것이다.
방법1) 실행한 Container에 접속해서 index.html을 수정
docker exec -it [CONTAINER ID] bash
- docker exec -it [CONTAINER ID] : 해당 Container에 접속
- bash : bash 명령어로 접속하겠다.
root@[CONTAINER ID]로 변경되면서 해당 Container에 접속한 것이 보인다.
1. index.html이 있는 경로까지 이동하기
cd /usr/share/nginx/html/
index.html 확인
2. index.html 수정
echo "merona99' nginx server!" > index.html
- echo "[COMMENT]" > index.html : COMMENT를 index.html에 출력해라.
cat 명령어로 출력해봤을 때 수정한 값으로 변경된 것을 확인 할 수 있다.
웹페이지에서도 수정한대로 잘 나오는 것을 확인 할 수 있다.
3. Docker에서 나오기
exit
방법2) terminal에서 직접 local에 있는 html파일을 nginx의 index.html과 바꾸기
기존 경로로 이동
해당 경로에 index.html 생성
vim index.html
local에 위의 내용으로 새로운 index.html을 생성한다.
Local -> Docker 파일 전송
docker cp [FILE] [CONTAINER NAME]:[docker내 이동할 이동경로]
- cp : copy(복사)하는 명령어
Successfully라는 글귀가 보이면 전송이 성공한 것이다.
웹 페이지에서도 바뀐 html로 잘 반영되서 보인다.
2-1. Scikit-learn으로 모델 학습 컨테이너 생성 및 실습
이번에는 두 번째 실습이다.
Docker에서 실행할 때 자동으로 Scikit-learn을 기반으로 모델을 학습하고 그 결과를 출력하는 Docker Conatiner를 만들어 보겠다.
실습경로
(base) ysb@ysbtmp docker_exmaple % mkdir scikitlearndocker
(base) ysb@ysbtmp docker_exmaple % cd scikitlearndocker
1. Dockerfile 생성
vim Dockerfile
이전까지 절차와 동일하게 Dockerfile을 만들어준다.
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r ./requirements.txt
COPY model_learn.py /app/
CMD ["python", "./model_learn.py"]
- FROM python:3.8-slim : python 3.8 버전 설치
- WORKDIR /app : 디렉토리를 /app으로 설정
- COPY requirements.txt /app/ : LOCAL경로에 있는 requirements.txt파일을 docker의 /app/경로로 옮김
- RUN pip install xxx : 해당 내역을 설치
- COPY model_learn.py /app/ : LOCAL경로에 있는 model_learn.py파일을 docker의 /app/경로로 옮김
- CMD [xx] : xx에 해당하는 커맨드 실행
이제 필요한 스크립드를 작성해보자.
2. requirements.txt 작성하기
vim requirements.txt
3개의 파일이 필요함을 명시해 두었다.
// 오타가 있다. scikit-lean -> scikit-learn 수정 후 진행
3. model_learn.py 작성하기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# 데이터셋 로드
data_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']
data = pd.read_csv(data_url, names=columns)
print(data.head())
# 데이터 전처리
X = data.drop('class', axis=1)
y = data['class']
# 훈련 및 테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 모델 학습
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
# 모델 평가
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
심플한 모델로 작성해줬다.
4. Docker Image 생성
docker build -t [실행 할 Docker Image Name] .
생성된 Image를 확인 할 수 있다.
5. Container 생성
docker run --name [CONTAINER NAME] [IMAGE NAME]
// 중간에 model_learn.py를 잘못 작성해서 Docker Image를 scikitlearn_modellearn2로 다시 만들어서 진행했다.
따라하시는 분들은 scikitlearn_modellearn으로 지었던 Image 이름을 그대로 적어서 진행하면 된다.
Docker를 실행했을 때, 모델을 학습하는 python코드가 돌아가며 결과를 출력해주는 것이 보인다.
이런식으로
데이터 전처리하는 container, 모델학습하는 container, 모델 평가하는 container, 모델 서빙하는 container, 해석가능성 검토하는 container 등등.. 을 작성 후
CI/CD 툴과 workflow management같은 툴을 사용해서 mlops를 잘 구축해 볼 수 있을것이다!
2-2. Docker Hub에 모델 저장 후 다운받아서 재사용하는 실습
우리가 아까전에 만들었던 scikitlearn_modellearn이라는 Image를 Dockerhub에 저장해보겠다.
여기서 주의할 점은 개인계정의 docker Hub에 저장하려면 해당 Image이름을 변경해주어야 한다.
1. Docker Image 이름 변경
docker tag [DOCKER IMAGE NAME:latest] [USERNAME]/[DOCKER IMAGE NAME:latest]
- USERNAME : Docker Hub의 사용자 계정 ID
- tag [DOCKER IMAGE NAME:latest] : Docker Hub에 올릴 Docker Image 이름
- 마지막의 [DOCKER IMAGE NAME:latest] : 설정할 Docker Image 이름
나의 경우는 scikitlearn_modellearn2:latest 이라는 Docker Image를 scikitlearn_modellearn:latest라는 이름으로 변경했다.
2. Dockerhub에 Image 올리기
docker push [DOCKER IMAGE NAME]
merona99/scikitlearn_modellearn 이라는 Docker Image를 개인 Docker Hub에 올렸다.
Docker Hub의 나의 repository에 잘 올라가 있는 것이 보인다.
3. dockerhub에 올린 Image를 다운받아 Docker에서 재실행하기
Docker Image를 다운 받기 위해서 Dockerhub에 접속 후 선택한 Image를 pull하면 된다.
명령어는 빨간표시에 적힌 코드를 이전처럼 terminal에 입력하면 된다.
docker pull [DOCKER IMAGE NAME:TAG]
성공적으로 Image가 다운받아진 것을 확인했다.
해당 docker를 실행시켜보면 이전과 동일한 출력값이 나오는 것을 확인 할 수 있다.
이렇게 docker를 활용하면 나는 그저 image만 다운로드 받고 실행했을 뿐인데,
다른 환경셋팅이나 코드를 옮기지 않고도 단 몇 초만에 모델을 학습하고 출력할 수 있게됬다.
pipline을 구축할 때 하나하나의 컴포넌트가 다 이러한 docker Container로 이루어져 있다.
하이퍼파라미터를 input값으로 조정하는 등의 모델튜닝으로도 활용할 수 있다.
// 무언가 이것저것 해본것 같지만 두루뭉실하게 있던 개념이 docker 공부를 하면서 좀 더 명확하게 잡힌 느낌이다.
'AI > MLOps' 카테고리의 다른 글
[Workflow] Workflow Management 이론 (0) | 2024.11.15 |
---|---|
[쿠버네티스] Orchestrator 실습 (0) | 2024.11.14 |
[쿠버네티스] Orchestarator 이론 (0) | 2024.11.11 |
[Docker] Docker 설치 및 기본 명령어 (0) | 2024.11.08 |
[MLOps 파이프라인 구현] MLOps란? (0) | 2024.10.30 |
댓글