[Docker] 입문

hyunsooo·2022년 11월 11일
0

Docker 소개

가상화란?

도커에 대해 알기 전에 먼저 가상화라는 개념을 알아야 한다.
개발할 때 서비스 운영에 사용되는 서버에서 직접 개발하지 않는다. local 환경에서 개발하고 완료되면 Staging 서버, Production 서버에 배포하게 된다.
개발을 진행한 local환경과 Production 서버 환경이 다르게 되면 라이브러리나 파이썬 등을 설치할 때 다르게 진행해야 한다.
local과 production이 같은 OS를 사용해도 올바르게 작동하지 않을 수 있는데 환경 변수의 차이나 권한문제와 같은 여러가지 문제가 생길 수 있다.
다양한 설정을 README등에 기록하고 항상 실행하도록 하는 방법을 사용하기도 하는데 사람이 진행하는 일이라 Human Error가 발생할 수 있으며 과정이 다소 귀찮을 수 있다. 특히 운영하는 서버가 많아질수록 모든 서버에도 적용해야 하는 일을 진행해야 한다.
위와 같은 상황에서 서버 환경까지도 모두 한번에 소프트웨어화 할 수 없을까라는 생각이 가상화의 시작이 된다.

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

  • 개발(Local)과 운영(Production) 서버의 환경 불일치가 해소
  • 어느 환경에서나 동일한 환경으로 프로그램을 생성할 수 있음
  • 개발 외에 Research도 동일한 환경을 사용할 수 있음

Docker 등정 전에는 가상화 기술 중 주로 VM(Virtual Machine)을 사용했다.
VM은 호스트 머신이라고 하는 실제 물리적인 컴퓨터 위에 OS를 포함한 가상화 소프트웨어를 두는 방식이다.
ex) 호스트 머신은 window인데 window에서 linux를 싱행

GCP의 Compute Engine 또는 AWS의 EC2가 이런 개념을 활용한 사례이다. 즉 클라우드 회사에서 미리 만든 이미지를 바탕으로 사용자에게 동일한 환경을 제공하는 방식이다.
그러나 OS위에 OS를 하나 더 실행시키는 점에서 VM은 굉장한 리소스를 사용하게 된다.
이 때 나온 기술이 Container이며 VM의 무거움을 덜어주며 가상화를 조금 더 경량화된 프로세스의 개념으로 만든 기술이다.

Container기술을 쉽게 사용할 수 있도록 나온 도구가 Docker이며 컨테이너에 기반한 개발과 운영이 빠르게 확장되고 있다.

Docker

PC방에서 특정 게임만 설치하고 고객이 다른 프로그램을 설치해도 재부팅후에는 항상 초기 설정 형태로 다시 복구되는 경험을 해본적이 있다. 이 경험을 Docker로 빗대어 표현하자면 Docker image로 초기형태를 만들어 두고 재부팅 시 해당 image의 상태로 실행하는 작업을 할 수 있다.

Docker Image

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

  • Read Only

Docker Container

  • Docker Image를 활용해 실행된 인스턴스

  • Write 가능

Docker로 할 수 있는 일

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

  • 다른 사람이 만든 소프트웨어(Docker Image)

  • Image는 OS, 설정을 포함한 실행 환경이 포함되기 때문에 어느 OS에서도 실행이 가능하다.

  • 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있다.

  • 현업에서 원격 저장소(Container Registry)에 이미지를 업로드하고 서버에 받아서 실행하는 식으로 진행할 수 있다.

Docker 실습

MySQL 실행하기

  • docker pull mysql:8 : mysql 8버전의 이미지를 다운 (container registry에서 다른 사람이 올려놓은 소프트웨어 가져오기)

  • docker images : 내가 가지고 있는 image확인하기

  • docker run --name mysql-tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8

    • --name : 컨테이너의 이름
    • -e : 환경변수 설정(mysql root계정 비밀번호를 설정)
    • -d : 백그라운드 모드로 실행. 이 설정을 하지 않으면 현재 실행하는 셀 위에서 컨테이너가 실행된다. 컨테이너의 로그를 바로 볼 수 있으나 컨테이너를 나가면 실행 종료
    • -p : 포트설정. 로컬 호스트 포트 : 컨테이너 포트 형태. 로컬포트 3306으로 접근 시 컨테이너 포트 3306으로 연결되도록 설정한다.
    • mysql:8 : docker image
  • docker ps : 실행한 컨테이너 확인

  • docker exec -it "컨테이너 이름(혹은 ID)" /bin/bash : mysql이 실행되고 있는지 확인하기 위해 컨테이너에 진입. SSH와 접속하는 것과 유사

    • mysql -u root -p : MySQL 프로세스로 들어가기
  • docker container stop "컨테이너 이름(ID)" : 실행중인 컨테이너를 중지

  • docker ps -a : 작동을 멈춘 컨테이너까지 확인할 수 있다.

  • docker rm "컨테이너 이름(ID)" : 멈춘 컨테이너를 삭제

    • docker rm "컨테이너 이름(ID)" -f : 실행중인 컨테이너 강제 삭제

