쉬엄쉬엄블로그

(AI 서비스 개발 기초) Docker 본문

부스트캠프 AI Tech 4기

(AI 서비스 개발 기초) Docker

쉬엄쉬엄블로그 2023. 8. 9. 11:39
728x90

이 색깔은 주석이라 무시하셔도 됩니다.

Part 3. 더 완성된 제품으로 개발하기

Docker 소개

가상화란?

  • 개발할 때, 서비스 운영에 사용하는 서버에 직접 들어가서 개발하지 않음
  • Local 환경에서 개발하고, 완료되면 Staging 서버, Production 서버에 배포
  • 개발을 진행한 Local 환경과 Production 서버 환경이 다른 경우
    • 예)
      • Local 환경은 윈도우
      • 서버 환경은 Linux
    • OS가 다르기 때문에 라이브러리, 파이썬 등 설치할 때 다르게 진행해야 함
  • Local 환경과 서버가 같은 OS를 사용해도, 서버에서 올바르게 작동하지 않을 수 있음
    • 예)
      • Local의 환경 변수
      • Production 서버의 환경 변수(Env)
      • Production 서버의 사용자 그룹, Permission
  • 다양한 설정을 README 등에 기록하고, 항상 실행하도록 하는 방법
    • 사람이 진행하는 일이라 Human Error 발생
    • 매번 이런 작업을 해야 하는 과정이 귀찮음
    • 예)
      • Jupyter Notebook 서버를 만들기 위해 클라우드에서 클릭 - 이름 - 클릭 만들기 ⇒ 인스턴스로 접속해서 필요한 패키지 설치하는 과정
  • 운영하고 있는 Server가 100대라면?
    • 특정 서버 업데이트가 진행되었다면(윈도우, 스마트폰 OS 자동 업데이트 실행) ⇒ 나머지 서버에도 모두 접속해 업데이트 필요
  • 이 부분에서 생기는 고민 : 서버 환경까지도 모두 한번에 소프트웨어화 할 수 없을까?
    • 밀키트처럼 만들어서 집에서도 사용하고 레스토랑에서도 사용하는 방법은?
  • 이런 고민을 해결하기 위해 나온 개념이 “가상화”
    • 엄밀하게는 하드웨어 가상화 등 더 넓은 개념이지만, 여기선 소프트웨어 가상화로 한정
  • 특정 소프트웨어 환경을 만들고, Local, Production 서버에서 그대로 활용
    • 개발(Local)과 운영(Production) 서버의 환경 불일치가 해소
    • 어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있음
    • 개발 외에 Research도 동일한 환경을 사용할 수 있음

Docker 등장 전

  • 가상화 기술로 주로 VM(Virtual Machine)을 사용

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

    • 예)

      • 호스트 머신은 Windows인데, Windows에서 Linux를 실행

      • 호스트 머신은 Mac인데, Mac에서 Windows를 실행

        https://www.vembu.com/blog/containers-vs-virtual-machines-differences-and-advantages/

  • 앞서 사용한 GCP의 Compute Engine 또는 AWS EC2가 이런 개념을 활용

    • 클라우드 회사에서 미리 만든 이미지를 바탕으로, Computing 서비스를 통해 사용자에게 동일한 컴퓨팅 환경을 제공
  • 그러나 OS 위에 OS를 하나 더 실행시키는 점에서 VM은 굉장히 리소스를 많이 사용

    • 이런 경우를 “무겁다”라고 표현
  • Container : VM의 무거움을 크게 덜어주면서, 가상화를 좀 더 경량화된 프로세스의 개념으로 만든 기술

    • 이 기술의 등장으로 이전보다 빠르고 가볍게 가상화를 구현할 수 있음

Docker 소개

  • Container 기술을 쉽게 사용할 수 있도록 나온 도구가 바로 Docker

    • 2013년에 오픈소스로 등장
    • 컨테이너에 기반한 개발과 운영을 매우 빠르게 확장
  • Docker와 비슷한 느낌

    • PC방에서 특정 게임만 설치하고, 고객이 특정 프로그램을 깔아도 재부팅할 때 항상 PC방에서 저장해둔 형태로 다시 복구
    • = Docker Image로 만들어두고, 재부팅하면 Docker Image의 상태로 실행
  • Docker Image

    • 컨테이너를 실행할 때 사용할 수 있는 “템플릿”
    • Read Only
  • Docker Container

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

    • Write 가능

      https://low-orbit.net/docker-container-vs-image

