「Docker/Kubernetes 实践容器开发入门」总结
首先
我之前一直在使用Docker和Kubernetes,但是我觉得自己从来没有系统地学习过它们,所以决定开始阅读《Docker/Kubernetes实践容器开发入门》这本书。
1. Docker的基础
Docker 是什么?
-
- Dockerはコンテナ型仮想化技術を実現するために実行される常駐アプリケーションと、それを操作するためのコマンドフロントインターフェースからなるプロダクト
- Dockerは開発環境の準備だけでなく、本番環境への展開やアプリケーションプラットフォームとして機能する点で優れている
使用Docker的意义
-
- 不変な実行環境による冪等性の確保
-
- 実行環境構築とアプリケーション構成のコード化
-
- 実行環境とアプリケーションの一体化によるポータビリティ性の向上
- システムを構成するアプリケーションやミドルウェアの構成管理の容易さ
2. Docker容器的部署
以容器运行应用程序
Docker图像
-
- Dockerコンテナを構成するファイルシステムや、実行するアプリケーションや設定をまとめたもの
- コンテナ作成のテンプレート
Docker容器
- Dockerイメージを基に生成され、具現化されたファイルシステムとアプリケーションが実行されている状態
使用Docker镜像的操作
-
- Dockerの基本操作は、大きく分けてイメージに関する操作とコンテナに関する操作がある
- ここでは、イメージに関する操作について解説する
构建 Docker 镜像
-
- イメージのビルド
- Dockerfileを基に、Dockerイメージを作成する
使用 Docker 搜索
-
- イメージの検索
Docker Hubのレジストリに登録されているリポジトリを検索できる
拉取 Docker 镜像
-
- イメージの取得
- DockerレジストリからDokerイメージをダウンロードしてくる
列出Docker镜像
-
- イメージの一覧
- コマンドの実行対象であるDockerホストに保持されているイメージの一覧を表示する
Docker镜像标签
-
- イメージのタグ付け
- Dockerイメージの特定のバージョンにタグ付けする
将Docker镜像推送
-
- イメージの公開
- 保持しているDockerイメージを、Docker Hubをはじめとするレジストリに登録する
使用Docker容器的操作
使用docker容器运行。
- Dockerイメージから、コンテナを作成・実行する
列出Docker容器
- 実行中のコンテナおよび終了したコンテナの一覧を表示する
停止 Docker 容器
- 実行中のコンテナを終了する
重启 Docker 容器
-
- コンテナの再起動
- 一度停止したコンテナは、破棄しない限りこのコマンドで再実行できる
删除Docker容器
- 停止したコンテナをディスクから完全に破棄する
Docker 容器日志
- 実行している特定のコンテナの標準出力を表示する
Docker 容器执行
- 実行しているコンテナの中で任意のコマンドを実行できる
将docker容器cp命令进行中文本地化:拷贝Docker容器
-
- コンテナ間、コンテナ・ホスト間でファイルをコピーできる
- DockerfileのCOPYはイメージビルド時にホストからファイルをコピーするために利用するが、こちらは実行中のコンテナ間でのファイルのやりとりに使う
运用于管理的命令
修剪
清理 Docker 容器
- 実行していないコンテナを一括で削除
清理 Docker 镜像
-
- 不要なイメージを削除
- コンテナと同様、イメージも蓄積するとディスクを専有するので定期的に削除が必要
Docker系统清理
- 利用されていないコンテナやイメージ、ボリューム、ネットワークといった全てのDockerリソースを一括で削除
docker容器状态
- コンテナ単位でのシステムリソースの利用状況を確認
3. 构建和部署实用的容器
应用程序和容器的粒度
-
- 「1コンテナ=1プロセスを遵守すべき」という考え方が、Docker黎明期に一部のユーザー間で存在していた
-
- しかし1コンテナ=1プロセスの方式より、無理せず1つのコンテナで複数のプロセスを実行する方式の方がシンプルに完結するユースケースも多い
1コンテナに1つの関心事
Dockerの公式ドキュメントでは、「コンテナは一つの関心事だけに集中すべきだ」という見解がなされている
1つのコンテナは、ある1つの役割(ロール)や問題領域(ドメイン)のみにフォーカスされるべきである
容器的可移植性 de kě
-
- Dockerのポータビリティ(可搬性)は大きな利点だが、完璧なものではなく、いくつかの例外が存在する
-
- 全てのコンテナが、あらゆるホストのDocker環境で実行されるわけではない
- アプリケーションが利用するライブラリをダイナミックリンクするケースで、課題がある
Docker友好的应用程序
-
- コンテナの外部から挙動を制御するための手法
実行時引数
設定ファイル
アプリケーションの挙動を環境変数で制御
設定ファイルに環境変数を埋め込む
如何处理持久化数据
数据容量
-
- Dockerコンテナ内のディレクトリを、ディスクに永続化するための仕組み
- ホスト・コンテナ間でのディレクトリの共有・再利用が可能になる
容器部署策略
- 多くのリクエストを捌く必要のある実用的なシステムでは、複数のコンテナを複数のホストに配置させる必要がある
Docker 集群
-
- 複数のDockerホストを束ねてクラスタ化するためのツール
Docker in Docker
Dockerホストとして機能するDockerコンテナを複数個立てる
これで、Dockerホストをコンテナで入れ子にできる
服务
- アプリケーションを構成する複数のコンテナを制御するための概念
堆叠
- 複数のServiceをグルーピングした単位
使用Swarm进行实际应用程序的构建
-
- コンテナオーケストレーションでは、MySQL・API・WebのServiceをそれぞれ連携させて1つのアプリケーションを構築する
-
- このスタイルでは、Serviceに対するリクエストを複数のコンテナに分散できるため、耐久性の高いシステムを作れる
- 適切なノードのコンテナのデプロイやスケーリングをコンテナオーケストレーションの仕組みに任せられるのも、大きなメリット
5. 学习Kubernetes入门
Kubernetes是什么
-
- コンテナの運用を自動化するためのコンテナオーケストレーションシステム
-
- コンテナオーケストレーションの操作のためのAPIやCLIツールも提供する
-
- コンテナを用いたアプリケーションのデプロイなど、様々な運用管理の自動化を実現する
- Dockerホストの管理、サーバリソースの空き具合を考慮したコンテナ配置、スケーリング、ロードバランサー、死活監視などの仕組みを備える
Kubernetes的概念
-
- Kubernetesのリソースとは、アプリケーションのデプロイ構成するための部品
- コンテナとは別の粒度
Kubernetes集群和节点
Kubernetes群集
- リソースを管理する集合体
节点
-
- Kubernetesクラスタが持つリソースで最も大きな概念
- Kubernetesクラスタの管理下に登録されているDockerホストのことで、Kubernetesでコンテナをデプロイするために利用される
命名空间
-
- クラスタの中で入れ子となる仮想的なクラスタの概念
- クラスタを構築すると、予めdefault・docker・kube-public・kube-systemというNamespaceが用意される
播客
- コンテナの集合体の単位
复制集
- 同じ仕様のPodを複数生成・管理するためのリソース
部署
-
- ReplicaSetの上位のリソース
- アプリケーションデプロイの基本単位となる
服务 (fú wù)
- Kubernetesクラスタ内において、Podの集合(主にReplicaSet)に対する経路やサービスディスカバリを提供するためのリソース
入口
- ServiceのKubernetesクラスタの外への公開と、高度なHTTPルーティングを行う
6. Kubernetes的部署和集群建立
-
- クラウドへのデプロイに、GCPのマネージドKubernetesサービスであるGKE(Google Kubernetes Engine)を使う
-
- 自前でKubernetesクラスタを構築すると、マネージドサービスでは無いため、masterの可用性確保やKubernetesのバージョンアップといったメンテ作業を自ら行う必要がある
- 本番環境では、こういったKubernetesクラスタを適切に管理できる体制、あるいはGKEなどのマネージドサービスの利用が必要になる
7. Kubernetes的进阶应用
Kubernetes的多种资源
职业
-
- 1つ以上のPodを作成し、正常に完了するまでを管理するリソース
-
- Webアプリケーションなど常駐型アプリケーションではなく、大規模な計算やバッチ指向のアプリケーション向け
- Podを複数並列で実行することで、容易にスケールアウトできる
定时任务
-
- Jobは一度きりの実行だが、こちらは定期実行
- スケジューリングして定期的にPodを実行する
秘密
- 機密情報の文字列を、Base64エンコードした状態で扱えるリソース
用户管理和基于角色的访问控制(RBAC)
验证用户
- クラスタ外からKubernetesを操作するためのユーザーで、様々な方法で認証される
服务账号
- Kubernetes内部で管理され、Pod自身がKubernetes APIを操作するためのユーザー
基于角色的访问控制(RBAC)
-
- Kubernetesのリソースへのアクセスをロールによって制御するための機能・概念
- RBACを適切に利用することで、Kubernetesリソースに対するセキュアなアクセス制御を実現できる
舵
-
- 開発環境や本番環境など、環境が複数ある場合はKubernetesクラスタも複数用意する必要がある
- この課題を解決する技術がHelm
Kubernetes中的部署策略
滚动更新
-
- Deploymentリソースのデフォルト値がRollingUpdate
- RollingUpdateは、古いバージョンのアプリケーションを実行した状態で新しいバージョンのアプリケーションを起動し、準備ができたものから順番にサービスインしていく
蓝绿部署
- デプロイ時に、既存でデプロイされているサーバ群とは別に、新しいアプリケーションがデプロイされたサーバ群を用意し、ロードバランサーやサービスディスカバリレベルで参照先を切り替えることによってデプロイする手法
8. 货柜的运营
木材砍伐和运输的操作
在容器中的日志记录
- Dockerにはデフォルトでlogging driverという機能があり、JSON形式でログが出力される
容器日志的运维
-
- 従来型の非コンテナのアプリケーションでは、ログローテートの機能でロギングを行う
-
- Dockerコンテナの場合、コンテナが停止して削除されてしまうとログも消失してしまう
- そこで、標準出力したログがホストにファイル出力される仕組みを活用する
使用Fluentd和Elasticsearch建立日志收集和搜索机制。
-
- Dockerホストを複数運用するようになると、JSONログファイルを集約して管理・閲覧する仕組みが必要になる
- そのためにログコレクタのFluentd、ログを格納するデータストアとしてElasticsearch、データ可視化ツールのKibanaを使う
Docker主机和守护进程的运维
容器的实时恢复
-
- Dockerデーモン(dockerd)は、Dockerイメージやコンテナ・ネットワークを管理するデーモン
- コンテナを実行するのにdockerdは欠かせないが、dockerdを停止してもコンテナを実行し続けるライブリストアという仕組みがある
Dockerd的调优
最大并发下载数量
docker image pullにおけるイメージダウンロードの並列数を指定するオプション
デフォルト値は3
最大并发上传数
docker image pushにおけるイメージアップロードの並列数を指定するオプション
デフォルト値は5
镜像注册表
- Docker Hubのミラーレジストリを設定するためのオプション
障碍对策
在使用Docker时的故障处理措施
-
- 障害の要因として、意図しないコンテナを起動したり誤ったイメージを上書きしたりすることが考えられる
-
- これを防止するために、イメージが期待した構造になっているかのテストを行う
- イメージのテストを行うフレームワークとして、container-structure-testがある
Kubernetes在故障处理方面的运用
-
- Kubernetesには、Nodeがダウンすると停止したPodを別のNodeに再配置してくれるAuto-Healingという機能がある
-
- しかし、システムリソースが空いているNodeを選んで配置するため、同じNodeに複数の同じPodを配置する可能性がある
- これを解決するために、Pod AntiAffinityという仕組みがある
9. 制作更轻量的Docker镜像
轻量级的基础镜像
擦伤
-
- Dockerが予約された特殊なイメージ
-
- 全てのDockerイメージの始祖
- 中身は空
忙碌盒子
-
- 組み込み系システムで多く利用されるLinuxのディストリビューション
- 非常にサイズが小さいOS
阿尔派纳Linux
-
- BusyBoxをベースに作られたディストリビューション
-
- 「セキュリティ、シンプルさ、リソース効率を重視するパワーユーザー」向けに設計されている
- パッケージマネージャのapkが使える
制作轻量的Docker镜像
多阶段构建
-
- Docker17.05系より導入された仕組み
-
- ビルド成果物を生成するためのビルドコンテナと、デプロイして実行するためのコンテナに分けられる
- シームレスに軽量なDockerイメージを作れる
10. Docker的不同应用方式
-
- Dockerは、チーム開発で開発環境を統一・共有するのに適している
-
- Dockerコンテナを利用すれば、CLIツールもホストへのインストールなしで利用可能
-
- イメージによって、利用するCLIのバージョンを切り替えることも可能
- また、コンテナの複製、複数ノードへの展開によって発行するHTTPリクエスト数の限界を引き上げられるため、負荷テストにも使える