스터디 개요
📖 사용 교재
처음부터 제대로 배우는 도커/쿠버네티스 컨테이너 개발과 운영
- 저자: 야마다 아키노리
- 출판사: 제이펍 (2025년 5월 출간)
- 가격: 36,000원
목차
📖 CHAPTER 1. 컨테이너와 도커 기초
1.1 컨테이너란?
- 1.1.1 컨테이너형 가상화
- 1.1.2 컨테이너 사용 사례
- COLUMN 컨테이너의 단점
1.2 도커란?
- 1.2.1 도커와 Docker, Inc.의 역사
- 1.2.2 애플리케이션 배포에 초점을 맞춘 도커
- 1.2.3 도커 접하기
- COLUMN Moby 프로젝트
1.3 컨테이너를 사용하는 이유
- 1.3.1 불변하는 애플리케이션과 실행 환경에 의한 재현성 확보
- COLUMN 클라우드의 IaC와 Immutable Infrastructure
- COLUMN 컨테이너 기술과 서버리스 플랫폼
- 1.3.2 애플리케이션 구성 관리의 용이성
- 1.3.3 환경과 상관없이 실행 가능한 높은 이식성
- 1.3.4 컨테이너 기반 개발의 효율성
1.4 로컬 컨테이너 실행 환경 구축
- 1.4.1 도커 데스크톱 설치
- COLUMN ARM 아키텍처
- 1.4.2 도커 데스크톱 설정
- 1.4.3 도커 데스크톱 트러블슈팅
- COLUMN Linux 환경 설치
- COLUMN 도커의 구독 플랜
🚀 CHAPTER 2. 컨테이너 배포
2.1 컨테이너로 애플리케이션 실행하기
- 2.1.1 컨테이너 이미지와 컨테이너의 기초
2.2 간단한 애플리케이션과 컨테이너 이미지 만들기
- 2.2.1 Dockerfile의 인스트럭션
- COLUMN CMD 실행 시 덮어쓰기
- COLUMN ENTRYPOINT로 커맨드 실행하는 방법 알아보기
- COLUMN Dockerfile의 다른 인스트럭션
- COLUMN CMD의 지정 방식
- 2.2.2 컨테이너 실행하기
- COLUMN 짧은 도커 커맨드
2.3 이미지 다루기
- 2.3.1 docker image build - 이미지 빌드
- 2.3.2 docker search - 이미지 검색
- 2.3.3 docker image pull - 이미지 가져오기
- 2.3.4 docker image ls - 이미지 리스트
- 2.3.5 docker image tag - 이미지 태그
- 2.3.6 docker login - 컨테이너 레지스트리 로그인
- 2.3.7 docker image push - 이미지 공개
- COLUMN GHCR에 컨테이너 이미지 공개하기
2.4 컨테이너 다루기
- 2.4.1 컨테이너의 라이프 사이클
- 2.4.2 docker container run - 컨테이너 생성과 실행
- COLUMN 커맨드 실행 시 자주 사용되는 옵션
- 2.4.3 docker container ls - 컨테이너 리스트
- 2.4.4 docker container stop - 컨테이너 중지
- 2.4.5 docker container rm - 컨테이너 파기
- 2.4.6 docker container logs - 로그(표준 스트림 출력) 확인하기
- 2.4.7 docker container exec - 실행 중인 컨테이너에서 커맨드 실행
- 2.4.8 docker container cp - 파일 복사
2.5 운영 관리를 위한 커맨드
- 2.5.1 prune - 파기
- 2.5.2 docker container stats - 사용 상태 가져오기
2.6 도커 컴포즈
- 2.6.1 도커 컴포즈를 사용한 단일 컨테이너 실행
- 2.6.2 컴포즈를 사용해 여러 컨테이너 실행하기
🔧 CHAPTER 3. 실용적인 컨테이너의 구축과 배포
3.1 애플리케이션과 컨테이너의 구성
- 3.1.1 하나의 컨테이너 = 하나의 프로세스?
- 3.1.2 하나의 컨테이너에 하나의 관심사
3.2 컨테이너의 이식성
- 3.2.1 커널 및 아키텍처와의 차이
- COLUMN Windows에서 동작하는 컨테이너
- 3.2.2 라이브러리, 동적 링크
3.3 컨테이너 친화적인 애플리케이션
- 3.3.1 설정 파일을 포함하여 이미지 빌드하기
- 3.3.2 컨테이너 외부의 설정 파일 사용하기
- COLUMN 컨테이너 친화적인 프로덕트만 있는 것은 아니다.
3.4 보안 정보를 다루는 방법
- 3.4.1 보안 정보를 받는 컨테이너
- 3.4.2 버전 관리 시스템과 보안 정보 관리의 어려움
- 3.4.3 시크릿을 사용한 보안 정보 관리
- COLUMN 소프트웨어 공급망 공격
- 3.4.4 완벽한 대책은 존재하지 않는다
3.5 영속성 데이터의 사용 방법
- 3.5.1 Data Volume
- 3.5.2 Data Volume 컨테이너
🏗️ CHAPTER 4. 여러 컨테이너의 구성을 통한 애플리케이션 구축
4.1 웹 애플리케이션 구성
- 4.1.1 애플리케이션 스펙
- 4.1.2 아키텍처
4.2 MySQL 구축
- 4.2.1 MySQL에 접속하는 유저의 비밀번호 생성하기
- 4.2.2 MySQL 컨테이너 추가 설정하기
- 4.2.3 MySQL의 Dockerfile
- 4.2.4 MySQL 컨테이너의 구성 설정하기
4.3 데이터베이스 마이그레이터 구축
- 4.3.1 golang-migrate로 데이터베이스 마이그레이션하기
- 4.3.2 마이그레이션 실행 스크립트
- 4.3.3 데이터베이스 마이그레이터의 Dockerfile
- COLUMN .dockerignore 파일
- 4.3.4 데이터베이스 마이그레이터 컨테이너의 구성 설정하기
4.4 API 서버와 웹서버 구축
- 4.4.1 리포지터리 디렉터리 구성
- COLUMN 폴리레포와 모노레포
- 4.4.2 실행 파일과 커맨드 상세
- 4.4.3 API 서버의 구축
- 4.4.4 웹서버 구축
4.5 리버스 프록시 구축
- 4.5.1 nginx 컨테이너의 템플릿 구조
- COLUMN entrykit
- 4.5.2 Dockerfile
4.6 여러 컨테이너를 구성하여 작업 관리 앱 실행하기
- 4.6.1 compose.yaml
- 4.6.2 작업 관리 앱 실행하기
4.7 Tilt로 여러 컨테이너 구성을 통한 개발 경험 향상
- 4.7.1 Tilt 실행
- 4.7.2 Tilt의 강력한 기능
4.8 컨테이너 오케스트레이션 기초 정리
☸️ CHAPTER 5. 쿠버네티스 입문
5.1 쿠버네티스란?
- 5.1.1 도커의 번성과 쿠버네티스의 탄생
- 5.1.2 쿠버네티스의 위상
5.2 로컬 환경에서 쿠버네티스 실행하기
- 5.2.1 도커 데스크톱에서 로컬 쿠버네티스 환경 구축하기
- COLUMN 다른 쿠버네티스 구축 도구
5.3 쿠버네티스 개요
5.4 쿠버네티스 클러스터와 노드
- COLUMN 컨트롤 플레인을 구성하는 관리 컴포넌트
5.5 네임스페이스
5.6 파드
- 5.6.1 파드 생성하고 배포하기
- 5.6.2 파드 조작하기
- COLUMN 파드와 파드 내부 컨테이너의 주소
5.7 레플리카셋
5.8 디플로이먼트
- 5.8.1 레플리카셋 라이프 사이클
- 5.8.2 롤백 실행하기
5.9 서비스
- 5.9.1 레이블 셀렉터를 사용한 트래픽 라우팅
- COLUMN 서비스의 이름 분석
- 5.9.2 ClusterIP 서비스
- 5.9.3 Headless 서비스
- 5.9.4 NodePort 서비스
- 5.9.5 LoadBalancer 서비스
- 5.9.6 ExternalName 서비스
5.10 인그레스
- 5.10.1 인그레스 컨트롤러와 인그레스 클래스
- 5.10.2 인그레스를 통한 액세스
- COLUMN kubectl로 리소스 타입과 리소스명을 지정하는 방법
- COLUMN Tilt로 매니페스트 파일의 업데이트를 감지하고, 자동으로 리소스 업데이트하기
- COLUMN k9s
- COLUMN 쿠버네티스 API
🚢 CHAPTER 6. 쿠버네티스 배포와 클러스터 구축
6.1 작업 관리 앱 구성
- 6.1.1 작업 관리 앱을 구성하는 쿠버네티스 리소스
6.2 작업 관리 앱을 쿠버네티스에 배포하기
- 6.2.1 네임스페이스
- 6.2.2 시크릿
- 6.2.3 MySQL 배포
- COLUMN 스테이트풀셋의 serviceName
- 6.2.4 데이터베이스 마이그레이터 배포
- 6.2.5 API 서버 배포
- 6.2.6 웹서버 배포
6.3 쿠버네티스 애플리케이션 온라인에 공개하기
- 6.3.1 Azure Kubernetes Service 배포
- COLUMN 자체 도메인과 HTTPS로 애플리케이션 공개하기
- COLUMN kubectx
⚙️ CHAPTER 7. 쿠버네티스 활용
7.1 파드 배포 전략
- 7.1.1 RollingUpdate
- COLUMN 리소스의 일부를 업데이트하는 kubectl patch 커맨드
- 7.1.2 컨테이너 실행 시 상태 체크 설정하기
- COLUMN 안전하게 애플리케이션을 중지하고 파드 삭제하기
- 7.1.3 Blue-Green Deployment
- COLUMN 서비스 메시를 구현하는 프로덕트
7.2 쿠버네티스에서 정기적인 배치 작업 실행하기
- 7.2.1 크론잡
- 7.2.2 타임존을 고려한 크론잡 실행
- 7.2.3 크론잡에서 잡을 일회성으로 실행하기
7.3 유저 관리와 Role-Based Access Control(RBAC)
- 7.3.1 RBAC를 사용해 권한 제어 구현하기
- 7.3.2 클러스터 롤 생성
- 7.3.3 서비스 어카운트 생성
- 7.3.4 클러스터 롤 바인딩 생성
- 7.3.5 일반 유저
📦 CHAPTER 8. 쿠버네티스 애플리케이션 패키징
8.1 Kustomize
- 8.1.1 기본적인 사용 방법
- COLUMN 권장하지 않는 commonLabels
- 8.1.2 재사용과 부분 오버레이
- 8.1.3 Kustomize에서 시크릿 다루기
- 8.1.4 네트워크를 경유해서 매니페스트 생성하기
8.2 Helm
- 8.2.1 Helm 설치
- 8.2.2 Helm Chart와 리포지터리
- 8.2.3 Chart 설치하기
- 8.2.4 자체 Chart 생성하기
- COLUMN 쿠버네티스의 권장 레이블
- 8.2.5 Chart를 레지스트리에 등록하기
- COLUMN GHCR의 패키지와 리포지터리 연결하기
- COLUMN Open Container Initiative(OCI)
🔍 CHAPTER 9. 컨테이너 운영
9.1 로그 운영
- 9.1.1 컨테이너 로그
- 9.1.2 컨테이너 로그 운영
- 9.1.3 Elastic Stack에 의한 로그 수집, 관리 구성의 구축
- COLUMN 안정화된 Elasticsearch 선택하기
- COLUMN 클라우드의 자체 로그 관리
- 9.1.4 stern
9.2 가용성이 높은 쿠버네티스 운영
- 9.2.1 노드 장애 시 쿠버네티스 동작
- 9.2.2 Pod AntiAffinity를 통해 장애 저항성이 뛰어난 파드 배포 전략
- 9.2.3 CPU를 많이 사용하는 파드를 Node Affinity로 분리하기
- 9.2.4 Horizontal Pod Autoscaler를 사용한 파드의 오토스케일
- 9.2.5 Cluster Autoscaler를 사용한 노드의 오토 스케일
- COLUMN 쿠버네티스 클러스터와 노드 운영을 가볍게 하는 구조
🏎️ CHAPTER 10. 최적의 컨테이너 이미지 생성과 운영
10.1 운영에 최적인 컨테이너 이미지란?
- 10.1.1 이미지 사이즈 증가로 인해 발생하는 문제
10.2 경량 베이스 이미지
- 10.2.1 scratch
- 10.2.2 BusyBox
- 10.2.3 Alpine Linux
- COLUMN Alpine Linux 베이스 이미지의 사용 여부
- 10.2.4 Distroless
10.3 경량 컨테이너 이미지 생성하기
- 10.3.1 배포하는 애플리케이션의 사이즈 줄이기
- 10.3.2 컨테이너 이미지의 레이어 구조 의식하기
10.4 Multi-stage builds
- 10.4.1 빌드 컨테이너와 실행 컨테이너 나누기
- COLUMN 외부 이미지를 스테이지로 사용하기
10.5 BuildKit
- 10.5.1 BuildKit이란?
- 10.5.2 컨테이너의 멀티 플랫폼 대응
- 10.5.3 BuildKit으로 멀티 플랫폼에 대응하는 이미지 빌드하기
- COLUMN QEMU
- COLUMN 멀티 플랫폼 이미지는 어디까지 대응해야 할까?
10.6 안전한 컨테이너 이미지의 사용과 생성
- 10.6.1 컨테이너 이미지를 최소한으로 구성하기
- 10.6.2 권한 모드로 실행 피하기
- 10.6.3 root 유저로 실행 피하기
- 10.6.4 신뢰할 수 있는 컨테이너 이미지와 도구 사용하기
- 10.6.5 Trivy로 컨테이너 이미지 취약성 체크하기
10.7 CI 도구로 컨테이너 이미지 빌드하기
- 10.7.1 GitHub Actions
- 10.7.2 템플릿에서 리포지터리 생성하기
- 10.7.3 워크플로 설정
- 10.7.4 워크플로 실행
- COLUMN 운영에서는 latest 이미지 태그 피하기
🔄 CHAPTER 11. 컨테이너의 지속적 전달
11.1 지속적 전달이란?
- 11.1.1 다듬어지지 않은 배포 프로세스가 일으키는 문제
- 11.1.2 소프트웨어 전달의 중요성과 CI/CD 구분
- 11.1.3 GitOps 방식의 지속적 전달
11.2 Flux
- 11.2.1 Flux 설치
- 11.2.2 애플리케이션 배포
11.3 Argo CD
- 11.3.1 Argo CD 설치
- 11.3.2 애플리케이션 배포
11.4 PipeCD
- 11.4.1 PipeCD의 특징
- 11.4.2 퀵 스타트 환경 구축
- 11.4.3 애플리케이션 배포
- COLUMN PipeCD에서 Control Plane과 Piped를 각각 구축하는 이유
11.5 소프트웨어 전달의 완전 자동화
- 11.5.1 매니페스트로 정의하는 컨테이너 이미지 태그를 자동 업데이트하기
- COLUMN GitOps에 승인 프로세스 넣기
🎯 CHAPTER 12. 컨테이너의 다양한 활용 방법
12.1 팀 개발에서 개발 환경을 통일하고 공유하기
- 12.1.1 사용하는 소프트웨어와 도구 통일하기
- 12.1.2 개발 환경과 집단 지성
- COLUMN 컨테이너가 Vagrant를 대체할 수 있을까?
12.2 커맨드 라인 도구를 컨테이너에서 사용하기
- 12.2.1 Trivy를 컨테이너에서 실행하기
- 12.2.2 셸 스크립트를 컨테이너에서 실행하기
12.3 부하 테스트
- 12.3.1 Locust 개요
- 12.3.2 쿠버네티스에서 애플리케이션의 부하 테스트
- COLUMN k6에서 부하 테스트 실행
🛠️ APPENDIX A. 개발 도구 셋업
A.1 WSL2
- A.1.1 WSL2의 조건
- A.1.2 WSL2의 설치
- A.1.3 WSL2로 사용할 수 있는 배포판
- A.1.4 make 설치
- COLUMN WSL2를 사용하는 개발 스타일 정착
A.2 asdf
- A.2.1 asdf란?
- A.2.2 asdf 설치
- A.2.3 도구 설치
- A.2.4 사용하는 버전 설정
A.3 kind
- A.3.1 kind 설치
- A.3.2 멀티 노드의 쿠버네티스 클러스터를 로컬 환경에 구축하기
- COLUMN Docker in Docker / Container in Container
A.4 Rancher Desktop
☁️ APPENDIX B. 다양한 컨테이너 오케스트레이션 환경
B.1 Google Kubernetes Engine
- B.1.1 GKE 클러스터의 구축 준비
- B.1.2 GKE 클러스터 구축
B.2 Amazon Elastic Kubernetes Service
- B.2.1 EKS 클러스터 구축 준비
- B.2.2 eksctl을 사용해 EKS 클러스터 구축
- COLUMN EKS on Fargate
B.3 Azure Kubernetes Service
- B.3.1 AKS 클러스터의 구축 준비
- B.3.2 AKS 클러스터 구축
- B.3.3 AKS 클러스터 조작
B.4 온프레미스 환경에서 쿠버네티스 클러스터 구축
- B.4.1 온프레미스 클러스터 구축 준비
- B.4.2 kubespray를 사용해 EKS 클러스터 구축
B.5 Amazon Elastic Container Service
- B.5.1 CDK로 ECS 클러스터 생성과 컨테이너 배포 정의하기
- B.5.2 CDK로 ECS 클러스터를 생성하고 컨테이너 배포하기
- COLUMN Amazon ECS Anywhere
💡 APPENDIX C. 컨테이너 개발과 운영 팁
C.1 컨테이너 런타임
- C.1.1 containerd
- COLUMN 쿠버네티스의 도커 deprecated 소동
- C.1.2 nerdctl
C.2 쿠버네티스 팁
- C.2.1 이페머럴 컨테이너를 통한 기존 파드 디버깅
- C.2.2 Pod Security Admission을 사용한 보안 강화
- COLUMN Open Policy Agent
C.3 컨테이너 개발, 배포 팁
- C.3.1 Compose Watch로 컨테이너 자동 업데이트하기
- C.3.2 Tilt로 쿠버네티스 애플리케이션 다루기
C.4 생성형 AI를 활용한 컨테이너 개발 효율화
- C.4.1 ChatGPT 활용하기
- C.4.2 GitHub Copilot 활용하기
C.5 Alpine Linux 패키지 매니저 apk
- C.5.1 패키지 매니저 apk 조작하기
- C.5.2 alpine-sdk 패키지
🎯 스터디 목표
- 도커 컨테이너 기초 개념부터 실무 활용까지 체계적 학습
- 쿠버네티스 오케스트레이션 및 클러스터 관리 능력 습득
- 쿠버네티스 환경에서의 컨테이너 운영 및 CI/CD 자동화 경험
📅 스터디 기간 및 구성
- 모집 기간: 8월 7일(목) ~ 8월 14일(목) 까지
- 진행 기간: 8~12주 (약 2개월)
- 스터디 인원: 4-6명
- 참여 대상:
- 컨테이너 기술에 관심 있는 개발자
- DevOps/인프라 분야 진출 희망자
- 도커는 알지만 쿠버네티스를 체계적으로 배우고 싶은 분
- 쿠버네티스 환경에서 개인 홈 서버를 구축하고 싶은 분
📚 스터디 방식
1️⃣ 사전 학습
- 지정된 챕터 개인 학습 및 실습 진행
- 핵심 개념 정리 및 질문사항 정리
- GitHub에 학습 내용 및 실습 결과 정리하여 PR 생성
2️⃣ 온라인 모임
- 학습 내용 공유 및 토론
- 어려웠던 부분 질의응답
- 다음 주 학습 분량 및 실습 계획 수립
🤝 스터디 규칙
- 사전 학습 필수, 불참 시 사전 연락
- 무단 불참 3회 누적 시 스터디 진행 불가
- 서로 도움을 주고받는 협력적 분위기 조성
- 트러블슈팅 사례 공유
🎁 스터디 결과물
- 개인 포트폴리오용 쿠버네티스 프로젝트 완성
- 도커/쿠버네티스 경험 및 트러블슈팅 노하우 축적