도커/쿠버네티스 컨테이너 개발 실전 입문 · · 5 min read

CH01. 도커의 기본

1. 도커란 무엇인가?

  • 도커

    • 컨테이너형 가상화 기술을 구현하기 위해 상주 어플리케이션과 이 어플리케이션을 조작하기 위한 명령행 도구로 구성되는 프로덕트다.
    • 어플리케이션 배포에 특화되어 있기 때문에 어플리케이션 개발 및 운영을 컨테이너 중심으로 할 수 있다.
  • 도커의 역사

    • 2013년 봄 닷클라우드(현재는 Docker) 사의 엔지니어였던 솔로몬 하익스가 최초로 도커를 오픈 소스로 공개했다.
    • 도커가 인기를 얻게 되자 Docker사는 오케스트레이션 도구인 Fig를 시작으로 도커의 지원도구를 하나씩 인수하면서 세력을 확대했다.
    • 현재는 컨테이너 관련 기술의 사실상 표준 지위를 차지하고 있다.
    • 그 뒤로 크로스 플랫폼 지원을 확대하고 엔터프라이즈용 지원을 보강하면서 기업과 개인 등 다양한 계층으로 사용층을 넓히고 있다.
    • 최근 컨테이너 기술을 한층 더 개방해 도커 및 관련 생태계 개발을 추진한다고 발표했다.
  • 기본 개념

    • 도커는 컨테이너형 가상화를 구현하기 위해 상주 어플리케이션과 이를 관리하는 명령형 도구로 구성된다.
    • 컨테이너형 가상화 기술
      • 도커는 컨테이너형 가상화 기술을 사용한다.
      • 도커가 등장하기 전에는 LXC가 유명했는데, 도커도 초기에는 컨테이너형 가상화를 구현하는 데 LXC를 런타임으로 사용했다.(현재는 runC를 사용)
      • 컨테이너형 가상화를 사용하면 가상화 소프트웨어 없이도 운영 체제의 리소스를 격리해 가상 운영체제로 만들 수 있다.
      • 컨테이너를 만들면서 발생하는 오버헤드는 다른 가상화 소프트웨어보다 더 적다.
    • 어플리케이션이 중심이 되는 도커
      • LXC는 호스트 운영 체제 가상화보다 성능면에서 유리하다는 장점으로 시스템 컨테이너로서 어느 정도 자리를 잡았다.
      • 하지만 이식성이 낮았다.
      • LXC와 Docker의 차이점
        • 호스트 운영 체제의 영향을 받지 않는 실행 환경
        • DSL(Dockerfile)을 이용한 컨테이너 구성 및 어플리케이션 배포 정의
        • 이미지 버전 관리
        • 레이어 구조를 갖는 이미지 포맷
        • 도커 레지스트리(이미지 저장 서버 역할을 함)
        • 프로그램 가능한 다양한 기능의 API
      • Docker는 컨테이너 정보를 Dockerfile 코드로 관리할 수 있다.
      • 이 코드를 기반으로 복제 및 배포가 이루어지기 때문에 재현성이 높은 것이 특징이다.
  • 도커 스타일 체험하기

    • helloworld 작성
      #!/bin/sh
      echo "Hello, World!"
      
    • Dockerfile 작성
      FROM ubuntu:16.04
      COPY helloworld /usr/local/bin
      RUN chmod +x /usr/local/bin/helloworld
      CMD ["helloworld"]
      
      • FROM 절 : 컨테이너의 틀 역할을 할 도커 이미지를 정의
      • COPY 절 : 조금 전 작성한 셸 스크립트 파일을 도커 컨테이너 안의 /usr/local/bin에 복사하라고 정의
      • RUN 절 : 도커 컨테이너 안에서 어떤 명령을 수행하기 위한 것이다. 여기까지가 도커 빌드 과정에서 실행되며 그 결과 새로운 이미지가 만들어진다.
      • CMD 절 : 완성된 이미지를 컨테이너로 실행하기 전에 먼저 실행할 명령을 정의한다.
    • 이미지 빌드
      $ docker image build -t helloworld:latest .
      
      • -t : 태그를 주겠다는 옵션
    • 도커 컨테이너 실행
      $ docker container run -t helloworld:latest
      

