Docker/Kubernetes 実践コンテナ開発入門

書籍の概要

この本の概要

話題のコンテナ技術,Docker/Kubernetesの基礎から実際にアプリケーションを作るまでを解説した入門書です。Docker/Kubernetesを実際の現場で活用している著者が最新情報や実践スキルをわかりやすく解説します。ローカル環境での検証はもちろん,Google Kubernetes EngineへのデプロイやAWS Fargateの活用などクラウドでの実践にも触れています。Docker/Kubernetesをきちんと本番で使うための王道的な解説を中心としつつ,CLIツールとしてDockerを導入したい,オンプレでKuberentesを使いたいといったニーズにも答えます。

こんな方におすすめ

  • Docker/Kubernetesといったコンテナ技術で実際にツールやサービスを構築したい方
  • コンテナの基礎から実践まで一通り学びたい方
  • コンテナの基礎はわかって実際に動かすところを体験したい方

この書籍に関連する記事があります!

いま話題のコンテナ技術とは?
アプリケーション開発,オペレーションの分野で話題のコンテナ技術。

目次

1.Dockerの基礎

  • 1.1 Dockerとは
    • コラム Dockerの苦手な部分
    • 1.1.1 Dockerの歴史
    • 1.1.2 Dockerの基礎概念
    • コラム Dockerのコンテナ型仮想化技術の推移
    • 1.1.3 Dockerの考えに触れる
    • コラム Mobyプロジェクト
    • コラム LinuxKit
  • 1.2 Dockerを利用する意義
    • 1.2.1 環境差異問題からの脱却
    • コラム クラウドのInfrastructure as CodeとImmutable Infrastructure
    • 1.2.2 アプリケーションの構成管理のしやすさ
    • 1.2.3 本番環境に導入してこそのDocker
    • 1.2.4 新しい開発スタイルへ
  • 1.3 ローカルDocker環境を構築する
    • 1.3.1 Docker for Windowsのインストール
    • コラム Docker for Windowsの起動に失敗する場合
    • 1.3.2 Docker for Macのインストール
    • 1.3.3 Docker for Windows/Macの基本設定
    • コラム Docker Toolbox
    • コラム Linux環境へのインストール
    • コラム Community Edition(Docker CE)とEnterprise Edition(Docker EE)

2.Dockerコンテナのデプロイ

  • 2.1 コンテナでアプリケーションを実行する
    • 2.1.1 DockerイメージとDockerコンテナの基本
    • 2.1.2 簡単なアプリケーションとDockerイメージをつくる
    • コラム CMDの実行時上書き
    • コラム ENTRYPOINTでコマンドの実行の仕方を工夫する
    • コラム Dockerfileのその他のインストラクション
    • コラム CMDの指定方式
    • 2.1.3 Dockerコンテナを実行する
    • コラム 短いdockerコマンド
  • 2.2 Dockerイメージの操作
    • 2.2.1 docker image build ― イメージのビルド
    • 2.2.2 docker search ― イメージの検索
    • 2.2.3 docker image pull ― イメージの取得
    • 2.2.4 docker images ls― イメージの一覧
    • 2.2.5 docker image tag ― イメージのタグ付け
    • 2.2.6 docker image push ― イメージの公開
    • コラム Docker Hub
  • 2.3 Dockerコンテナの操作
    • 2.3.1 Dockerコンテナのライフサイクル
    • 2.3.2 docker container run ― コンテナの作成と実行
    • コラム コマンド実行時の頻出オプション
    • 2.3.3 docker container ls ― コンテナの一覧
    • 2.3.4 docker container stop ― コンテナの停止
    • 2.3.5 docker container restart ― コンテナの再起動
    • 2.3.6 docker container rm ― コンテナの破棄
    • 2.3.7 docker container logs ― 標準出力の取得
    • 2.3.8 docker container exec ― 実行中コンテナでのコマンド実行
    • 2.3.9 docker container cp ― ファイルのコピー
  • 2.4 運用管理向けコマンド
    • 2.4.1 prune ― 破棄
    • 2.4.2 docker container stats ― 利用状況の取得
  • 2.5 Docker Composeでマルチコンテナを実行する
    • 2.5.1 docker-composeによるコンテナの実行
  • 2.6 Composeによる複数コンテナの実行
    • 2.6.1 Jenkinsコンテナを実行する
    • 2.6.2 Master JenkinsのSSH鍵を作る
    • 2.6.3 Jenkins Slaveコンテナを作る

