도커/쿠버네티스 컨테이너 개발 실전 입문 · · 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
- helloworld 작성
2. 도커를 사용하는 의의
환경 차이로 인한 문제 방지
- 코드로 관리하는 인프라(Infrastructure as Code)와 불변 인프라(Immutable Infrastructure)
- 코드로 관리하는 인프라 : 코드 기반으로 인프라를 정의한다는 개념
- 코드 기반으로 인프라 구축을 관리한다고 해도 멱등성을 보장하기 위해 항구적인 코드를 계속 작성하는 것은 운영 업무에 부담을 주기 쉽다.
- 서버의 대수가 늘어날수록 모든 서버에 구성을 적용하는 시간도 늘어난다.
- 불변 인프라 : 어떤 시점의 서버 상태를 저장해 복제할 수 있게 하자는 개념
- 한번 설정된 서버는 수정 없이 파기되므로 멱등성을 신경 쓸 필요조차 없다.
- 도커를 사용하면 코드로 관리하는 인프라와 불변 인프라의 두 개념을 간단하고 낮은 비용으로 실현할 수 있다.
- 도커는 인프라 구성이 Dockerfile로 관리되므로 코드로 관리하는 인프라는 도커의 대원칙이다.
- 도커는 인프라 실행에 걸리는 시간이 적은 만큼 구성을 수정하지 않고 인프라를 완전히 새로 만든는 불변 인프라와 궁합이 잘 맞는다.
- 어플리케이션과 인프라 묶어 구축하기
- 도커 컨테이너 : 운영체제와 어플리케이션을 함께 담는 상자 같은 개념
- 어플리케이션과 인프라를 함께 관리한 결과로 얻은 높은 이식성
- 코드로 관리하는 인프라(Infrastructure as Code)와 불변 인프라(Immutable Infrastructure)
어플리케이션 구성 관리의 용이성
- 일정 규모를 넘는 시스템은 주로 여러 개의 어플리케이션과 미들웨어를 조합하는 형태로 구성한다.
- 이 상자를 여러 개 조합하지 않으면 시스템을 구성할 수 없다는 뜻이다.그 결과 시스템 전체에 대한 적절한 구성 관리가 필요해졌다.
- 도커 컨테이너 오케스트레이션 시스템
- 오케스트레이션 : 여러 서버에 걸쳐 있는 여러 컨테이너를 관리하는 기법
- 여러 컨테이너를 사용하는 어플리케이션을 쉽게 관리할 수 있도록 도커 컴포즈(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
- apt 패키지 업데이트
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
- yum 패키지 업데이트
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
- Old version 제거