도커와 컨테이너 이해하기

개발새발·2022년 9월 5일
0

Cloud Native

목록 보기
1/6
post-thumbnail

도커와 컨테이너 이해하기

본 글은 도커, 컨테이너 빌드업!를 읽고 정리한 글입니다.

1. 가상머신과 컨테이너

클라우드 컴퓨팅에서 가상화는 하드웨어 기능을 시뮬레이션하여 애플리케이션 서버, 스토리지, 네트워크와 같은 유용한 IT 서비스를 생성하는 소프트웨어 아키텍처 기술이다. 모든 규모의 비즈니스에서 IT 비용을 절감하면서 효율성과 대응력(민첩성, 탄력성), 가용성 향상과 운영 자동화를 통해 IT 관리를 간소화하고, 소유 및 운영 비용을 낮출 수 있다.

최근 사용하고 있는 가상화는 하이퍼바이저를 이용한 가상머신컨테이너를 위용한 도커 방식이다.

가상머신은 호스트 운영체제 위에 가상화 소프트웨어를 이용하여 여러 개의 게스트 OS(Ubuntu, CentOS 등)를 구동하는 방식이다. 하이퍼바이저는 가상머신을 생성하고 실행하는 역할과 가상화된 하드웨어와 각각의 가상머신을 모니터링하는 중간 관리자다. 가상머신에서 각각의 게스트 OS는 호스트 운영체제로부터 독립된 자원을 할당받아 가상화된 서비스를 제공하기 때문에 수 GB의 용량을 차지하는 이미지를 만들어 사용한다. 즉, 가상머신은 하드웨어 가상화다.

반면, 컨테이너를 이용한 가상화는 리눅스 기반의 물리적 공간 격리가 아닌 프로세스 격리를 통해 경량의 이미지를 실행하고 서비스할 수 있는 컨테이너 기술이다. 컨테이너 엔진인 도커와 오케스트레이션 도구인 쿠버네티스는 호스트 운영체제의 커널을 공유하고 그 위에 실행 파일 및 라이브러리, 기타 구성 파일 등을 이미지로 빌드하여 패키지로 배포하는 방식이다. 도커 엔진이 차용하고 있는 컨테이너 기술은 본래 리눅스 자체 기출인 chroot, namespace, cgroup을 조합한 리눅스 컨테이너(LinuX Container, LXC)에서 출발한다.

컨테이너 기술의 장점

  • 하이퍼바이저와 같은 게스트 OS가 없기 때문에 가볍다. (수십 MB)
  • 경량이기 때문에 만들어진 이미지 복제, 이관, 배포가 쉽다.
  • 게스트 OS를 부팅하지 않기 때문에 애플리케이션 시작 시간이 빠르다.
  • 가상머신보다 경량이므로 더 많은 애플리케이션을 실행할 수 있다.

 

2. 도커

컨테이너는 코드와 모든 종속성을 패키지화하는 표준 소프트웨어 단위로, 애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 한다. 도커 컨테이너 이미지는 애플리케이션을 실행하는데 필요한 모든 것(코드, 런타임, 라이브러리 등)을 포함하는 경량의 독립형 실행 가능 소프트웨어 패키지라고 할 수 있다. 도커 컨테이너 이미지는 도커 허브로부터 내려받거나(pull) Dockerfile을 통해 생성(build)하여 도터 엔진을 이용해 실행하면 컨테이너 서비스가 된다.

도커의 주요 기능

  • LXC를 이용한 컨테이너 구동

    • containered는 리눅스 및 윈도우용 데몬으로, 이미지 전송 및 스토리지에서 컨테이너 실행 및 감독, 네트워크 연결까지 호스트 시스템 전체 컨테이너의 라이프사이클을 관리한다.
  • 통합 Buildkit

    • buildkit은 도커 파일의 설정 정보를 이용하여 도커 이미지를 빌드하는 오픈소스 도구이며, 빠르고 정확하게 여러 가지 아키텍처 향상 기능을 제공한다.
  • 도커 CLI 기반

    • 도커 명령을 수행하는 기본적인 방법은 CLI로 제공한다.

