도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문

현장에서 바로 활용할 수 있는 컨테이너 개발 기법과 실전 기술

도커/쿠버네티스를 실무 현장에 적용하기 위한 ‘컨테이너 개발’ 입문서!

컨테이너 가상화 기술은 게스트 운영체제 없이 호스트 운영체제 위에 격리된 환경에서 가상화를 구현한다. 게스트 운영체제가 따로 존재하지 않으므로 호스트 운영체제의 요소를 공유하며 그만큼 중복되는 요소가 줄어 성능적 이점을 누릴 수 있다. 이 책은 이러한 컨테이너 가상화 기술을 애플리케이션 개발 및 배포에 도입하기 위한 입문서다. 도커/쿠버네티스를 실무에서 활용 중인 저자가 실무 스킬을 최신 정보와 함께 알기 쉽게 설명한다. 로컬 환경 테스트는 물론이고, Google Kubernetes Engine에 배포하는 법, AWS Fargate 활용법 등 클라우드를 도입하는 방법도 다룬다.

이 책은 도커와 쿠버네티스에 대한 기초 실력을 키우고, 컨테이너에 친화적인 애플리케이션을 개발하기 위한 포인트, 더 나아가 실제 운영 환경에 적합한 기본적인 기법 및 노하우를 전달할 수 있도록 구성하였다. 애플리케이션 개발에서 컨테이너가 필수 스킬이 되어가는데, 아직 컨테이너가 뭔지 모르는 개발자나 컨테이너를 운영환경에 도입하기는 아직 두렵다거나, 이름은 들어봤지만 사용해본 적이 없는 독자에게 꼭 필요한 컨테이너 개발 실무를 익힐 데 많은 도움이 될 것이다.

야마다 아키노리 (やまだあきのり)

주식회사 사이버 에이전트 소속. 개인방송 서비스 ‘FRESH LIVE’의 테크리드를 맡아 아키텍처 설계와 컨테이너를 이용한 개발을 주도함. 컨테이너 기술을 십분 활용한 진정한 애플리케이션 개발이 무엇인지 모색 중이다.

심효섭