2. 도커를 사용하는 의의

  • 환경 차이로 인한 문제 방지

    • 코드로 관리하는 인프라(Infrastructure as Code)와 불변 인프라(Immutable Infrastructure)
      • 코드로 관리하는 인프라 : 코드 기반으로 인프라를 정의한다는 개념
      • 코드 기반으로 인프라 구축을 관리한다고 해도 멱등성을 보장하기 위해 항구적인 코드를 계속 작성하는 것은 운영 업무에 부담을 주기 쉽다.
      • 서버의 대수가 늘어날수록 모든 서버에 구성을 적용하는 시간도 늘어난다.
      • 불변 인프라 : 어떤 시점의 서버 상태를 저장해 복제할 수 있게 하자는 개념
      • 한번 설정된 서버는 수정 없이 파기되므로 멱등성을 신경 쓸 필요조차 없다.
      • 도커를 사용하면 코드로 관리하는 인프라와 불변 인프라의 두 개념을 간단하고 낮은 비용으로 실현할 수 있다.
      • 도커는 인프라 구성이 Dockerfile로 관리되므로 코드로 관리하는 인프라는 도커의 대원칙이다.
      • 도커는 인프라 실행에 걸리는 시간이 적은 만큼 구성을 수정하지 않고 인프라를 완전히 새로 만든는 불변 인프라와 궁합이 잘 맞는다.
    • 어플리케이션과 인프라 묶어 구축하기
      • 도커 컨테이너 : 운영체제와 어플리케이션을 함께 담는 상자 같은 개념
      • 어플리케이션과 인프라를 함께 관리한 결과로 얻은 높은 이식성
  • 어플리케이션 구성 관리의 용이성

    • 일정 규모를 넘는 시스템은 주로 여러 개의 어플리케이션과 미들웨어를 조합하는 형태로 구성한다.
    • 이 상자를 여러 개 조합하지 않으면 시스템을 구성할 수 없다는 뜻이다.그 결과 시스템 전체에 대한 적절한 구성 관리가 필요해졌다.
    • 도커 컨테이너 오케스트레이션 시스템
      • 오케스트레이션 : 여러 서버에 걸쳐 있는 여러 컨테이너를 관리하는 기법
      • 여러 컨테이너를 사용하는 어플리케이션을 쉽게 관리할 수 있도록 도커 컴포즈(Docker compose)라는 도구를 제공한다.(yaml 포맷 형식의 파일로 제어)
      • 도커 컴포즈(Docker Compose) : 여러 컨테이너를 관리하는 것만을 목적으로 함
      • 도커 스웜(Docker Swarm) : 컨테이너 증가 혹은 감소는 물론이고 노드의 리소스를 효율적으로 활용하기 위한 컨테이너 배치 및 로드 밸런싱 기능 등 더욱 실용적인 기능을 갖추고 있다.
      • 쿠버네티스(Kubernetes) : 컨테이너 오케스트레이션 분야에서의 표준
  • 새로운 개발 스타일

    • 전보다는 어플리케이션 개발에 집중할 수 있는 분위기가 되었다.
    • 인프라와 어플리케이션의 설정을 모두 코드 수준에서 쉽게 수정할 수 있게 되었다.
    • 기존에는 명확했던 인프라 엔지니어와 서버 사이드 엔지니어의 영역 구분이 점점 희미해지고 있다.
    • 프론트엔드 엔지니어와 모바일 어플리케이션 엔지니어에게도 기초 기술이 될 것이다.

3. 로컬 도커 환경 구축

  • Linux 환경에 도커 설치 :: Ubuntu 18.04

    • apt 패키지 업데이트
      $ sudo apt update -y
      
    • 의존성 패키지 설치
      $ sudo apt install -y apt-transport-https ca-certificates  curl software-properties-common
      
    • 도커 패키지 저장소 등록
      $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
      $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
      
    • 다시 패키지 목록 업데이트
      $ sudo apt update -y
      
    • 도커 설치
      • 최신
        $ sudo apt install -y docker-ce
        
      • 설치버전 지정
        $ sudo apt install -y docker-ce=18.03.0 ce-0 ubuntu
        
    • 확인
      $ docker version
      
  • Linux 환경에 도커 설치 :: CentOS 7

    • yum 패키지 업데이트
      $ sudo yum update -y
      
    • 도커 설치 및 도커 레지스트리 설치
      $ sudo yum install -y docker docker-registry
      $ sudo yum install -y epel-release
      $ sudo yum install -y jq
      
    • 서비스 등록 및 시작
      $ systemctl enable docker.service
      $ systemctl start docker.service
      $ systemctl status docker.service
      
    • 확인
      $ docker version
      
  • Linux 환경에 도커 설치 :: CentOS 7 최신 버전 설치

    • Old version 제거
      $ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-engine
      
    • yum-config-manager를 사용하기 위하여 yum-utils 설치 및 repo 추가
      $ yum install y yum-utils
      $ yum-config-manager --add-repo https://download.docker.com/linux/centos//docker-ce.repo
      
    • 리포지토리 추가 제거 방법
      $ yum-config-manager --enable docker-ce-nightly
      $ yum-config-manager --enable docker-ce-test
      
      $ yum-config-manager --disable docker-ce-nightly
      $ yum-config-manager --disable docker-ce-test
      
    • 도커 엔진 설치
      $ yum install docker-ce docker-ce-cli containerd.io
      
      • 특정 버전 설치
        $ yum install docker-ce-<specific version> docker-ce-cli-<specific version> containerd.io
        
    • 시작 프로그램 등록 및 시작
      $ systemctl enable docker
      $ systemctl start docker
      $ systemctl status docker