도커에서 활용도 높은 구성 요소

  • Docker Engine

    • 도커를 이용한 애플리케이션 실행 환경 제공을 위한 핵심 요소
  • Docker Hub

    • 전 세계 도커 사용자들과 함께 도커 컨테이너 이미지를 공유하는 클라우드 서비스
  • Docker-compose

    • 의존성 있는 독립된 컨테이너에 대한 구성 정보를 YAML 코드로 작성하여 일원환된 애플리케이션 관리를 가능하게 하는 도구
  • Docker Kitematic

    • 컨테이너를 이용한 작업을 수행할 수 있는 GUI 제공
  • Docker Registry

    • 도커 이미지 저장소
  • Docker Machine

    • 가상머신 프로그램 및 AWS EC2, MS Azure 환경에 도커 실행 환경을 생성하기 위한 도구
  • Docker Swarm

    • 여러 도커 호스트를 클러스터로 구축하여 관리할 수 있는 도커 오케스트레이션 도구

 

3. 쿠버네티스

쿠버네티스는 컨테이너 오케스트레이션 도구 중 하나로, 대규모 클러스터 환경의 수많은 컨테이너를 쉽고 빠르게 확장, 배포, 관리하는 작업을 자동화해주는 오픈소스 플랫폼이다. 현재 시장에서 쿠버네티스는 사실상 컨테이너화된 애플리케이션에 대한 대규모 배포 작업에 가장 적합한 오케스트레이션 도구의 표준이라 할 수 있다.

컨테이너 오케스트레션 도구는 다양한 머신을 하나의 클러스터로 결합하여 오케스트라의 연주자처럼 서로 다른 각자의 역할을 쉽게 조정하고 관리할 수 있도록 설계된 소프트웨어를 말한다.

쿠버네티스가 유용한 이유

  • 온프레미스 환경에서 수행하는 서버 업그레이드, 패치, 백업 등의 작업을 자동화(오토 스케일링, 서비스 디스커버리, 로드 밸런싱 등)하여 인프라 관리보다는 서비스 관리에 집중할 수 있다.

  • 서비스 사용자는 애플리케이션이 24/7/365 지속되기를 원한다. 컨테이너에 장애 발생 시 자기 회복 기능을 통해 곧바로 복제 컨테이너를 생성하여 서비스르 지속할 수 있다.

  • 컨테이너화를 통해 소프트웨어를 패키지화하면 점진적 업데이트를 통해 다운타임 없이 쉽고 빠르게 릴리스 및 업데이트할 수 있다.

 

4. 도커 명령어

4-1. 도커 이미지 명령어

  • docker search : 도커 허브 및 개인 사용자들이 공개한 관련 이미지 조회

  • docker pull : 도커 허브 레지스트리에서 로컬로 도커 이미지 내려받기

  • docker push : 로컬에 있는 도커 이미지를 토커 허브 레지스트리에 업로드

  • docker login : 업로드를 하기 전 도커 허브 계정으로 로그인 수행

  • docker logout : 도커 허브에서 로그아웃

  • docker image inspect / docker image history : 도커 이미지에 대한 세부 정부 조회

  • docker image tag : 원본 이미지에 참조 이미지 이름을 붙임

  • docker image save : 도커 원본 이미지의 레이어 구조까지 포함한 복제를 수행하여 확장자 tar파일로 저장

  • docker image rm (docker rmi) : 도커 이미지 삭제