3.実用的なコンテナの構築とデプロイ

  • 3.1 アプリケーションとコンテナの粒度
    • 3.1.1 1コンテナ=1プロセス?
    • 3.1.2 1コンテナに1つの関心事
  • 3.2 コンテナのポータビリティ
    • 3.2.1 Kernel・アーキテクチャの違い
    • 3.2.2 ライブラリ・ダイナミックリンクの課題
  • 3.3 Dockerフレンドリなアプリケーション
    • 3.3.1 環境変数を活用する
    • コラム Dockerフレンドリなプロダクトばかりじゃない
  • 3.4 永続化データをどう扱うか
    • 3.4.1 Data Volume
    • 3.4.2 Data Volumeコンテナ
  • 3.5 コンテナ配置戦略
    • 3.5.1 Docker Swarm
    • 3.5.2 Service
    • 3.5.3 Stack
    • 3.5.4 ServiceをSwarmクラスタ外から利用する
    • コラム Swarmクラスタの構成管理

4.Swarmによる実践的なアプリケーション構築

  • 4.1 Webアプリケーションの構成
    • 4.1.1 アプリケーションの仕様
    • 4.1.2 アーキテクチャ
    • 4.1.3 TODOアプリケーション構築の全体像
  • 4.2 MySQL Serviceの構築
    • 4.2.1 データベース・コンテナ構成
    • 4.2.2 認証情報
    • 4.2.3 MySQLの設定 ― etc/mysql/mysql.conf.d/mysqld.cnf
    • 4.2.4 レプリケーションを設定する
    • 4.2.5 MySQL(mysql_master/mysql_slave)のDockerle
    • 4.2.6 Swarm上でMaster/Slaveサービスを実行する
    • 4.2.7 MySQLコンテナを確認し,初期データを投入する
  • 4.3 API Serviceの構築
    • 4.3.1 todoapiの基本構造
    • 4.3.2 アプリケーションでの環境変数の制御
    • 4.3.3 MySQL接続,テーブルマッピング
    • 4.3.4 Handlerを実装する
    • 4.3.5 APIのDockerle
    • 4.3.6 Swarm上でtodoapiサービスを実行する
  • 4.4 Nginxの構築
    • 4.4.1 nginx.confを構築する
    • コラム 環境変数を積極的に使う
    • 4.4.2 NginxのDockerle
    • 4.4.3 Nginxを通してアクセスできるようにする
  • 4.5 Webの構築
    • 4.5.1 TODO APIを呼び出し,ページのHTMLを返却する
    • 4.5.2 WebのDockerle
    • 4.5.3 静的ファイルの扱いを工夫する
    • 4.5.4 Nginxを通してアクセスできるようにする
    • 4.5.5 Ingressで公開する
  • 4.6 コンテナオーケストレーションによる開発スタイル

