가상화


  • 개발을 진행한 Local 환경과 Production 서버 환경이 다른 경우

  • OS가 다르기 때문에 라이브러리, 파이썬 등 설치할 때 다르게 진행해야 한다.

  • Local 환경과 서버가 같은 OS를 사용해도, 환경변수 혹은 사용자그룹, Permission이 일치하지 않아 서버에서 올바르게 작동하지 않을 수 있다.

  • 따라서, 다양한 설정을 README 등에 기록하고, 항상 실행하도록 하여 문제를 해결

    • 하지만, 사람이 진행하는 일이라 Human Error가 발생할 수 있다
    • 매번 이런 작업을 해야 하는 과정이 귀찮음
  • 만약 운영하고 있는 Server가 100대이고, 특정 서버 업데이트가 진행되었다면, 모든 서버가 모두 업데이트 될 필요가 있다.

    • 이러한 경우에 서버 환경까지도 모두 한번에 소프트웨어화 할 수 없을까?
    • 이런 고민을 해결하기 위해 나온 개념이 “가상화”이다 (여기서는 소프트웨어 가상화로 한정지어 설명)
  • Research / Production 환경에서 공통적으로 사용하는 템플릿이 있다면 생산성을 높일 수 있을 것이다.

    • 특정 소프트웨어 환경을 만들고, Local, Production 서버에서 그대로 활용
    • 개발(Local)과 운영(Production) 서버의 환경 불일치가 해소
    • 어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있음
    • 개발 외에 Research도 동일한 환경을 사용할 수 있다.
  • 가상화 기술은 주로 VM(Virtual Machine)을 사용한다.

  • VM이라는 호스트 머신이라고 물리적 컴퓨터 위에, OS를 포함한 가상화 소프트웨어를 두는 방식

  • 우리의 컴퓨터 위에 다른 가상화 소프트웨어가 있다고 생각하면 됨

    ex) 호스트는 Window인데 Window에서 Linux실행

  • OS 위에 OS를 하나 더 실행시키는 점에서 VM은 굉장히 리소스를 많이 사용하기 때문에, ‘무겁다’고 표현한다.
  • Container
    • VM의 무거움을 크게 덜어주면서, 가상화를 좀 더 경량화된 프로세스의 개념으로 만든 기술
    • 이 기술의 등장으로 전보다 빠르고 가볍게 가상화를 구현할 수 있다.
  • 이러한 Container 기술을 쉽게 사용할 수 있도록 나온 도구가 바로 Docker

Docker


  • Docker Image

    • 컨테이너를 실행할 때 사용할 수 있는 “템플릿”
    • 다른 사람이 만든 소프트웨어로 OS, 설정을 포함한 실행 환경이다
    • Linux, Window, Mac 어디에서나 동일하게 실행할 수 있다.
    • Read Only
  • Docker Container

    • Docker Image를 활용해 실행된 인스턴스
    • Write 가능
  • Docker로 할 수 있는 일

    • 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음 ex) MySQL을 Docker로 실행
    • Docker를 통해 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있다
      • 원격 저장소에 저장하면 어디서나 사용할 수 있다.
      • 원격 저장소 : Container Registry
        • 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 서버에서 받아서 실행하는 식으로 진행

실습


  • Terminal에서 docker 입력시 docker 정보 확인

  • 이미지 다운
    • docker pull “이미지 이름:태그”

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

  • Docker Container 만들고 실행
    • docker run --name mysql-tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8
    • docker run --name mysql -tutorial : Container 이름
    • -e MYSQL_ROOT_PASSWORD=1234 : 환경변수 설정
    • -d : nohup과 같이 백그라운드 실행을 하기 위해 데몬 모드 설정
    • -p 3306:3306 : 포트 지정

  • 실행한 Container 확인
    • docker ps

  • MySQL 프로세스로 들어가기

    • 내 의도와 다르게 실행이 되지않을때, 접근이 안될때 디버깅을 확인하기 위해 컨테이너 진입
      - MYSQL이 실행되고 있는지 확인하기 위해 컨테이너 진입
      - docker exec -it “컨테이너 이름(혹은 ID)” /bin/bash
      - Compute Engine에서 SSH와 접속하는 것과 유사

    • mysql -u root -p 입력 후 비밀번호 입력

  • 실행중인 컨테이너 중지

    • docker container “컨테이너 이름(ID)”
  • 작동을 멈춘 컨테이너 확인하기

    • docker ps : 실행중인 컨테이너 목록만 보여줌
    • docker ps -a : 모든 컨테이너 목록 확인

  • 멈춘 Docker 컨테이너 삭제
    • docker rm “컨테이너 이름(ID)”

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


  • Volume Mount
    • Docker와 Container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 사라짐 → Host와 Container 간 파일 공유가 되지 않음

    • 파일을 공유하고 싶으면 Host와 Container의 저장소를 공유해야 하는데, Volume Mount를 진행하면 Host와 Container의 폴더가 공유된다

    • -v 옵션을 사용하며, -p(Port)처럼 사용한다. -v Host_Folder:Container_Folder

    • 대표적으로 jupyter notebook 사용할 때 많이 사용

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