그 외

docker run을 할 때 파일을 공유하는 방법

  • Volume Mount

Docker Container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 사라진다.
즉 Host와 Container와 파일 공유가 되지 않는데 만약 파일을 유지하고 싶다면 Host(우리 컴퓨터)와 Container의 저장소를 공유해야 한다. Volume Mount를 진행하면 Host와 Container의 폴더가 공유되며 -v 옵션을 이용하며 사용할 수 있다.

docker run -it -p 8888:8888 -v /some/host/folder/work:/home/jovyan/workspace/jupyter/minimal-notebook

dockerhub에 공개된 모든 이미지를 받을 수 있으며 실습에 사용된 mysql도 dockerhub이미지를 pull하여 사용한것이다. 왠만한 오픈소스들은 다 공개가 되어 있으며 필요한 이미지를 찾아 실행시키면 된다.

Docker 이미지로 배포하기

간단한 FastAPI 앱을 실행하는 서버 Image로 만들기

  1. 새로운 폴더 생성: mkdir folder

  2. 가상환경을 생성 후 fastapi 설치: conda create -n myvenv, pip install fastapi[all]

  3. 간단한 코드 작성

  4. 사용한 라이브러리 명시

  • pip freeze : 설치한 라이브러리 모두 확인
  • pip list --not-required --format=freeze: 의존성에 따라 설치된것 제외
  1. Dockerfile이라는 파일을 만들어 아래처럼 작성 (Docker Image를 빌드하기 위한 정보. 이것들 하나하나가 layer(pull할때 실행되는 라인!)가 된다.)
FROM python:3.8.7-slim-buster

COPY . /app
WORKDIR /app
ENV PYTHONPATH=/app
ENV PYTHONUNBUFFERED=1

RUN pip install pip==21.2.4 && \
    pip install -r requirements.txt

CMD ["python", "main.py"]
  • FROM : docker pull과 같이 해당 베이스 이미지 위에서 내 작업을 수행한다는 의미
  • COPY : COPY 로컬 디렉토리(파일) 컨테이너 내 디렉토리(파일)처럼 사용하여 로컬 디렉토리(파일)를 컨테이너 내부의 디렉토리로 복사
  • WORKDIR : 컨테이너 내 디렉토리를 지정하여 working directory로 지정
  • ENV : 컨테이너 내 환경변수를 지정한다.
  • RUN : 실행할 리눅스 명령어를 지정한다.
  • CMD : 이 이미지를 기반으로 컨테이너를 만들때 사용할 default를 설정. CMD는 띄어쓰기를 사용하지 않음
  • ENTRYPOINT : CMD 명령문과 비슷하지만 컨테이너를 띄울 때 항상 실행되어야 하는 커맨드를 지정
  • EXPOSE : 컨테이너 외부에 노출할 포트를 지정

RUN vs. CMD vs. ENTRYPOINT

  • RUN : 이미지 빌드과정에서 필요한 커맨드를 실행하기 위해 사용
  • CMD : 해당 이미지를 컨테이너로 띄울 때 디폴트로 실행할 커맨드나 ENTRYPOINT명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용
  1. docker build "Dockerfile이 위치한 경로" : 이미지 생성(빌드)하기
  • -t "이미지 이름:태그" : 이미지 이름과 태그를 지정할 수 있다. 태그 미지정시 latest로 채워짐
  1. docker images로 빌드한 이미지 확인하기

  2. docker run "이미지이름:태그": 태그가 latest시 생략가능

  • -it, -p: 옵션을 지정해서 실행해보기! 그냥하니까 안되었음.

9 curl localhost:port로 잘 실행이 되었는지 확인하기

profile
CS | ML | DL

0개의 댓글