5.Kubernetes入門

  • 5.1 Kubernetesとは
    • 5.1.1 Dockerの隆盛とKubernetesの誕生
    • 5.1.2 Kubernetesの位置づけ
  • 5.2 ローカル環境でKubernetesを実行する
    • 5.2.1 Docker for Windows/MacでローカルKubenetes環境を構築する
    • コラム Minikube
  • 5.3 Kubernetesの概念
  • 5.4 KubernetesクラスタとNode
    • コラム Masterを構成する管理コンポーネント
  • 5.5 Namespace
  • 5.6 Pod
    • 5.6.1 Podを作成してデプロイする
    • 5.6.2 Podを操作する
    • コラム PodとPod内コンテナのアドレス
  • 5.7 ReplicaSet
  • 5.8 Deployment
    • 5.8.1 ReplicaSetライフサイクル
    • 5.8.2 ロールバックを実行する
  • 5.9 Service
    • コラム Serviceの名前解決
    • 5.9.1 ClusterIP Service
    • 5.9.2 NodePort Service
    • 5.9.3 LoadBalancer Service
    • 5.9.4 ExternalName Service
  • 5.10 Ingress
    • 5.10.1 Ingressを通じたアクセス
    • コラム freshpodでイメージの更新を検知し,Podを自動更新する
    • コラム kube-prompt
    • コラム Kubernetes API

6.Kubernetesのデプロイ・クラスタ構築

  • 6.1 Google Kubernetes Engineのセットアップ
    • 6.1.1 GCPプロジェクトの作成
    • 6.1.2 Google Cloud SDK(gcloud)のセットアップ
    • 6.1.3 Kubernetesクラスタの作成
    • コラム kubectx
  • 6.2 GKE上にTODOアプリケーションを構築する
  • 6.3 Master Slave構成のMySQLをGKE上に構築する
    • 6.3.1 PersistentVolumeとPersistentVolumeClaim
    • 6.3.2 StorageClass
    • 6.3.3 StatefulSet
  • 6.4 TODO APIをGKE上に構築する
  • 6.5 TODO WebアプリケーションをGKE上に構築する
  • 6.6 IngressでWebアプリケーションをインターネットに公開する
  • 6.7 オンプレミス環境でのKubernetesクラスタの構築
  • 6.8 kubesprayでKubernetesクラスタを構築する
    • 6.8.1 クラスタとして構築するサーバの準備
    • 6.8.2 opsのSSH公開鍵の登録
    • 6.8.3 IPv4フォワーディングを有効にする
    • 6.8.4 クラスタの設定
    • 6.8.5 クラスタ構築の実行

7.Kubernetesの発展的な利用

  • 7.1 Kubernetesの様々なリソース
    • 7.1.1 Job
    • 7.1.2 CronJob
    • 7.1.3 Secret
    • コラム 認証情報をセキュアに環境変数へ設定する
  • 7.2 ユーザー管理とRole-Based Access Control (RBAC)
    • 7.2.1 RBACを利用して権限制御を実現する
    • 7.2.2 ServiceAccount
  • 7.3 Helm
    • 7.3.1 Helmのセットアップ
    • 7.3.2 Helmの概念
    • 7.3.3 Chartをインストールする
    • 7.3.4 Chartでアプリケーションをアンインストールする
    • 7.3.5 RBACに対応したアプリケーションをインストールする
    • 7.3.6 独自のChartを作成する
  • 7.4 Kubernetesにおけるデプロイ戦略
    • 7.4.1 RollingUpdate
    • 7.4.2 コンテナ実行時のヘルスチェックを設定する
    • コラム 安全にアプリケーションを停止してからPodを削除する
    • 7.4.3 BlueGreen Deployment
    • コラム サービスメッシュを実現するLinkerdとIstio

8.コンテナの運用

  • 8.1 ロギングの運用
    • 8.1.1 コンテナにおけるロギング
    • 8.1.2 コンテナログの運用
    • 8.1.3 FluentdとElasticsearchによるログ収集・検索機構の構築
    • 8.1.4 fluentd logging driverの運用イメージ
    • コラム 可用性・信頼性のあるログストレージを選ぶ
    • 8.1.5 Kubernetesにおけるログの管理
    • 8.1.6 その他のログ収集ツール
  • 8.2 Dockerホストやデーモンの運用
    • 8.2.1 コンテナのライブリストア
    • 8.2.2 dockerdのチューニング
    • コラム Docker/Kubernetesの運用はマネージド?非マネージド?
  • 8.3 障害対策
    • 8.3.1 Docker運用での障害対策
    • 8.3.2 Kubernetes運用での障害対策
    • コラム その他のラベル付け

