[MLOps] Docker

Jonie Kwon·2022년 6월 25일
0

MLOps의 필요성

실행 환경의 일관성 & 독립성
스케줄 관리, 병렬작업관리, 유휴자원관리
장애 대응, 트래픽 대응

Docker

"Build Once, Run Anywhere"
컨테이너화 기술(Containerization) : 격리된 공간에서 프로세스를 실행시킬 수 있는 기술

컨테이너형 가상화를 구현하기 위한 상주 애플리케이션과 이를 관리하는 명령형 도구로 구성된다.

  • 컨테이너형 가상화 기술
    컨테이너형 가상화를 사용하면 가상화 소프트웨어 없이도 운형 체제의 리소스를 격리해 가상 운영 체제로 만들 수 있다. 이 가상 운영 체제를 컨테이너라고 한다. 컨테이너를 만들면서 발생하는 오버헤드는 다른 가상화 소프트웨어보다 더 적다. 빠르게 시작 및 종료할 수 있고 이에 들어가는 리소스도 작은편이다.

Docker 설치

  • apt 패키지 매니저 업데이트
$sudo apt-get update
  • prerequisite package
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
  • Install Docker Engine
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
  • Docker의 GPG key를 추가
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o
/usr/share/keyrings/docker-archive-keyring.gpg
  • stable버전의 repository를 바라보도록 설정
$ echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] http
s://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /de
v/null
  • 설치 확인
$ sudo docker run hello-world

Docker 권한 설정

$ sudo usermod -a -G docker $USER
$ sudo service docker restart

Docker의 기본 명령어

Docker pull

  • docker image repository부터 Docker image를 가져옴
$ docker pull ubuntu:20.04

Docker images

  • 로컬에 존재하는 docker image 리스트를 출력
$ docker images

Docker ps

  • 현재 실행중인 도커 컨테이너 리스트 출력
$ docker ps
$ docker ps -a

Docker run

  • 도커 컨테이너 실행
$ docker run

Docker exec

  • 도커 컨테이너 내부에서 명령을 내리거나, 내부로 접속
$ docker exec

Docker logs

  • 도커 컨테이너의 log를 확인
$ docker logs

Docker stop

  • 실행 중인 도커 컨테이너를 중단
$ docker stop

Docker rm

  • 도커 컨테이너 삭제
$ docker rm

Docker rmi

  • 도커 이미지 삭제
$ docker rmi

명령어 옵션

  • -it : -i 옵션 + -t 옵션
    - 컨테이너를 실행시킴과 동시에 interactive한 terminal로 접속시켜주는 옵션
  • --name : 컨테이너 id대신 구분하기 쉽도록 이름 지정
  • /bin/bash : 컨테이너를 실행시킴과 동시에 실행할 커맨드. /bin/bash는 bash 터미널을 사용하는 것을 의미
  • -d : 백그라운드에서 실행시켜서 컨테이너에 접속 종료하더라도 계속 실행중이 되도록 함
  • -f : 계속 watch 하며 출력





Docker Image

Docker Image : 어떤 애플리케이션에 대해서 코드 뿐만이 아니라 dependent한 모든 것들을 함께 패키징한 데이터
Dockerfile : 사용자가 도커 이미지를 쉽게 만들 수 있도록 제공하는 템플릿

Dockerfile 만들기

FROM

  • Dockerfile이 base image로 어떠한 이미지를 사용할 것인지 명시하는 명령어
FROM <image>[:<tag>] [AS <name>]

# 예시
FROM ubuntu
FROM ubuntu:18.04
FROM nginx:latest AS ngx

COPY

  • <src> 의 파일 혹은 디렉토리를 <dest> 경로에 복사하는 명령어
COPY <src>... <dest>
# 예시
COPY a.txt /some-directory/b.txt
COPY my-directory /some-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 ["parameter1", "parameter2"] # ENTRYPOINT 와 함께 사용될 때
# 예시
CMD python main.py
CMD

WORKDIR

  • 이후 작성될 명령어를 컨테이너 내의 어떤 디렉토리에서 수행할 것인지를 명시
  • 해당 디렉토리가 없으면 생성함
WORKDIR /path/to/workdir
# 예시
WORKDIR /home/demo

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

EXPOS

  • 컨테이너에서 사용할 포트/프로토콜 지정 (지정하지 않으면 TCP가 디폴트로 설정됨)
EXPOSE <port>
EXPOSE <port>/<protocol>
# 예시
EXPOSE 8080
***
profile
메모하는 습관

0개의 댓글