Docker로 할 수 있는 일

  • 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음
    • 예) MySQL을 Docker로 실행
    • 예) Jupyter Notebook을 Docker로 실행
  • 다른 사람이 만든 소프트웨어 : Docker Image
    • OS, 설정을 포함한 실행 환경
    • Linux, Windows, Mac 어디에서나 동일하게 실행할 수 있음
  • 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있음
    • 원격 저장소에 저장하면 어디서나 사용할 수 있음
  • 원격 저장소 : Container Registry
    • 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 서버에서 받아서 실행하는 식으로 진행

Docker 실습하며 배워보기

Docker 설치하기

Docker 실행하기

  • 설치 후, 터미널에서 docker 커맨더가 동작하는지 확인

  • MySQL 실행하기

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

      • docker pull mysql:8로 mysql 8 버전의 이미지를 다운

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

    • docker run “이미지 이름:태그”

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




      • 실행한 컨테이너는 docker ps 명령어로 확인할 수 있음

      • docker exec -it “컨테이너 이름(혹은 ID)” /bin/bash

        • MySQL이 실행되고 있는지 확인하기 위해 컨테이너에 진입
        • Compute Engine에서 SSH에 접속하는 것과 유사
      • mysql -u root -p

        • MySQL 프로세스에 들어가면 MySQL 쉘 화면이 보임
      • 작동을 멈춘 컨테이너는 docker ps -a 명령어로만 확인할 수 있음

        • docker ps는 실행중인 컨테이너 목록만 보여줌
      • docker rm “컨테이너 이름(ID)”

        • 멈춘 컨테이너를 삭제
        • 멈춘 컨테이너만 삭제할 수 있지만 docker rm “컨테이너 이름(ID)” -f로 실행중인 컨테이너도 삭제 가능
  • 기본 명령어 정리

    • docker pull “이미지 이름:태그” : 필요한 이미지 다운
    • docker images : 다운받은 이미지 목록 확인
    • docker run “이미지 이름:태그” : 이미지를 기반으로 컨테이너 생성
    • docker ps : 실행중인 컨테이너 목록 확인
    • docker exec -it “컨테이너 이름(ID)” /bin/bash : 컨테이너에 진입
    • docker container “컨테이너 이름(ID)” : 실행중인 컨테이너를 중지
    • 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
            • 예)
              • docker run -it -p 8888:8888 -v /some/host/folder/for/work:/home/jovyan/workspace jupyter/minimal-notebook
    • Dockerhub에 공개된 모든 이미지를 받을 수 있음
      • MySQL도 Dockerhub에서 다운로드
      • Dockerhub에 왠만한 오픈소스들이 공개되어 있고, 우리는 필요한 이미지를 찾아 실행!

Docker Image 만들기

  • 간단한 FastAPI 애플리케이션을 실행하는 서버를 Docker Image 생성

  • 프로젝트 셋팅

    • 폴더를 하나 만들고, 여기에 가상환경 세팅과 FastAPI 패키지를 설치
  • FastAPI 코드 작성

  • 사용한 라이브러리 명시

    • pip freeze : 설치한 라이브러리를 모두 보여줌
    • 또는 pip list --not-required --format=freeze : 의존성에 따라 설치된 라이브러리는 보이지 않음
  • Dockerfile 작성

    • Dockerfile라는 파일을 만들어 다음처럼 작성(Docker Image를 빌드하기 위한 정보가 담김)







  • Docker Image Build

    • docker build “Dockerfile이 위치한 경로”

      • 이미지 생성(빌드라고 표현)

      • 아래 이미지에서 . 는 현재 폴더에 Dockerfile이 있음을 의미

      • -t “이미지 이름:태그” 옵션으로 이미지 이름과 태그 지정할 수 있음

      • 태그는 미 지정시 “latest”로 채워짐

  • 빌드된 이미지 확인

    • 빌드를 마치면 docker images 명령어로 방금 빌드한 이미지를 확인할 수 있음

  • 컨테이너 실행

    • docker run “이미지 이름:태그”

    • 태그가 “latest”인 경우 생략 가능

    • 다른 터미널을 열어 curl로 애플리케이션이 잘 작동하는지 확인할 수 있음

  • 정리

    • 파이썬 환경 및 애플리케이션 코드를 작성
    • Dockerfile 작성
      • FROM으로 베이스 이미지를 작성
      • COPY로 로컬 내 디렉터리 및 파일을 컨테이너 내부로 복사
      • WORKDIR로 RUN, CMD 등을 실행할 컨테이너 내 디렉터리 지정
      • RUN으로 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행
      • CMD로 이미지 실행 시 바로 실행할 명령어를 지정
    • docker build “Dockerfile이 위치한 경로” -t “이미지 이름:태그” 로 이미지 빌드
    • docker run “이미지 이름:태그”로 빌드한 이미지를 실행
    • 그 외에 Dockerfile에서 사용하는 것
      • EXPOSE : 컨테이너 외부에 노출할 포트 지정
      • ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드

출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)

Comments