Dockerhub


  • Dockerhub에 공개된 모든 이미지를 다운받을 수 있음
  • MySQL도 Dockerhub에서 다운로드
  • Dockerhub에 왠만한 오픈소스들이 공개되어 있고, 우리는 필요한 이미지를 찾아 실행하면 된다!

Docker Image 만들기


  • 먼저 폴더 하나를 만들고, 여기에 가상환경 세팅과 FastAPI 패키지를 설치
  • 윈도우는 .venv\Scripts\activate로 가상환경 세팅

  • GET/hello 로 요청하면, 메세지를 전달하는 간단한 코드를 작성

  • 설치한 라이브러리 확인
    • pip freeze
    • 라이브러리를 저장하는 이유는 다른 도커 이미지에서도 설치해줘야 오류가 안생기기 때문.
    • pip list —not-required —format=freeze : 의존성에 따라 설치된 라이브러리는 보이지 않음

  • Dockerfile 만들기
    • 보통 Dockerfile이라는 이름으로 만들면 vscode에서 돌고래 모양으로 변함

  • FROM “이미지 이름:태그”

    • FROM python:3.8.7-slim-buster
    • container regist에 올라간 이미지를 먼저 떙겨오겠다 라는 의미
    • 누군가 만들어 둔 베이스 이미지를 사용
  • COPY “로컬 디렉토리(파일)” “컨테이너 내 디렉토리(파일)”

    • COPY . /app
    • 현재 폴더에 있는 모든 것들을 container 내부에 옮겨오겠다 를 의미
    • COPY 명령어는 Dockerfile이 존재하는 경로 기준 로컬 디렉토리를 컨테이너 내부의 디렉토리로 복사
  • WORKDIR “컨테이너 내 디렉토리”

    • WORKDIR /app
    • Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행할 컨테이너 경로 지정
    • 이 라인 뒤에 등장하는 RUN, CMD는 컨테이너 내부의 /app 에서 실행을 의미
  • ENV “환경변수 이름=값”

    • ENV PYTHONPATH=/app
    • 컨테이너 내 환경변수를 지정
  • RUN “실행할 리눅스 명령어”

    • RUN pip install ..
    • RUN은 컨테이너 내에서 리눅스 명령어 실행
  • CMD [”실행할 명령어”,”인자”,...]

    • CMD [”python”,”main.py”]
    • docker.run으로 이 이미지를 기반으로 컨테이너를 만들 때, 실행할 명령어이다. (shell command를 뜻함)
  • Docker image build

    • docker build “Dockerfile이 위치한 경로”
    • 이미지 생성(빌드라고 표현)
    • 아래 이미지에서 . 는 현재 폴더에 Dockerfile이 있음을 의미
    • -t “이미지 이름:태그” 옵션으로 이미지 이름과 태그 지정할 수 있다
    • 태그는 미 지정시 “latest”로 채워짐

  • 이제 만든 이미지 확인
    • docker images

  • 방금 만든 이미지를 실행
    • docker run “이미지 이름:태그”

  • 여기서는 백그라운드 실행을 하지 않았기에 로그가 남지만, 백그라운드 실행하게 되면 완료되었다 문구만 뜬다.

  • 컨테이너 실행

Docker Image 만들기 - 정리


  • 파이썬 환경 및 애플리케이션 코드 작성
  • Dockerfile 작성
    • FROM으로 베이스 이미지를 지정
    • COPY로 로컬 내 디렉토리 및 파일을 컨테이너 내부로 복사
    • WORKDIR로 RUN, CMD 등을 실행할 컨테이너 내 디렉토리 지정
    • RUN으로 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행
    • CMD로 이미지 실행 시 바로 실행할 명령어를 지정
  • docker build “Dockerfile이 위치한 경로” -t “이미지 이름:태그”으로 이미지 빌드
  • docker run “이미지 이름:태그”로 빌드한 이미지를 실행

그 외에 Dockerfile에서 사용하는 것


EXPOSE : 컨테이너 외부에 노출할 포트 지정

ENTRYPOINT: 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드

0개의 댓글