본문 바로가기
네이버 부스트캠프 AI Tech/Deep Learning Basics

[부스트캠프 AI Tech] Docker

by 중앙백 2022. 2. 15.

Docker

등장배경
  • 개발 서버 ≠ 서비스 운영에 사용하는 서버 (Local 환경에서 개발. 완료되면 Staging 서버, Production 서버에 배포)
  • 개발을 진행한 local 환경(윈도우)와 production 서버 환경(리눅스)가 다른 경우 OS가 다르기 때문에 라이브러리, 파이썬 등을 설치할 때 다르게 진행해야 함.
  • 혹은 로컬 환경과 서버가 같은 OS여도 서버에서 올바르게 작동하지 않을 수 있다. (로컬의 환경변수, production 서버의 환경변수, production 서버의 사용자 그룹, Permission)
  • (해결책) 다양한 설정을 README에 기록하고 항상 실행하도록 하는 방법이 있다.
    (문제점) 사람이 진행하는 일이라 Human Error / 귀찮음 /
  • (문제점) 운영하는 서버가 무수히 많은 경우 / 특정 서버 업데이트가 되면 나머지 서버 모두 접속해 업데이트 필요
    (해결 방안) 서버 환경 까지도 한번에 소프트웨어화 하면 되지 않을까? → (소프트웨어) 가상화 개념 등장

 

가상화
  • 특정 소프트웨어 환경을 만들고 Local, Production 서버에서 그대로 활용
  • 어느 환경에서나 동일한 환경으로 프로그램 실행 가능

초기 가상화 기술

  • VM(Virtual Machine)
    호스트 머신(실제 물리적인 컴퓨터, Windows) 위에 OS를 포함한 가상화 소프트웨어(Linux)를 두는 방식
    OS위에 OS를 또 실행시킨다는 점에서 굉장히 많은 리소스를 사용 ("무겁다"라고 표현)
    (좌) Container / (우) Virtual Machine
  • Container
    무거운 VM에 비해 경량화된 기술

 

Docker
  • Container 기술을 쉽게 사용할 수 있도록 도와주는 도구

  • 피시방에서 게임 설치해도 재부팅하면 항상 초기 설정으로 돌아가는 것과 비슷한 개념
    (Docker image로 만들면 재부팅하면 Docker image 상태로 재실행)
  • Docker Image : 컨테이너를 실행할 때 사용할 수 있는 템플릿. Read Only
  • Docker Container : docker image를 활용해 실행된 인스턴스. Write 가능
  • 다른 사람이 만든 소프트웨어(docker image)를 가져와서 바로 사용가능
    - OS, 설정을 포함한 실행 환경
    - Linux, Windows, Mac 어디든 동일하게 실행 가능
  • https://low-orbit.net
  • Docker image를 만들어 공유 가능 - 원격 저장소(Container Registry)에 저장하면 어디서나 사용 가능

 

Docker 커맨드
  • docker pull [image name:tag]   :    image 다운
  • docker images   :   다운받은 image 확인
  • docker run [image name:tag]     :    다운받은 이미지 기반으로 컨테이너 만들고 실행
    (ex) docker run --name mysql-tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8
     --name [container name]   :  컨테이너 이름 지정. 지정하지 않으면 랜덤 생성
     -e [환경변수]    :   환경변수 설정. image에 따라 설정 다름.
     -d    :   데몬(백그라운드)모드. 컨테이너를 백그라운드 형태로 실행.
                데몬 설정하지 않으면 현재 실행하는 셀 위에서 컨테이너 실행. 컨테이너를 나가면 실행 종료
     -p [로컬 호스트 포트:컨테이너 포트]   :  로컬포트**로 접근시 컨테이너 포트**로 연결되도록 설정
                  로컬 호스트 : 우리 컴퓨터  /  컨테이너 : 컨테이너 이미지 내부
  • docker ps  : 실행 중인 컨테이너 확인 가능
    docker ps -a   : 작동 여부 상관없이 컨테이너 확인 가능
  • docker exec -it [컨테이너 이름/ID] /bin/bash    : 컨테이너에 진입
    mysql의 경우 mysql -u root -p → password 입력 → MySQL 쉘 화면 등장
  • docker stop [컨테이너 이름(ID)] : 실행 중인 컨테이너를 중지
  • docker rm [컨테이너 이름(ID)]   : '멈춘' 컨테이너를 삭제
    docker rm [컨테이너 이름(ID)] -f    : 실행 중인 컨테이너도 삭제 가능

  • docker run 할 때 파일 공유하는 법
    docker container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 사라진다.
    (Host와 Container간 파일 공유가 되지 않는다.)
    파일을 유지하고 싶으면 Volume Mount를 통해 Host(우리 컴퓨터)와 Container의 저장소를 공유해야 함.
    -v [Host_Folder:Container_Folder]
    (ex) docker run -it -p 8888:8888 -v /some/host/folder/for/work:/home/jovyan/workspace jupyter/notebook
  • Dockerhub에서 공개된 이미지  다운받아보자

Docker Image 만들기
  • Dockerfile (Docker Image를 빌드하기 위한 정보가 담겨있음)
    ⊙ FROM [image name:tag]  :  이미지 빌드에 사용할 베이스 이미지를 지정. 보통 밑바닥부터 만들지 않고 공개된 이미지를 기반으로 새로운 설정을 추가함
    (ex) FROM python:3.8.7-slim-buster

    ⊙ COPY [로컬 디렉토리(파일)] [컨테이너 내 디렉토리(파일)]   :  Dockerfile이 존재하는 경로 기준 로컬 디렉토리를 컨테이너 내부의 디렉토리로 복사
    (ex) COPY . /app    : 프로젝트 최상위 모든 파일을 컨테이너 /app 디렉토리로 복사

    ⊙ WORKDIR [컨테이너 내 디렉토리]  : Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행한 컨테이너 내 경로 지정. (ex) WORKDIR /app  : 이 뒤의 명령어는 /app 에서 실행

    ⊙ ENV [환경변수 이름=값]  : 컨테이너 내 환경변수를 지정
    (ex) ENV PYTHONPATH=/app     ENV PYTHONBUFFERED=1    파이썬 앱의 경우 통상 이 두 값 지정

    ⊙ RUN [실행할 리눅스 명령어]  : 컨테이너 내에서 리눅스 명령어를 실행
    (ex) RUN pip install pip=[version]     RUN pip install -r requirements.txt

    ⊙ CMD ["실행할 명령어","인자"]    : docker run으로 이 이미지를 기반으로 컨테이너를 만들 때 실행할 명령어
    띄어쓰기를 사용하지 않음

    RUN : 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행 vs CMD : 이미지 실행 시 바로 실행할 명령어

    ⊙ EXPOSE : 컨테이너 외부에 노출할 포트 지정
    ⊙ ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커멘드
  • requirements.txt
    pip freeze(설치한 라이브러리를 전부 보여줌)
    pip list --not-required --format=freeze(의존성에 따라 설치된 라이브러리는 보이지 않음)
    pip으로 설치한 라이브러리를 모두 requirements.txt에 저장 (ex) pip freeze > requirements.txt
  • 커맨드에  docker build [Dockerfile이 위치한 경로]  입력   : 이미지 생성(빌드)
    (ex) docker build . -t [image name:tag]

  • 다른 터미널을 열어 curl로 애플리케이션 작동여부 확인 가능

댓글