4-2. 도커 컨테이너 명령

  • docker run : 해당 도커 이미지 복사본 스내숏 레이어 위에 읽고 쓰기가 가능한 컨테이너 레이어 추가

    • -i : 대화식 모드 열기
    • -t : TTY(단말 디바이스) 할당
    • -d : 백그라운드에서 컨테이너 실행 후 컨테이너 ID 등록
    • --name : 실행되는 컨테이너에 이름 부여
    • --rm : 컨테이너 종료 시 자동으로 컨테이너 제거
    • --restart : 컨테이너 종료 시 적용할 재시작 정책 지정
    • --env : 컨테이너 환경 변수 지정
    • -v : 호스트 경로와 컨테이너 경로의 공유 불륨 설정
    • -h : 컨테이너의 호스트명 지정
    • -p : 호스트 포트와 컨테이너 포트 연걸
    • -P : 컨테이너 내부에 노출된 포트를 호스트 임의의 포트에 게시
    • --link=[container:container_id] : 동일 호스트의 다른 컨테이너와 연결 설정으로 IP가 아닌 컨테이너의 이름을 이용해 통신
  • docker start : 컨테이너 실행

  • docker ps : 실행된 컨테이너 조회

 

5. Dockerfile

원하는 개발환경을 코드로 구성하는 방법을 제공하는 것을 Dockerfile이라고 한다.

IaC(Infrastructure as Code) : 인프라 구축을 코드화(스크립트)하여 개발
IaC 지원 도구에는 도커, 앤서블, 쿠버네티스 등이 있다.

모든 컨테이너 환경은 획일적이고 동일하게 움직이지 않고 아이디어에 따라 다양하게 개발된다. 애플리케이션에 적용되는 새로운 환경을 사용자가 직접 정의해서 아이디어를 실현할 수 있는 것이 바로 코드로서 인프라 환경을 provisioning하는 Dockerfile인 것이다. Dockerfile에는 특정 컨테이너를 위한 이미지를 개발할 수 있는 필요한 모든 설정 내용들이 담겨있다. Dockerfile에서 사용되는 명령어는 17개 정도이고, 각 명령어의 의미와 권장 사용 방법을 통해 최적의 인프라 환경을 제공할 수 있다.

Dockerfile 명령어

  • FROM : (필수) 생성하려는 이미지의 베이스 이미지 지정

  • MAINTAINER : 일반적으로 이미지를 빌드한 작성자 이름과 이메일 작성

  • LABEL : 이미지 작성 목적으로 버전, 타이틀, 설명, 라이선스 정보 등 작성

  • RUN : 설정된 기본 이미지에 패키지 업데이트, 각종 패키지 설치, 명령 실행 등 작성

  • CMD : 생성된 이미지를 컨테이너로 실행할 때 실행되는 명령

  • ENTRYPOINT : 생성된 이미지가 컨테이너가 실행될 때 명령어 및 인자 값을 전달하여 실행

  • COPY : 호스트 환경의 파일, 디렉터리를 이미지 안에 복사하는 경우 작성

  • ADD : 호스트 환경의 파일, 디렉터리를 이미지 안에 복사하는 경우뿐만 아니라 URL 주소에서 직접 다운로드하여 이미지에 넣을 수도 있고, 압축 파일인 경우에는 지정한 경로에 압축을 풀어서 추가

  • ENV : 이미지 안에 각종 환경 변수를 지정하는 경우 작성

  • EXPOSE : 컨테이너가 호스트 네트워크를 통해 들어오는 트래픽을 리스닝하는 포트와 프로토콜을 지정하기 위해 작성

  • VOLUME : 볼륨을 이미지에 미리 설정하는 경우 작성

  • USER : 컨테이너의 기본 사용자는 root이지만, 애플리케이션이 권한 없이 서비스를 실행할 수 있다면 USER를 통해 다른 사용자로 변경하여 사용

  • WORKDIR : 컨테이너상에서 작업할 경로 전환을 위해 작성

  • ARG : docker build 시점에서 변숫값을 전달하기 위해 --build-arg=인자를 정의하여 사용

  • ONBUILD : 처음 이미지 빌드에 포함하지만 실행되지 않고, 해당 이미지가 다른 이미지의 기본 이미지로 사용되는 경우 실행될 명령을 지정할 때 작성

  • STOPSIGNAL : docker stop 명령은 컨테이너에게 SIGTERM을 보내어 정지하게 되는데, 이 때 다른 시그널을 넣고자 하는 경우 작성

  • HEALTHCHECK : 컨테이너의 프로세스 상태를 체크하고자 하는 경우 작성

  • SHELL : Dockerfile 내부에서 사용할 기본 셸을 지정하는 경우 작성 (기본값: /bin/sh)

 

