MlOps에서는 Kubernetes가 다음과 같은 이유로 필요하다.
- Reproducibility : 실행 환경의 일관성 & 독립성
- Job Scheduling : 스케쥴 관리, 병렬 작업 관리, 유휴 자원 관리
- Auto-healing & Auto-scaling : 장애 대응, 트래픽 대응
이를 위해 MLOps에서는 도커와 쿠버네티스 다음과 같은 목적으로 사용한다.
이 중 Containerization이란
- Containerization : 컨테이너화 하는 기술
- Container : 격리된 공간에서 프로세스를 실행시킬 수 있는 기술
이를 사용하기 위해 Docker를 사용한다.
그리고 Kubernetes는 이러한 Docker들을 관리한다.
그렇기에 해당 포스트에서는 먼저 Docker에 대해 다루려고 한다.
Docker의 역할
Bulid Once, Run Anywhere
다른 컴퓨터 혹은 환경에서도 통일된 환경을 제공한다.
도커의 설치 방법(apple silicon)
Rosetta 2를 설치한다.
$ softwareupdate --install-rosetta
해당 링크를 통해 Docker 페이지에 접속한 후 Mac with Apple Chip을 버튼을 통해 다운받는다.
리눅스 명령어 모음
Docker pull
docker image repository부터 Docker image를 가져오는 커맨드
$ docker pull --help
$ docker pull example:tag
Docker images
로컬에 존재하는 docker image 리스트를 출력하는 커맨드
$ docker images --help
$ docker images
Docker ps
현재 실행중인 도커 컨테이너 리스트를 출력하는 커맨드
$ docker ps --help
$ docker ps -a
Docker run
도커 컨테이너를 실행시키는 커맨드
$ docker run -- help
$ docker run -it --name example /bin/bash
-it
: -i
옵션 + -t
옵션
container를 실행시킴과 동시에 interactive한 terminal로 접속시켜주는 옵션
--name
: name
컨테이너 id 대신, 구부하기 쉽도록 지정해주는 이름
/bin/bash
컨테이너를 실행시킴과 동시에 실행할 커맨드로, /bin/bash
는 bash 터미널을 사용
Docker exec
Docker 컨테이너 내부에서 명령을 내리거나, 내부로 접속하는 커맨드
$ docker exec --help
$ docker run -it -d --name example:tag
$ docker ps
-d
: 백그라운드에서 실행시켜, 컨테이너 접속 종료시에도 계속 실행
$ docker exec -it example /bin/bash
container 내부에 접속할 수 있는 것을 확인 가능
Docker logs
도커 컨테이너의 log를 확인하는 커맨드
$ docker logs --help
$ docker logs example -f
-f
: 계속 watch 하며 출력
Docker stop
실행 중인 도커 컨테이너를 중단시키는 커맨드
$ docker stop --help
$ docker stop example
Docker rm
도커 컨테이너를 삭제하는 커맨드
$ docker rm --help
$ docker rm example
Docker rmi
도커 이미지를 삭제하는 커맨드
$ docker rmi --help
$ docker rmi example
FROM
Dockerfile이 base image로 어떠한 이미지를 사용할 것인지를 명시하는 명령어
FROM <image>[:<tag>][AS <name>]
#예시
FROM example
COPY
의 파일 혹은 디렉토리를 경로에 복사하는 명령어
COPY <src>...<dest>
#예시
COPY a.txt /example-directory/b.txt
COPY my-directory /example-directory-2
RUN
명시한 커맨드를 도커 컨테이너에서 실행하는 것을 명시하는 명령어입니다.
RUN <command>
RUN ["executable-command","parameter1","parameter2"]
#예시
RUN pip install torch
RUN pip install -r requirements.txt
CMD
명시한 커맨드를 도커 컨테이너가 시작될 때, 실행하는 것을 명시하는 명령어
하나의 Docker Image에서는 하나의 CMD만 실행될 수 있다는 점이 RUN 명령어와 다름
CMD <command>
CMD ["executable-command","parameter1","parameter2"]
#예시
CMD python main.py
WORKDIR
이후 작성될 명령어를 컨테이너 내의 어떤 디렉토리에서 수행할 것인지를 명시하는 명령어
해당 디렉토리가 없다면 생성합니다.
WORKDIR /path/to/workdir
#예시
WORKDIR /home/example
ENV
컨테이너 내부에서 지속적으로 사용될 environment variable의 값을 설정하는 명령어
ENV <key><value>
ENV <key>=<value>
#예시
# default 언어 설정
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
EXPOSE
컨테이너에서 뚫어줄 포트/프로토콜을 지정할 수 있습니다.
protocol을 지정하지 않으면 TCP가 default로 설정됩니다.
EXPOSE <port>
EXPOSE <port></protocol>
#예시
EXPOSE 8080
vi
혹은 vscode 등 편집기로 dockerfile을 연다.
없을 경우 생성
#예시
cd PG/DB
touch dockerfile
그 후 다음과 같이 작성
#base image를 설정
FROM ubuntu
# apt-get update 명령을 실행한다.
RUN apt-get update
# Docker Container가 시작될 때 "Hello world"를 출력한다.
CMD ["echo","Hello world"]
Docker build from Dockerfile
docker build
명령어로 Dockerfile로부터 Docker image를 만든다.$ docker build --help
# Dockerfile이 있는 경로에서 다음 명령을 실행
$ cd PG/DB
$ docker build -t my-image:v1.0.0 .
.
: 현재 경로에 있는 Dockerfile 로부터이미지 빌드 확인
$ docker image | grep my-image
$ docker run my-image:v1.0.0
# Hello world가 출력되는 것을 확인
Docker hub로 들어가서 회원 가입한다. 그 후
$ docker login
# username, password 입력
# Login Succeeded!
Docker Hub를 바라보도록 tag 생성
$ docker tag my-image:v1.0.0 exmaple/my-image:v1.0.0
# docker tag <image_name>:<tag_name> <user_name>/<image_name>:<tag>
Docker image push to Docker Hub
$ docker push exmaple/my-image:v1.0.0
# docker push <user_name>/<image_name>:<tag>
이처럼 도커에 대해 조굼 알아보았다.
다음으로는 Kubernetes에 대해 알아보려고 한다.