9.より軽量なDockerイメージを作る

  • 9.1 なぜ軽量なイメージを作るべきなのか
    • 9.1.1 イメージサイズの増大で発生する弊害
  • 9.2 軽量なベースイメージ
    • 9.2.1 scratch
    • 9.2.2 BusyBox
    • 9.2.3 Alpine Linux
    • コラム Alpine Linuxを採用する例
    • コラム Alpine Linuxベースのイメージを採用するべきか否か
  • 9.3 軽量なDockerイメージをつくる
    • 9.3.1 デプロイするアプリケーションのサイズを削減する
    • 9.3.2 Dockerイメージのレイヤー構造を意識する
  • 9.4 multi-stage builds
    • 9.4.1 ビルドコンテナと実行コンテナを分ける
    • コラム 言語にフォーカスしたdistrolessイメージ

10.Dockerの様々な活用方法

  • 10.1 チーム開発で開発環境を統一・共有する
    • 10.1.1 利用するソフトウェア・ツールを統一する
    • 10.1.2 開発環境は集合知
    • コラム DockerはVagrantの代替となるか?
  • 10.2 コマンドラインツール(CLI)をDockerコンテナで利用する
    • 10.2.1 イメージによって利用するツールのバージョンを切り替える
    • 10.2.2 シェルスクリプトをDockerコンテナで実行する
  • 10.3 負荷テスト
    • 10.3.1 実験環境のセットアップ
    • 10.3.2 master/slave構成で複数コンテナから負荷テストを実行する

Appendix-A セキュリティ

  • A.1 公開Dockerイメージの安全性
    • A.1.1 Docker Hub
    • A.1.2 Quay.io
  • A.2 安全なDockerイメージと運用体制をつくる
    • A.2.1 Docker Bench Security
    • A.2.2 コンテナへのファイル追加におけるリスク
    • A.2.3 適切なアクセス制御
    • A.2.4 クレデンシャル(機密情報)の扱い

Appendix-B Dockerでの開発を支援するツール・サービス

  • B.1 独自Dockerレジストリの構築
    • B.1.1 Registry(Docker Distribution)
    • コラム Docker Trusted Registry
  • B.2 DockerとCI/CDサービスの連携
    • B.2.1 CircleCI
  • B.3 AWS Fargateを用いたECSでのコンテナオーケストレーション
    • B.3.1 FargateでECS Clusterを構築する
    • B.3.2 ECSを操作してアプリケーションをデプロイする

Appendix-C 主要コマンドまとめ

  • C.1 dockerコマンド
  • C.2 Dockerfile
  • C.3 docker-composeコマンド
  • C.4 docker swarm/stackコマンド
  • C.5 helmコマンド
    • C.5.1 helm init
    • C.5.2 helm version
    • C.5.3 helm create
    • C.5.4 helm lint
    • C.5.5 helm package
    • C.5.6 helm repo list
    • C.5.7 helm repo add
    • C.5.8 helm repo remove
    • C.5.9 helm repo update
    • C.5.10 helm search
    • C.5.11 helm fetch
    • C.5.12 helm serve
    • C.5.13 helm install
    • C.5.14 helm upgrade
    • C.5.15 helm list
    • C.5.16 helm get
    • C.5.17 helm delete

著者プロフィール

山田明憲(やまだあきのり)

株式会社サイバーエージェント所属。ライブ配信サービス「FRESH LIVE」テックリードとして,アーキテクチャ設計とコンテナ主体での開発を主導。コンテナ技術をフル活用した実践的なアプリケーション構築のあり方を日々模索している。