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
参考文献
索引