네이버 부스트캠프 학습 정리/8주차

[AI 서비스 기초] Docker

AI쟁이J 2023. 4. 29. 21:04

가상화란?

개발할 때, 서비스 운영에 사용되는 서버에 직접 들어가 개발하지 않고

Local 환경에서 개발하여 완료 후 배포하는 것.

 

개발을 진행한 Local 환경과 Production 서버의 환경이 다르고, 같은 OS를 사용하더라도 환경 변수에 따라 작동하지 않을 수 있음.

따라서 이런 상황에서 서버 환경까지도 모두 한번에 소프트웨어화 하기 위한 방법이 가상화이다.

특정 소프트웨어 환경을 만들고 Local, Production 서버에서 그대로 활용한다.

- 개발과 운영 서버의 환경 불일치가 해소됌

- 어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있음

- 개발 외에 Research도 동일한 환경을 사용할 수 있음

 

Docker

Container : Docker의 등장 이전, VM(Virtual Machine)이라는 기술에서 실제 물리적인 컴퓨터 위에 OS를 포함한 가상화 소프트웨어를 두는 방식을 사용했다. 여기서 Container라는 기술을 통해 OS 위에 OS를 실행시키는 과정에서 많은 리소스가 사용되는 것을 경량화 할 수 있었다.

이 Container 기술을 쉽게 사용할 수 있는 것이 Docker이다.

 

Docker Image

- 컨테이너를 실행할 때 사용할 수 있는 '템플릿'

- Read Only

 

Docker Container

- 컨테이너를 실행할 때 사용할 수 있는 '템플릿'

- Write 기능

 

Docker를 통해 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있다.

다른 사람이 만든 소프트웨어 : Docker Image

OS, 설정을 포함한 실행 환경이 담겨 있어 어디에서나 동일하게 사용할 수 있다.

Docker를 저장할 수 있는 곳은 Github처럼 Container Registry를 통해 Dockerhub로 관리할 수 있다.

 

 

Docker 예제

도커 실행

docker pull mysql:8을 통해 mysql8 버전의 이미지를 다운

다운받은 MySQL 이미지의 기반으로 Docker Container를 만들고 실행

--name : 컨테이너 이름

-e : 컨테이너의 비밀번호

-d : 데몬(백그라운드) 모드 : 컨테이너를 백그라운드 형태로 실행

-p : 포트 지정

로컬 호스트 : 우리 컴퓨터

컨테이너 : 컨테이너 이미지 내부 

로컬 포트 3306으로 접근 시 컨테이너 포트 3306으로 연결되도록 설정 (mysql은 기본적으로 3306 포트를 통한 통신)

docker exec -it "컨테이너 ID or 이름" \bin\bash

를 통해 컨테이너에 진입. SSH를 통한 가상 서버 진입과 비슷함.

mysql -u root -p를 통해 프로세스로 진입.

 

Docker 기본 명령어 정리

- docker pull "이미지 이름:태그" : 필요한 이미지 다운

- docker images : 다운받은 이미지 목록 확인

- docker run "이미지 이름:태그" : 이미지를 기반으로 컨테이너 생성

- docker ps : 실행중인 컨테이너 목록 확인

- docker exec -t "컨테이너이름(ID)" \bin\bash : 컨테이너에 진입

- docker stop "컨테이너 이름(ID)" : 실행중인 컨테이너 중지

- docker rm "컨테이너 이름(ID)" : 중지된 컨테이너 삭제

 

 

Docker 이미지 만들기 예제

폴더 생성 후 poetry 세팅과 torch 패키지 설치

$ mkdir 02-docker
$ cd 02-docker
$ python -V # python 3.10.6
$ poetry init
$ poetry add torch torchvision

Pytorch example의 코드를 활용.

 

Dockerfile을 만들어 작성

FROM "이미지 이름:태그"

이미지 빌드에 사용할 베이스 이미지를 지정한다.

 

COPY . \app

COPY "로컬 디렉토리(파일)" "컨테이너 내 디렉토리"

컨테이너는 자체적 파일 시스템과 디렉토리를 가지기에 COPY 명령어로 Dockerfile이 존재하는 경로 기준으로 로컬 디렉토리를 컨테이너 내부의 디렉토리로 복사

위 코드는 프로젝트 최상위의 모든 파일을 컨테이너 내부 \app 디렉토리로 복사

 

WORKDIR \app

WORKDIR "컨테이너 내 디렉토리"

Dockerfile의 RUN, CMD, ENTRYPOINT등의 명령어를 실행할 컨테이너 경로 지정. 이 라인 후의 명령어는 컨테이너 내부의 \app에서 실행

 

ENV "환경변수 이름=값"

컨테이너 내 환경변수를 지정. 파이썬 애플리캐이션은 통상적으로 위 값을 지정

 

RUN "실행할 리눅스 명령어"

컨테이너 내에서 리눅스 명령어를 실행

위의 경우 pip install pip와 -r requirements.txt를 실행. 한번에 실행할 명령어가 여러 개인 경우 && \로 이어줌

 

CMD ["실행할 명령어", "인자", ...]

docker run으로 이 이미지를 기반으로 컨테이너를 만들 때, 실행할 명령어.

이 이미지는 실행 즉시 python main.py를 실행하며 CMD는 띄어쓰기를 사용하지 않음

 

docker build -t <빌드할 이미지 이름:태그 이름> "Dockerfile의 경로"

ex) docker build -t 02-docker:latest .

이미지 생성. (빌드)

위 코드의 . 는 현재 폴더에 Dockerfile이 있음을 의미

태그를 미 지정 시 "latest"로 채워지며 이미지 이름과 태그를 저장

 

docker run "이미지 이름:태그"

ex) docker run 02-docker:latest

위에서 만든 이미지가 실행됌.

 

 

Docker 이미지 push

만든 이미지를 Dockerhub에 push 가능. (인터넷에 업로드)

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

계정 생성 후

docker login 명령어로 계정을 CLI에 연동.

 

docker tag "기존 이미지:태그" "새 이미지 이름:태그"

dockerhub에 올릴 이미지 이름을 내 계정 ID/이미지 이름 형태로 만듦

 

docker push "이미지 이름:태그"

이후 docker pull을 통해 어디서나 dockerhub의 이미지를 받을 수 있음.