본문 바로가기

인프라

Docker란

2021-07-11글

도커란?

  • 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 다양한 프로그램, 실행환경을 컨테이너로 추상화한, 동일한 인터페이스를 제공해 프로그램의 배포 및 관리를 단순화하게 해줌
  • 어디에서든 실행 가능하도록 해줌(조립컴, AWS, Google Cloud)

특징

확장성

  • 이미지만 만들어 놓으면 컨테이너는 그냥 띄우면 됨
  • 서버에 서비스 하나 더 띄울라면 run 명령어로 간단하게 해결

표준성

  • 도커를 사용하지 않는 경우 ruby, nodejs, go, php로 만든 서비스들의 배포 방식은 각각 다름
  • 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정이 동일

이미지

  • 이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정이 필요
  • 이미지를 저장할 곳이 필요

설정

  • 보통 환경변수로 제어
  • 하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야함

컨테이너

  • 격리된 공간에서 프로세스가 동작하는 기술
  • 가상화 기술의 하나

BUT. 기존의 방식과는 차이가 있음

  • 기존 가상화 방식은 주로 OS를 가상화 한 것
    • 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식
    • 이 방식은 어쨌든 성능상 문제가 있다고...
  • 때문에 프로세스를 격리하는 방식 등장
    • 리눅스에서는 프로세스만 격리시키는 리눅스 컨테이너 존재
  • 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행 가능
    • 실행중인 컨테이너에 접속래 명령어 입력 가능
    • 패키지 설치 가능
    • 사용자 추가 가능
    • 여러개의 프로세스를 백그라운드로 실행 가능

이미지

  • 컨테이너 실행에 필요한 모든 파일과 설정 값등을 포함
  • 상태값을 가지지 않고 변하지 않음
  • 컨테이너는 이미지를 실행한 상태
  • 추가되거나 변하는 값은 컨테이너에 저장됨
  • 같은 이미지에서 여러개 컨테이너를 생성할 수 있고, 컨테이너가 수정/삭제되어도 이미지는 변하지 않음
  • ex) MySQL이미지는 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있음
  • 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있음

모든 정보를 가지고 있다면 용량이 엄청 클텐데...

  • 이런 문제를 해결하기 위해 레이어 라는 개념 도입

레이어

  • 여러개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해줌
  • 이미지는 여러개의 읽기전용 레이어로 구성
  • 파일이 추가되거나 수정되면 새로운 레이어가 생성됨
  • 어떤 이미지를 베이스로 새로운 이미지를 다운받는면 추가되는 레이어만 다운받으면 됨
  • 컨테이너를 생성할 때도 기존 이미지 레이어 위에 읽기, 쓰기 레이어를 추가하는데, 컨테이너가 실행중에 생성하는 파일, 변경 내용은 해당 레이어에만 저장되어 최소한의 용량만 사용

이미지 경로

  • 이미지는 URL 방식으로 관리하며 태그를 붙일 수 있음

Dockerfile

  • 이미지를 만들기 위해 DSL을 통해 이미지 생성 과정을 적음

도커 설치 & 컨테이너 실행

리눅스에 도커 설치하기

curl -fsSL https://get.docker.com/ | sudo sh

sudo 없이 사용하기

  • 도커는 기본적으로 root 권한이 필요
  • 루트가 아닌 사용자가 sudo 없이 사용하기 위해 다음 명령어를 통해 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기

컨테이너 실행

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
  • docker run --help 명령어를 통해 다양한 옵션을 알아보자
  • 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드 pull를 한 후 컨테이너를 생성 create하고 시작 start

도커 기본 명령어

컨테이너 목록 확인하기 (ps)

  • 컨테이너 목록을 확인
docker ps [OPTIONS]

컨테이너 중지하기 (stop)

  • 실행중인 컨테이너 중지
docker stop [OPTIONS] CONTAINER [CONTAINER...]

컨테이너 제거하기 (rm)

docker rm [OPTIONS] CONTAINER [CONTAINER...]

이미지 다운로드하기 (pull)

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

이미지 삭제하기 (rmi)

docker rmi [OPTIONS] IMAGE [IMAGE...]

실행중인 컨테이너에 명령어 실행 (exec)

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

도커 이미지 만들기

  • 도커는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장함
  • ex) 어떤 애플리케이션을 이미지로 만든다면, 리눅스만 설치된 컨테이너에 애플리케이션을 설치하고 이 상태를 그대로 이미지로 저장
  • 가상머신의 스냅샷과 비슷한 방식
  • 이미지를 만들기 위해서는 Dockerfile이라는 이미지 빌드용 DSLDomain Specific Language 파일 작성

이미지 빌드

docker build [OPTIONS] PATH | URL | -
  • 생성할 이미지 이름을 지정하기 위한 -t(--tag) 옵션만 알면 빌드가 가능

도커 이미지 저장소

  • 도커는 빌드한 이미지를 서버에 배포하기 위해 직접 파일을 복사하는 방법 대신 도커 레지스트리(Docker Registry)라는 이미지 저장소를 사용
  • 이미지를 레지스트리에 푸시push하고 다른 서버에서 풀pull받아 사용하는 구조 (like. git)

도커 허브 사용

배포하기

  • 기존 애플리케이션은 사용하는 언어, 프레임워크, 웹(or WAS)서버, 리눅스 배포판, 개발자의 취향에 따라 각각 다른 방식을 사용
  • 새로운 서버를 셋팅하고 한 번에 배포를 성공한다는 건 굉장히 힘든 일
  • 또한 의존성 라이브러리가 제대로 설치되었는지 검증하기도 매우 어려웠음
  • 컨테이너를 사용하면 어떤 언어, 어떤 프레임워크를 쓰든 상관없이 배포 방식이 동일해지고 과정 또한 굉장히 단순해짐
  • 이미지를 다운받고 컨테이너를 실행하면 끝

참고자료

'인프라' 카테고리의 다른 글

AWS CloudFront와 S3 구성  (0) 2021.08.23
생활코딩 OAuth 2.0 강의와 놀토의 OAuth  (0) 2021.08.20
Flyway 적용기  (0) 2021.08.15
CI/CD란, 젠킨스 실습해보기  (0) 2021.08.15
REST API에 대하여  (0) 2021.08.06