書籍概要

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

サポート

ダウンロード

以下のファイルをダウンロードできます。圧縮ファイルをダウンロードしていただき,適宜解凍してご利用ください。
収録内容にミスがありましたため,内容を更新しました。2020年12月14日以前にダウンロードされた方は,お手数ですが,再度ダウンロードし直してください。

(2021年6月9日更新)

ダウンロード
サンプルファイル(20210609版)

正誤表

下記の誤りがありました。ご迷惑をおかけいたしました。

(2021年2月3日最終更新)

P.94 Data Volumeの破棄とステートフルな実行の説明

また、Data Volumeをコンテナの破棄してもディスクに保持されるので、コンテナでステートフルなアプリケーションを実行する用途に向いています。
また、Data Volumeのコンテナを破棄してもディスクに保持されるので、コンテナでステートフルなアプリケーションを実行する用途に向いています。

(以下2020年12月15日更新)

P.61 # 2.3.2 docker container runのオプションに関する説明

必然的に-dや-pプションの利用は多くなります
必然的に-dや-pプションの利用は多くなります

P.149 4.4.2 NginxのDockerfile

Dockerfileの記述が一部誤っていました。正しくは下記です。


FROM nginx:1.13

RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/progrium/entrykit/releases/download/v0.4.0/entrykit_0.4.0_linux_x86_64.tgz
RUN tar -xvzf entrykit_0.4.0_linux_x86_64.tgz
RUN rm entrykit_0.4.0_linux_x86_64.tgz
RUN mv entrykit /usr/local/bin/
RUN entrykit --symlink

