Docker란

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)

도커 허브 사용

기본 이미지 저장소로 ubuntu, centos, debian등의 베이스 이미지와 ruby, golang, java, python 등의 공식 이미지가 저장되어 있음

사용법은 참고 자료를 참고하자

배포하기

기존 애플리케이션은 사용하는 언어, 프레임워크, 웹(or WAS)서버, 리눅스 배포판, 개발자의 취향에 따라 각각 다른 방식을 사용

새로운 서버를 셋팅하고 한 번에 배포를 성공한다는 건 굉장히 힘든 일

또한 의존성 라이브러리가 제대로 설치되었는지 검증하기도 매우 어려웠음

컨테이너를 사용하면 어떤 언어, 어떤 프레임워크를 쓰든 상관없이 배포 방식이 동일해지고 과정 또한 굉장히 단순해짐

이미지를 다운받고 컨테이너를 실행하면 끝

참고자료

from http://newwisdom.tistory.com/74 by ccl(A) rewrite - 2021-08-14 16:00:16