연세대학교 문헌정보학과를 졸업하고 모교 중앙도서관과의 인연으로 도서관 솔루션 업체에서 일하게 되면서 개발을 시작했다. 네이버에서 웹 서비스 개발 업무를 맡았으며, 웹 서비스 외에 기계학습에 대한 공부도 꾸준히 하고 있다. 최근 관심사는 회사에 속하지 않고도 지속 가능한 삶이다. 옮긴 책으로 『PyTorch를 활용한 강화학습/심층강화학습 실전 입문』 『PyTorch를 활용한 머신러닝, 딥러닝 철저 입문』 『딥러닝 제대로 시작하기』 『그림과 수식으로 배우는 통통 딥러닝』 등이 있다.

  • ▣ 01장: 도커의 기초
    •  01. 도커란 무엇인가
      • 도커의 역사
      • 도커의 기본 개념
      • 도커 스타일 체험하기
      • 환경 차이로 인한 문제 방지
    •  02. 도커를 사용하는 의의
      • 애플리케이션 구성 관리의 용이성
      • 운영 환경에서 빛을 발하는 도커
      • 새로운 개발 스타일
    •  03. 로컬 도커 환경 구축하기
      • 윈도우용 도커 설치
      • macOS용 도커 설치
      • 윈도우용/macOS용 도커 기본 설정
    •  
  • ▣ 02장: 도커 컨테이너 배포
    •  01. 컨테이너로 애플리케이션 실행하기
      • 도커 이미지와 도커 컨테이너
      • 간단한 애플리케이션과 도커 이미지 만들기
      • 도커 이미지 빌드하기
      • 도커 컨테이너 실행
    •  02. 도커 이미지 다루기
      • docker image build - 이미지 빌드
      • docker search - 이미지 검색
      • docker image pull - 이미지 내려받기
      • docker image ls - 보유한 도커 이미지 목록 보기
      • docker image tag - 이미지에 태그 붙이기
      • docker image push - 이미지를 외부에 공개하기
    •  03. 도커 컨테이너 다루기
      • 도커 컨테이너의 생애주기
      • docker container run - 컨테이너 생성 및 실행
      • docker container ls - 도커 컨테이너 목록 보기
      • docker container stop - 컨테이너 정지하기
      • docker container restart - 컨테이너 재시작하기
      • docker container rm - 컨테이너 파기하기
      • docker container logs ? 표준 출력 연결하기
      • docker container exec - 실행 중인 컨테이너에서 명령 실행하기
      • docker container cp - 파일 복사하기
      • prune - 컨테이너 및 이미지 파기
    •  04. 운영과 관리를 위한 명령
      • docker container stats - 사용 현황 확인하기
    •  05. 도커 컴포즈로 여러 컨테이너 실행하기
      • docker-compose 명령으로 컨테이너 실행하기
    •  06. 컴포즈로 여러 컨테이너 실행하기
      • 젠킨스 컨테이너 실행하기
      • 마스터 젠킨스 용 SSH 키 생성
      • 슬레이브 젠킨스 컨테이너 생성
    •  
  • ▣ 03장: 컨테이너 실전 구축 및 배포
    •  01. 애플리케이션과 시스템 내 단일 컨테이너의 적정 비중
      • 컨테이너 1개 = 프로세스 1개?
      • 컨테이너 1개에 하나의 관심사
    •  02. 컨테이너의 이식성
      • 커널 및 아키텍처의 차이
      • 라이브러리와 동적 링크 문제
    •  03. 도커 친화적인 애플리케이션
      • 환경 변수 활용
      • 데이터 볼륨
    •  04. 퍼시스턴스 데이터를 다루는 방법
      • 데이터 볼륨 컨테이너
    •  05. 컨테이너 배치 전략
      • 도커 스웜
      • 서비스
      • 스택
      • 스웜 클러스터 외부에서 서비스 사용하기
    •  
  • ▣ 04장: 스웜을 이용한 실전 애플리케이션 개발
    •  01. 웹 애플리케이션 구성
      • 애플리케이션의 요구 조건
      • 아키텍처
      • Nginx
      • TODO 애플리케이션의 전체 구조
    •  02. MySQL 서비스 구축
      • 데이터베이스 컨테이너 구성
      • 인증 정보
      • MySQL 설정 - etc/mysql/mysql.conf.d/mysqld.conf
      • 레플리케이션 설정
      • MySQL(mysql_master/mysql_slave) Dockerfile
      • 스웜에서 마스터 및 슬레이브 실행
      • MySQL 컨테이너 확인 및 초기 데이터 투입
    •  03. API 서비스 구축
      • todoapi의 기본 구조
      • 애플리케이션 환경 변수 통제
      • MySQL 접속 및 테이블 매핑
      • 핸들러 구현하기
      • servePUT
      • API를 위한 Dockerfile
      • 스웜에서 todoapi 서비스 실행하기
    •  04. Nginx 구축
      • nginx.conf 파일 구성하기
      • Nginx 컨테이너의 Dockerfile
      • Nginx를 거쳐 API에 접근하기
    •  05. 웹 서비스 구축
      • TODO API 호출 및 페이지 HTML 렌더링
      • 웹 서비스의 Dockerfile
      • 정적 파일을 다루는 방법
      • Nginx를 통한 접근 허용
      • 인그레스로 서비스 노출하기
    •  06. 컨테이너 오케스트레이션을 적용한 개발 스타일
    •  
  • ▣ 05장: 쿠버네티스 입문
    •  01. 쿠버네티스란 무엇인가
      • 도커의 부상과 쿠버네티스의 탄생
      • 쿠버네티스의 역할
    •  02. 로컬 PC에서 쿠버네티스 실행
      • 윈도우용/macOS용 도커에 쿠버네티스 설치하기
    •  03. 쿠버네티스의 주요 개념
    •  04. 쿠버네티스 클러스터와 노드
    •  05. 네임스페이스
    •  06. 파드
      • 파드 생성 및 배포하기
      • 파드 다루기
    •  07. 레플리카세트
    •  08. 디플로이먼트
      • 레플리카세트의 생애주기
      • 롤백 실행하기
    •  09. 서비스
      • ClusterIP 서비스
      • NodePort 서비스
    •  10. 인그레스
      • LoadBalancer 서비스
      • ExternalName 서비스
      • 인그레스를 통해 접근하기
    •  
  • ▣ 06장: 쿠버네티스 클러스터 구축
    •  01. Google Kubernetes Engine 환경 설정
      • GCP 프로젝트 생성
      • 구글 클라우드 SDK(gcloud) 설치
      • 쿠버네티스 클러스터 생성
    •  02. GKE에 TODO 애플리케이션 구축
      • 퍼시스턴트볼륨과 퍼시트턴트볼륨클레임
    •  03. GKE에 MySQL을 마스터-슬레이브 구성으로 구축
      • 스토리지클래스(StorageClass)
      • 스테이트풀세트(StatefulSet)
    •  04. GKE에 TODO API를 구축
    •  05. GKE에 TODO 웹 애플리케이션 구축하기
    •  06. 인그레스로 웹 애플리케이션 노출하기
      • 클러스터를 구축할 서버 준비하기
    •  08. 온프레미스 환경에서 쿠버네티스 클러스터 구축
    •  09. kubespray를 사용한 쿠버네티스 클러스터 구축
      • 작업용 서버의 SSH 공개키 등록
      • IPv4 포워딩 활성화
      • 클러스터 설정
      • 클러스터 구축
    •  
  • ▣ 07장: 쿠버네티스 실전편
    •  01. 쿠버네티스의 그 외 리소스
      • 크론잡
      • 시크릿
    •  02. 사용자 관리와 RBAC
      • RBAC를 이용한 권한 제어
      • 서비스 계정
    •  03. 헬름
      • 헬름 설치
      • 헬름의 주요 개념
      • 차트 설치하기
      • 차트로 설치한 애플리케이션 제거하기
      • RBAC를 지원하는 애플리케이션 설치하기
      • 사용자 차트 생성하기
      • 롤링 업데이트
    •  04. 쿠버네티스 배포 전략
      • 실행 중인 컨테이너에 대한 헬스 체크 설정
      • 블루-그린 배포
    •  
  • ▣ 08장: 컨테이너 운영
    •  01. 로깅 운영
      • 컨테이너에서 생성되는 로그
      • 로깅 드라이버
      • 컨테이너 로그 다루기
      • Fluentd와 Elasticsearch를 이용한 로그 수집 및 검색 기능 구축
      • fluentd 로깅 드라이버의 운영 구조
      • 쿠버네티스에서 로그 관리하기
      • 그 외의 로그 수집 도구
      • 컨테이너의 라이브 리스토어
    •  02. 도커 호스트 및 데몬 운영
      • dockerd 튜닝하기
      • 도커 운영 시의 장애 대책
    •  03. 장애 대책
      • 쿠버네티스 운영 시의 장애 대책
      • 헬름의 릴리스 히스토리 제한
    •  
  • ▣ 09장: 가벼운 도커 이미지 만들기
    •  01. 가벼운 도커 이미지가 왜 필요할까
      • 이미지 크기 증가에 따라 나타나는 문제
    •  02. 기반 이미지를 가볍게
      • scratch
      • BusyBox
      • 알파인 리눅스
      • 배포 대상 애플리케이션의 크기 줄이기
    •  03. 가벼운 도커 이미지 만들기
      • 도커 이미지의 레이어 구조 고려하기
      • 빌드 컨테이너와 실행 컨테이너의 분리
    •  04. 멀티 스테이지 빌드
      • 소프트웨어 및 도구 통일
    •  
  • ▣ 10장: 다양한 도커 활용 방법
    •  01. 팀 개발에서 개발 환경 통일하기
      • 개발 환경은 집단지성의 결과
    •  02. 도커 컨테이너에서 명령행 도구(CLI) 사용하기
      • 이미지에서 명령행 도구 버전 변경하기
      • 도커 컨테이너로 셸 스크립트 실행하기
      • 테스트 환경 구축
    •  03. 부하 테스트
      • 마스터-슬레이브 구성으로 부하 테스트하기
    •  
  • ▣ 부록A: 보안
    •  01. 공개된 도커 이미지의 안전성
      • 도커 허브
      • Quay.io
      • Docker Bench for Security
    •  02. 안전한 도커 이미지와 도커 운영 체계 꾸리기
      • 컨테이너에 파일을 추가하면서 발생하는 위험
      • 적절한 접근 제어
      • 기밀정보 취급
    •  
  • ▣ 부록B: 도커로 개발을 지원하는 도구 및 서비스
    •  01. 인하우스 도커 레지스트리 구축
      • Registry(Docker Distribution)
      • CircleCI
    •  02. 도커와 CI/CD 서비스 연동
    •  03. ECS에서 AWS Fargate를 이용한 컨테이너 오케스트레이션
      • Fargate로 ECS 클러스터 구축하기
      • ECS를 조작해 애플리케이션 배포하기
    •  
  • ▣ 부록C: 주요 명령어 정리
    •  01. 도커 명령어
    •  02. Dockerfile 인스트럭션
    •  03. 도커 컴포즈 명령어
    •  04. 도커 스웜/스택 명령어
      • helm init
    •  05. 헬름 명령어
      • helm version
      • helm create
      • helm lint
      • helm package
      • helm repo list
      • helm repo add
      • helm repo remove
      • helm repo update
      • helm search
      • helm fetch
      • helm serve
      • helm install
      • helm update
      • helm list
      • helm get
      • helm delete
  • 107쪽, 코드 첫 번째 줄 코드 수정

    $ docker container run -v ${PWD}:/tmp \

  • 137쪽, 페이지 하단 셸 스크립트의 6번째 줄

      return 0
    

    ==>

      exit 0
    
  • 137쪽, 페이지 하단 셸 스크립트의 14번째 줄

    return 1
    

    ==>

    exit 1
    
  • 163쪽, 코드와 코드 설명글에서

    BACKEND_MAX_FAILES --> BACKEND_MAX_FAILS

  • 175쪽, 예제 코드의 밑에서 5번째 줄

    "/etc/nginx/conf.d/nuxt.conf", \ # <-- public.conf를 nuxt.js로 수정
    

    ==>

    "/etc/nginx/conf.d/nuxt.conf", \ # <-- public.conf를 nuxt.conf 수정
    
  • 176쪽, 페이지 하단 예제 코드를 다음과 같이 수정

    version: "3"
    services:
      nginx:
        image: registry:5000/ch04/nginx-nuxt:latest
        deploy:
          replicas: 2
          placement:
            constraints: [node.role != manager]
        depends_on:
          - web
        ... (이하 생략) ...
    
  • 225쪽, 본문 4번째 줄

    인스턴스 수 등을 지정한다.

    ==>

    인스턴스 수 등을 지정한다. GKE에서는 구 버전을 사용할 수 없을 수도 있으므로 주의하라.

  • 225쪽, 페이지 상단 코드 블록의 첫 번째 줄

    $ gcloud container clusters create gihyo --cluster-version=1.10.4-gke.2 \
    

    ==>

    $ gcloud container clusters create gihyo --cluster-version=1.15.7-gke.2 \
    
  • 225쪽, 페이지 하단 6번 각주 내용을 다음 내용으로 교체

    gcloud container get-server-config --zone asia-northeast1 명령에서 출력되는 validMasterVersions 값 중 한 가지 버전.

  • 261쪽, 첫 번째 줄

    지금부터는 로컬 쿠버네티스 환경에서 --> 지금부터는 클라우드 쿠버네티스 환경에서

  • 261쪽, 표 바로 위의 줄에서

    이 리소스를 사용해 로컬 쿠버네티스 환경에서 일반 사용자의 권한을 제어해 보자 --> 이 리소스를 사용해 일반 사용자의 권한을 제어해 보자

  • 273쪽, 본문 11번째 줄

    헬름 코드 저장소의 배포본 페이지24에서 최신 버전을 내려받아 설치한다.

    ==>

    헬름 코드 저장소의 배포본 페이지24에서 v2.x 버전을 내려받아 설치한다.

  • 280쪽, 페이지 하단 코드 블록의 첫 번째 줄

    $ helm install -f jenkins.yaml --name jenkins stable/jenkins
    

    ==>

    $ helm install -f jenkins.yaml --name jenkins stable/jenkins --version 0.13.0
    
  • 329쪽, 마지막 문장은 아래 문장으로 수정

    그리고 다음과 같이 kibana.yaml 파일을 적용합니다.