# ① conf.dのデフォルトファイルを削除し,各種設定ファイルをコピー
RUN rm /etc/nginx/conf.d/*
COPY etc/nginx/nginx.conf.tmpl /etc/nginx/
COPY etc/nginx/conf.d/ /etc/nginx/conf.d/

# ② entrykitでテンプレートから設定ファイルを生成
ENTRYPOINT [ \
  "render", \
      "/etc/nginx/nginx.conf", \
      "--", \
  "render", \
      "/etc/nginx/conf.d/upstream.conf", \
      "--", \
  "render", \
      "/etc/nginx/conf.d/public.conf", \
      "--" \
]

CMD nginx -g "daemon off;"

P.156からP.157 # 4.5.3のDockerfile-nuxtの内容

本来\(バックスラッシュ)にすべき部分がvになっていました。またCMDの指示が正しくありませんでした。
正しくは下記です。


FROM nginx:1.13

RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/progrium/entrykit/releases/download/v0.4.0/entrykit_0.4.0_linux_x86_64.tgz
RUN tar -xvzf entrykit_0.4.0_linux_x86_64.tgz
RUN rm entrykit_0.4.0_linux_x86_64.tgz
RUN mv entrykit /usr/local/bin/
RUN entrykit --symlink

RUN rm /etc/nginx/conf.d/*
COPY etc/nginx/nginx.conf.tmpl /etc/nginx/
COPY etc/nginx/conf.d/ /etc/nginx/conf.d/

ENTRYPOINT [ \
  "render", \
      "/etc/nginx/nginx.conf", \
      "--", \
  "render", \
      "/etc/nginx/conf.d/upstream.conf", \
      "--", \
  "render", \
      "/etc/nginx/conf.d/nuxt.conf", \
      "--" \
]

CMD nginx -g "daemon off;"

(以下2020年6月2日更新)

P.98 # 3.4.2の最後の実行例

不要なバッククォートが残っていました。


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


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

P.293 # 8.1.5のyamlを適用する部分の説明

次のようにelasticsearch.yamlを反映します。KibanaのServiceは`kube-system`に配置されているので、`-n`オプションでNamespaceである`kube-system`を指定します。
次のようにkibana.yamlを反映します。

(以下2020年2月13日更新)

P.147 # 4.4.1 「nginx.confを構築する」の「バックエンドサーバの振り分け―etc/nginx/conf.d/upstream.conf.tmpl」のupstreamディレクティブの説明をしている箇所

プロキシ先はNginxのproxy_passディレクティブに直接記述することも可能ですが、upstreamディレクトリを定義すると
プロキシ先はNginxのproxy_passディレクティブに直接記述することも可能ですが、upstreamディレクティブを定義すると

P.152 # 4.5.1 scriptタグに関する説明

HTMLテンプレートとAPIからデータを取得する処理を起こっているscriptタグで構成されますが
HTMLテンプレートとAPIからデータを取得する処理を行っているscriptタグで構成されますが

P.176 # 5.5 Namespaceに関する説明

Namespaceごとにに操作権限を設定できるので
Namespaceごとに操作権限を設定できるので

P.204 # 6.1.3のGKEのバージョンに関する説明

解説内の一部文書が抜けていました。

ここでは`--cluster-version`で作成するKubernetesクラスタのバージョン、
ここでは`--cluster-version`で作成するKubernetesクラスタのバージョンを指定します。GKEでは古いバージョンを利用できなくなることもあるので注意が必要です。

P.326 # 9.2.1の「ルート証明書」のコード実行例

本来ch09を指定すべき箇所が,ch08になっていました。

docker image build -t ch08/hello:latest .
docker image build -t ch09/hello:latest .

P.395 # C.2 Dockerfile表中のUSERに関する表記

USER定義後後のRUNもそのユーザー
USER定義後のRUNはそのユーザー

(以下2019年11月26日更新)

P.147 # 4.4.1 「nginx.confを構築する」の「バックエンドサーバの振り分け―etc/nginx/conf.d/upstream.conf.tmpl」のupstreamディレクティブの説明をしている箇所

プロキシ先はNginxのproxy_passディレクティブに直接記述することも可能ですが、upstreamディレクトリを定義すると
プロキシ先はNginxのproxy_passディレクティブに直接記述することも可能ですが、upstreamディレクティブを定義すると

P.152 # 4.5.1 scriptタグに関する説明

HTMLテンプレートとAPIからデータを取得する処理を起こっているscriptタグで構成されますが
HTMLテンプレートとAPIからデータを取得する処理を行っているscriptタグで構成されますが

P.176 # 5.5 Namespaceに関する説明

Namespaceごとにに操作権限を設定できるので
Namespaceごとに操作権限を設定できるので

(以下2019年8月28日更新)

なお,正誤表をページ順に並べ替えたPDFを用意しました。

P.156 # 4.5.3のDockerfile-nuxt

本来バックスラッシュを挿入すべき箇所がvになっていました。
またCMD以降の指定の記法がnginxのものと異なっていました。正しいコードは下記です。
コメントは実際には実行時にエラーになるので適宜外して実行してください。


FROM nginx:1.13

RUN apt-get update
RUN apt-get install -y wget
RUN wget
https://github.com/progrium/entrykit/releases/download/v0.4.0/entrykit_0.4.0_linux_x86_64.tgz
RUN tar -xvzf entrykit_0.4.0_linux_x86_64.tgz
RUN rm entrykit_0.4.0_linux_x86_64.tgz
RUN mv entrykit /usr/local/bin/
RUN entrykit --symlink

RUN rm /etc/nginx/conf.d/*
COPY etc/nginx/nginx.conf.tmpl /etc/nginx/
COPY etc/nginx/conf.d/ /etc/nginx/conf.d/

ENTRYPOINT [ \
  "render", \
      "/etc/nginx/nginx.conf", \
      "--", \
  "render", \
      "/etc/nginx/conf.d/upstream.conf", \
      "--", \
  "render", \
      "/etc/nginx/conf.d/nuxt.conf", \ # <-- public.confからnuxt.confに変更
      "--" \
]

CMD ["nginx", "-g", "daemon off;"]

(以下2019年6月11日更新)

P.86 # 3.1.1の脚注2

外側からdocekr stopなどで
外側からdocker stopなどで

P.213〜214 # 6.4 todo-api.yamlの内容

Deployment.spec.template.metadata.labelsの指定で本来appとすべき箇所がnameになっていました。

正しいのは下記のコードです。


apiVersion: v1
kind: Service
metadata:
  name: todoapi
  labels:
    app: todoapi 
spec:
  selector:
    app: todoapi
  ports:
    - name: http
      port: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: todoapi 
  labels:
    app: todoapi
spec:
  replicas: 2
  selector:
    matchLabels:
      app: todoapi
  template:
    metadata:
      labels:
        app: todoapi
    spec:
      containers:
      - name: nginx
        image: gihyodocker/nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        env:
        - name: WORKER_PROCESSES
          value: "2"
        - name: WORKER_CONNECTIONS
          value: "1024"
        - name: LOG_STDOUT
          value: "true"
        - name: BACKEND_HOST
          value: "localhost:8080"
      - name: api
        image: gihyodocker/todoapi:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: TODO_BIND
          value: ":8080"
        - name: TODO_MASTER_URL
          value: "gihyo:gihyo@tcp(mysql-master:3306)/tododb?parseTime=true"
        - name: TODO_SLAVE_URL
          value: "gihyo:gihyo@tcp(mysql-slave:3306)/tododb?parseTime=true"

P.235 # 7.2の節内での今後の作業の進め方を説明した箇所

本来はパブリッククラウドで検証する部分でしたが,誤ってローカルKubernetes環境としていました。

以後、ローカルKubernetes環境を利用して実際にRBAC関連リソースを作成し、認証ユーザーで認証を行った上でのKubernetesの操作を行います。次に、ServiceAccountを利用したPodからのKubernetes API利用について解説します。
以後、パブリッククラウドを想定して実際にRBAC関連リソースを作成し、認証ユーザーで認証を行った上でのKubernetesの操作を行います。次に、ServiceAccountを利用したPodからのKubernetes API利用について解説します。

P.235 # 7.2.1のリソースに関する表の上の説明文

本来はパブリッククラウドで検証する部分でしたが,誤ってローカルKubernetes環境としていました。

これらのリソースを使用して、ローカルKubernetes環境で認証ユーザーの権限制御を行ってみましょう。
これらのリソースを使用して、認証ユーザーの権限制御を行ってみましょう。

(以下2019年3月6日更新)

P.37 # 2.1.1のコンテナ停止のコマンド実行例

docekr stop $(docker container ls -q)


docker stop $(docker container ls -q)

(以下2019年2月4日更新)

P.218 # 6.5のリスト

6.5の最下部のkubectl apply -f ingress.yamlは正しくは6.6のファイル表記の下に配置されます。

P.142 # 4.3.6のリスト

ファイル名が誤っていました。

todomysql_master
todo_mysql_master
todmysql_slave
todo_mysql_slave

正しいリストの全体像を以下に掲載します。


version: "3"
services:
  api:
    image: registry:5000/ch04/todoapi:latest
    deploy:
      replicas: 2
      environment:
        TODO_BIND: ":8080"
        TODO_MASTER_URL: "gihyo:gihyo@tcp(todo_mysql_master:3306)/tododb?parseTime=true"
        TODO_SLAVE_URL: "gihyo:gihyo@tcp(todo_mysql_slave:3306)/tododb?parseTime=true"
      networks:
        - todoapp
networks:
  todoapp:
    external: true


(以下2018年10月2日更新)

P.46 # 2章の脚注21

exmaple/echo
example/echo

P.75 # 2.6.1の最初のリストのjenkinsのイメージ名

書籍中で指定したイメージ名,バージョンでは動作しなくなってしまいました。
jenkinsci/jenkins:2.142-slimを利用してください。


image: jenkins:latest


image: jenkinsci/jenkins:2.142-slim

P.78 # 2.6.3の最初のリストのjenkinsのイメージ名

書籍中で指定したイメージ名,バージョンでは動作しなくなってしまいました。
下記の通り修正してください。


services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.142-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
      - slave01

  slave01:
    container_name: slave01
    image: jenkinsci/ssh-slave
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB3NzaC1yc2EA........

P.80 # 2.6.3の「最終調整」の実行例

プラグインのバージョンが上がったことで書籍の通りには動作しなくなりました。

「秘密鍵」はJenkinsマスター上の~/.sshからを選択します。
「秘密鍵」にはホストの./jenkins_home/.ssh/id_rsaの内容を貼り付けます。

画像をクリックすると大きく表示できます。

P.105 # 3.5.2の説明文

Dockerイメージはregistyコンテナにpushしてある
Dockerイメージはregistryコンテナにpushしてある

P.129 # 4.2.5のスクリプト名の誤り

dd-server-id.shをdocker-entrypoint.shの前に実行できます。
add-server-id.shをdocker-entrypoint.shの前に実行できます。

P.146 # 4.4.1の「バックエンドサーバの振り分けの設定値」コード部分と続く解説

動作はしますがfailsのつづりを誤っていました。

BACKEND_MAX_FAILES
BACKEND_MAX_FAILS

P.150 # 4.4.3のコード部分の設定値

動作はしますがfailsのつづりを誤っていました。

BACKEND_MAX_FAILES
BACKEND_MAX_FAILS

P.158 # 4.5.4のコード部分の設定値

動作はしますがfailsのつづりを誤っていました。

BACKEND_MAX_FAILES
BACKEND_MAX_FAILS

P.334 # 9.2.3の「パッケージマネージャapkを操作する」のapk delに関する解説

本来リスト外に出るべき解説箇所が,誤ってリスト内に入ってしまっていました。
下記部分はリスト外の解説分です。


apk del

apk delではインストールされているパッケージをアンインストールします。apk add --virtualなどと組み合わせ
て使わなくなったパッケージの削除に用います。

P.398 # helm packageの書式

helm pacakge [options] Chartへのパス
helm package [options] Chartへのパス

(以下2018年9月18日更新)

P.194 # 5.10.1 の冒頭の実行例


$ kubectl apply -f simple-deployment.yaml


$ kubectl apply -f simple-service.yaml


(以下2018年9月11日更新)

P.131 # 4.2.6のtodo-mysql.ymlの表記

MYSQL_ROOT_PASSWORDを文中で二回設定していました。正しくは一回です。


    environment:
      MYSQL_MASTER_HOST: master
      MYSQL_ROOT_PASSWORD: gihyo 
      MYSQL_DATABASE: tododb 
      MYSQL_USER: gihyo 
      MYSQL_PASSWORD: gihyo 
      MYSQL_ROOT_PASSWORD: gihyo 
      MYSQL_REPL_USER: repl 
      MYSQL_REPL_PASSWORD: gihyo 


    environment:
      MYSQL_MASTER_HOST: master
      MYSQL_ROOT_PASSWORD: gihyo 
      MYSQL_DATABASE: tododb 
      MYSQL_USER: gihyo 
      MYSQL_PASSWORD: gihyo 
      MYSQL_REPL_USER: repl 
      MYSQL_REPL_PASSWORD: gihyo 

P.156 # 4.5.3のnuxt.conf.tmplのerror_logの設定


error_log /var/log/nginx/asserts_error.log


error_log /var/log/nginx/assets_error.log

P.160 # 4.5.4のdockerコマンド実行例の1行目


docker \container exec -it manager \


docker container exec -it manager \

P.194 # 5.10の実行例

-fオプションの位置が誤っていました。


kubectl -f apply


kubectl apply -f

P.312 # 8.3.2の脚注13

Pod AntiAaffinity
Pod AntiAffinity

P.321 # 9.1.1のオートスケールの説明に関する文章

新規のノードが追加されるます。
新規のノードが追加されます

(以下2018年9月5日更新)

P.86 # 3.1.1のDockerイメージビルド時の表示

Step 7/7 : CMD [ "touch", "/etc/cron.d/example", "&&", "cron", "-f" ]
Step 7/7 : CMD ["cron", "-f"] 

(以下2018年9月4日更新)

P.109 # 3.5.3のStackのサブコマンドに関する表

rmとservicesで項目が逆になっていました。

rm Stack内のService一覧を表示する
rm デプロイされているStackを削除する
services デプロイされているStackを削除する
services Stack内のService一覧を表示する

P.227 # 7.1の脚注4

失敗したiPod
失敗したPod

P.310 # 8.3.2の下の見出し

Node障害の際にKubernetesの挙動
Node障害時のKubernetesの挙動

(以下2018年8月24日更新)

P.37 # 2.1のコンテナ停止の説明

コマンド停止させられます。
コマンド停止させられます。

P.211 # 6.3.3のyamlの反映ファイル名

mysql-master.yamb
mysql-master.yaml

P.352 # 10.2.1のタグ付けのイメージ名

ch09/jq:latest
ch10/jq:latest

P.358 # 10.3.1の最後のコマンド実行例

ch09-locust.yml
ch10-locust.yml

補足情報

(2021年6月9日更新)

「5.10 Ingress」のデプロイ手順(P.194)

Kubernetes1.16系以降を利用している場合は,次のようにデプロイします。
URLを変更します。


$ kubectl apply -f \
    https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/cloud/deploy.yaml

「5章のコラム freshpodでイメージの更新を検知し,Podを自動更新する」のkubectlの指定(P.197)

URLを変更します。

修正前

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/minikube/master/deploy/addons/freshpod/freshpod-rc.yaml
修正後

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/minikube/ec1b443722227428bd2b23967e1b48d94350a5ac/deploy/addons/freshpod/freshpod-rc.yaml

「5章のコラム Kubernete API」のAPI名(P.200)

一部の表示がなくなります。diff形式で記します。


  $ kubectl api-versions
  admissionregistration.k8s.io/v1beta1
  apiextensions.k8s.io/v1beta1
  apiregistration.k8s.io/v1
  apiregistration.k8s.io/v1beta1
  apps/v1
- apps/v1beta1
- apps/v1beta2
  authentication.k8s.io/v1
  authentication.k8s.io/v1beta1
  ...
  storage.k8s.io/v1
  storage.k8s.io/v1beta1
  v1

「5章のコラム Kubernete API」のAPI周りの解説(P.200)

extensions/v1beta1をnetworking.k8s.io/v1beta1に読み替えてください。

修正前 Ingressのように`extensions/v1beta1`といったAPIに属しているリソースも存在します。Kubernetesでは新しい機能のリソースはアルファ版やベータ版として取り込まれることも多く、安定版に到達するまではAPIやマニフェストファイルのスキーマにも変更が入ります。`xxx/v1beta1`、`xxx/v1beta2`といった形式のAPIが存在するのはそのためです。Kubernetesのバージョンが上がるにつれて、サポートされるAPIは増えていきます。
修正後 Ingressのように`networking.k8s.io/v1beta1`といったAPIに属しているリソースも存在します。Kubernetesでは新しい機能のリソースはアルファ版やベータ版として取り込まれることも多く、安定版に到達するまではAPIやマニフェストファイルのスキーマにも変更が入ります。`xxx/v1beta1`、`xxx/v1beta2`といった形式のAPIが存在するのはそのためです。Kubernetesのバージョンが上がるにつれて、サポートされるAPIは増えていきます。

「7.3.6 独自のChartを作成する」の「Ingress」のシンプルな定義(P.258)

extensions/v1beta1をnetworking.k8s.io/v1beta1に読み替えてください。
diff形式で記します。


- apiVersion: extensions/v1beta1
+ apiVersion: networking.k8s.io/v1beta1
  kind: Ingress
  metadata:
    name: echo
  spec:
    rules:
    - host: ch06-echo.gihyo.local
      http:
        paths:
        - backend:
            serviceName: echo
            servicePort: 80

「7.3.6 独自のChartを作成する」の「Ingress」の生成されたひな形(P.258〜P.259)

extensions/v1beta1をnetworking.k8s.io/v1beta1に読み替えてください。
diff形式で記します。


  {{- if .Values.ingress.enabled -}}
  {{- $fullName := include "echo.fullname" . -}}
  {{- $servicePort := .Values.service.port -}}
  {{- $ingressPath := .Values.ingress.path -}}
- apiVersion: extensions/v1beta1
+ apiVersion: networking.k8s.io/v1beta1
  kind: Ingress
  metadata:
    name: {{ $fullName }}
    labels:
      app: {{ template "echo.name" . }}
      chart: {{ template "echo.chart" . }}
      release: {{ .Release.Name }}
      heritage: {{ .Release.Service }}
  {{- with .Values.ingress.annotations }}
    annotations:
  {{ toYaml . | indent 4 }}
  {{- end }}
  spec:
  {{- if .Values.ingress.tls }}
    tls:
    {{- range .Values.ingress.tls }}
      - hosts:
        {{- range .hosts }}
          - {{ . }}
        {{- end }}
        secretName: {{ .secretName }}
    {{- end }}
  {{- end }}
    rules:
    {{- range .Values.ingress.hosts }}
      - host: {{ . }}
        http:
          paths:
            - path: {{ $ingressPath }}
              backend:
                serviceName: {{ $fullName }}
                servicePort: http
    {{- end }}
  {{- end }}

Goのバージョンアップに伴う動作不良について

(2020年2月13日更新)

書籍中ではDockerfileの作成にgolang:1.9の指定を主に用いてきましたが,Go本体や関連ライブラリのアップデートでgolang:1.9だと動作しません。書籍中のgolang:1.9で解説をしていた箇所はいずれもgolang:1.13に変更した上でお試しください。サンプルファイルではバージョンを変更したものを配布しています。

P.204 # 6.1.3 Google Kubernetes Engineのバージョン指定

書籍中で指定していたKubernetes EngineのCluster Versionが古く動作しなくなっていました。下記のように適宜バージョンを書き換えて利用してください。


$ gcloud container clusters create gihyo --cluster-version=1.15.7-gke.2 \
   --machine-type=n1-standard-1 \
   --num-nodes=3
Creating cluster gihyo.../

P.204 # 6.1.3の脚注6の内容

Google Kubernetes Engineのバージョン指定の変更に伴い,脚注6の内容を下記の通り改めます。

詳細は割愛します。ドキュメントを参照してください。 https://cloud.google.com/kubernetes-engine/versioning-and-upgrades#specifyung_cluster_version
gcloud container get-server-config --zone asia-northeast1 コマンドで出力されるvalidMasterVersionsの中で任意のバージョン。

P.245 # 7.3.1のHelmインストール

書籍ではHelm v2系の利用を想定していましたが,現在一部互換性のないHelm v3系が登場して書籍指示通りの操作だと動作しなくなっています。Helmのインストールについては下記の通り読み替えてください。

HelmのリリースページからHelm最新バージョンを取得してインストールしてください。
Helmのリリースページからv2系の最新バージョンを取得してインストールしてください。

P.158 # 4.5.4 todo-frontend.ymlが動作しない

(2019年10月4日更新)

todo-frontned.ymlのコードが動作しなくなっていました。
下記のとおり,修正したものを実行してください。
原因については現在調査中です。


version: "3"
services:
  nginx:
    image: registry:5000/ch04/nginx-nuxt:latest 
    deploy:
      replicas: 2
      placement:
        constraints: [node.role != manager]
    depends_on:
      - web
    environment:
      SERVICE_PORTS: 80
      WORKER_PROCESSES: 2
      WORKER_CONNECTIONS: 1024
      KEEPALIVE_TIMEOUT: 65
      GZIP: "on"
      BACKEND_HOST: todo_frontend_web:3000
      BACKEND_MAX_FAILES: 3
      BACKEND_FAIL_TIMEOUT: 10s
      SERVER_PORT: 80
      SERVER_NAME: localhost
      LOG_STDOUT: "true"
    networks:
      - todoapp
    volumes:
      - assets:/var/www/_nuxt

  web:
    image: registry:5000/ch04/todoweb:latest
    deploy:
      replicas: 1
      placement:
        constraints: [node.role != manager]
    environment:
      TODO_API_URL: http://todo_app_nginx:8000
    networks:
      - todoapp
    volumes:
      - assets:/todoweb/.nuxt/dist

networks:
  todoapp:
    external: true

volumes:
  assets:
    driver: local

P.290 # 8.1.5の連携が動作しない

(2019年2月4日更新)

イメージの更新に伴い,書籍中のコードでは動作しません。サンプルファイルを参照し,そのファイルで実行してください。

(以下2018年11月13日更新)

P.252 # 7.3.5の最後の実行例のheml install

Chartの更新に伴い,kubectl describeの適用ができなくなっていました。
下記のようにバージョンを固定して動作させてください。


helm install -f jenkins.yaml --name jenkins stable/jenkins --version 0.13.0


(以下2018年10月2日更新)

Docker Toolboxを用いた際の2章などのlocalhostへのアクセス例について

Docker Toolboxでは書籍中に示したようなlocalhostへのアクセスが動作しません。
代わりに192.168.99.100などのIPアドレスを指定して動作させます。
このIPアドレスはdocker-machine default ipで取得します。

なお,本書ではDocker for Windows/Macを主な動作対象として検証しております。
ここでのDocker Toolboxの使い方に関する説明はあくまで補足的なもので,Docker Toolboxの操作方法等についてはご質問を受け付けておりません。

商品一覧