6. 도커 컴포즈

도커 컴포즈(docker-compose)는 공통성을 갖는 컨테이너 애플리케이션 스택을 YAML 코드로 정의하는 정의서이며 그것을 실행하기 위해 다중 컨테이너 실행 도구이다. 도커 컴포즈로 실행된 컨테이너는 독립된 기능을 가지며 공통 네트워크로 구성되기 때문에 컨테이너 간 통신이 쉽다. 이렇게 도커 컴포즈는 공통성 있는 컨테이너들을 포함하여 쉽고 빠른 런타임을 제공한다.

도커 컴포즈는 테스트, 개발, 운영의 모든 환경에서 구성이 가능한 오케스트레이션 도구 중 하나다. 다만, 다양한 관리 기능을 갖고 있지 않기 때문에 테스트와 개발환경에 적합하다. 실제 운영 환경은 많은 관리적 요소가 필요하기 때문에 도커 스웜이나 쿠버네티스 같은 오케스트레이션 도구가 가지고 있는 자동 확장, 모니터링, 복구 등의 운영에 필요한 기능과 함께 사용할 것이 권장된다.

YAML 코드 작성

YAML 코드는 사용자가 쉽게 읽고 쓸 수 있는 텍스트 구조로 되어 있다. 다양한 프로그래밍 언어가 YAML 코드를 사용하는 이유는 해당 프로그래밍 언어의 라이브러리를 포함하고 있고, 명령어를 명령줄에서 사용하는 것보다 유연하게 사용할 수 있어 보다 복잡한 구조의 애플리케이션을 완성할 수 있기 때문이다. JSON 형식과 유사하지만 들여쓰기를 통해 계층을 나누며 공백 수로 블록을 구분한다.

도커 컴포즈에서 사용되는 YAML 코드는 docker-compose.yaml (또는 docker-compose.yml) 파일로 작성한다. docker-compose.yaml의 큰 구조는 다음과 같다.

version: "3.8"
services:
	서비스명1:
    	# 애플리케이션 설정값 정의1
    서비스명2:
    	# 애플리케이션 설정값 정의2
...
networks:
	# 네트워크 설정, 미지정 시 자동 생성
volumes:
	# 볼륨 설정

도커 컴포즈 명령어

  • build : Dockerfile을 이용한 빌드 또는 재빌드

  • config : 도커 컴포즈 구성 파일의 내용 확인

  • create : 서비스 생성

  • down : 도커 컴포즈 자원(컨테이너, 네트워크, 볼륨)을 일괄 정지 후 삭제

  • events : 컨테이너에서 실시간으로 이벤트 정보를 수신

  • exec : 실행 중인 컨테이너 명령 실행

  • help : 도움말

  • images : 사용된 이미지 정보

  • kill : 실행 중인 컨테이너 강제 정지 (docker kill과 동일)

  • logs : 컨테이너의 실행 로그 정보 보여줌

  • pause : 컨테이너 서비스 일지 정지

  • port : 포트 바인딩된 외부로 연결된 포트 출력

  • ps : 실행 중인 컨테이너 서비스 출력

  • pull : 서비스 이미지 가져오기

  • push : 서비스 이미지 올리기

  • restart : 컨테이너 서비스 재시작

  • rm : 정지된 컨테이너 서비스 제거

  • run : 실행 중인 컨테이너에 일회성 명령어 실행

  • scale : 컨테이너 서비스에 대한 컨테이너 수 설정(확장, 축소)

  • start : 컨테이너 서비스 시작

  • stop : 컨테이너 서비스 중지

  • top : 실행 중인 프로세스 출력

  • unpause : 컨테이너 서비스 일시 정지 해제

  • up : 컨테이너 서비스 생성과 시작(옵션 활용)

  • version : 버전 정보 표시 및 종료

 

References
도커, 컨테이너 빌드업!

profile
블록체인 개발 어때요

0개의 댓글