ハンズオン勉強会の心がけ

最近、「ハンズオン勉強会ってどうやってやっています?」という質問を受けたりします。

自分自身ここ2年くらい、専門学校の授業、コミュニティの勉強会、イベントのトレーニング講座等でハンズオンを実施しています。

これまでやってきたことをベースに整理してみたいと思います。

もちろん、この記事の内容が全て正しいということもないので、 参考程度に留めていただければと思います。

よく受ける質問としては以下となります。

  • 受講者の対応について
  • ハンズオン環境はどうしている?
  • 資料ってどんな感じ?

1つずつ見ていきたいと思います。

受講者の対応について

受講者には、初心者、中級者、上級者というカテゴリーはあると思いますが、 自分はこれまで、初心者向けのハンズオンを中心にやってきました。

専門学校では、コマンド操作も初めてとなる学生に対してのLinux入門、 Linuxのコマンド操作やパブリッククラウドでIaaS操作が一通りできることを前提とした、 Docker,Kubernetes,Rancherの入門ハンズオンをやってきました。

人数については、以下となります。

  • 専門学校:20~25名
  • 勉強会:15名
  • レーニング講座:30名

ある程度の条件を前提に受講者を募ったとしても、 受講人数の大小に関係なく、進捗に差というものが生じることがあります。

もちろん誰もつまずくことなくスムーズに進む場合もあればその逆もあります。

つまずく方が2,3名位であれば、講師をしながら対応して、進行していくこともできます。 それ以上になると、厳しくなり進行に影響が出る可能性が高まります。

つまずいている方に対応しきりになってしまうと、 すでにタスクを完了している人を待たせることになったり、 講義の進行が遅れてしまいます。

有料の場合だと、時間内にカリキュラムを終えられず、 主催者、受講者に損害を被ることになり得るので注意が必要です。

解決策としては、以下となります。

  • チューターをアサイ
  • ハンズオン時間を多めに確保

チューターをアサインというのは、講師とは別にもう1名用意することです。 つまずいた方への対応をチューターにお願いして、講師は進行を先に進めることができます。

チューター人数も多いに越したことはありませんが経験上、受講者15名以内でチューター1名、 30名近くであれば2,3名位が目安かと思います。

ハンズオン時間を多めに確保というのは、つまずく方が多くなりそうだと思うところでは、 ハンズオンの時間を多めに想定して、進行に影響が出ないようにします。

受講者全員が、カリキュラムを全て完了できる最善を尽くすのが努めと思って頑張っています。

ハンズオン環境ってどうしてる?

ハンズオン環境は、受講者全員が同じ環境でカリキュラムを行うことが理想です。

受講者が使うPC、クラウド環境、VM環境、チューター等の全てを主催者側で準備できることに越したことはありません。 しかし、それを実現しようとするとそれなりの費用が必要となります。

有料の場合は、そのあたりの費用も加味して行うことはできますが、 無料を前提とした勉強会などでは難しいというのが現実です。

まずは、自分がこれまで無料前提で行ってきたハンズオン勉強会の話をしたいと思います。

Dockerのハンズオン勉強会では、参加条件として受講者にラップトップ持参の上、 ハンズオンで利用するCentOS7をVirtualBox仮想マシンまたはパブリッククラウドのIaaSなどの事前準備をお願いしています。

パブリッククラウドでの準備では基本問題ないのですが、 VirtualBoxだとやはり受講者のラップトップのスペックや個人の環境起因で仮想マシンからインターネットに出られない等不具合が生じてしまうケースが多いです。 事前環境準備の手順書を公開しても生じてしまうケースもあります。

環境準備でつまずいてしまうと、いきなり進行が遅れてしまいます。

解決策としては、以下となります。

受講者が既にパブリッククラウドに登録している場合は、有料無料問わず、ご自身で利用してもらうことを前提にお願いしています。

VirtualBoxの利用時は、環境準備の段階で主にネットワーク周りでうまく行かなくなるケースがよくありますが、パブリッククラウドの場合はそのあたりはたまにFWの設定問題は出てきますが、概ね良好です。

ハンズオンの内容によってはそれなりのスペックを必要とする場合があります。 どうしてもVirtualBoxなどの仮想マシンだと受講者のラップトップスペックにも限りがあるので、 高スペックを求める場合はパブリッククラウドを利用せざるを得なくなります。

クラウドベンダーも統一して行いたい場合は、募集時にクラウドベンダーを指定し、 アカウントを持っていない方に対しては無料期間利用を推奨しています。 教材もそのクラウドベンダー前提で作成して行います。

有料前提の場合だと、クラウドベンダーと提携して行ったりすることが多いので、 それを前提とした教材作りで進めることができます。

自分の場合は以前、パブリッククラウドのコミュニティとコラボレーションな形式(無料)で そのハンズオン勉強会の時間だけSSHログインを許可してもらって実施したこともあります。 受講者にSSHの接続パブリックIPアドレス、ユーザー名、パスワードを渡すだけとなり、 受講者もSSHログインできる環境の準備だけで済むので理想的です。 また、受講者のラップトップがMac/Windowsどちらでもよいという利点もあります。

他のコミュニティやクラウドベンダーとのコラボレーションを検討してみるのも良いと思います。

ハンズオン勉強会の会場ですが、Wifi、電源、プロジェクターは必須だと思うのでそれに見合う会場を選定しましょう。

Wifiは、人数が多くなると会場によっては遅延が発生しやすいのでそのあたりも考慮しておく必要があります。 電源は、会場によってはタップも完備のところもありますが、無いところが多いので事前に準備しておくとよいと思います。 プロジェクターは、広い会場だと後方の方が見えづらくなったりするのでラップトップでも見られる工夫が必要となります。(詳細は後半でお話します)

資料ってどんな感じ?

資料については、以下の2種類を利用しています。

  • スライド資料
  • ハンズオンテキスト(Webページ)

ハンズオン勉強会といっても当然座学はあるので、座学の部分はスライドを使用します。

スライドでは説明的なものは文字、図解、イラスト、画像など一般的なプレゼン資料を作るのと同じです。

ハンズオンに入る前に、全体像が分かる図があることが望ましいです。 全体像が分からずただコマンド操作だけになると、 うまく動いたけど理解できた気がしないという結果に陥る可能性が高まります。

実際にハンズオンで実行するコマンド部分も掲載します。コマンドの実行結果については、 短いもの(スライドのレイアウトやページ数に影響が出ない)については掲載しています。 この後お話するハンズオンテキストの方にはすべてコマンド結果は掲載しています。

コマンド結果をなぜ掲載するかというと、 やはり結果がどうなるか分からないと受講者がちゃんとできたかどうか分からず、戸惑ってしまう場合があります。

ハンズオンテキストについてですが、これは実際に実行するコマンドを記載したテキストになります。 これはテキストエディタで作成して当日配布でも良いですが、自分はこれまでWebページに用意して実施してきました。 専門学校ではローカルで実行できるWebデータを配布してブラウザで表示されるコマンドをコピーして、SSHコンソールでペーストして行っています。 勉強会などでは主にQiitaを使用しています。もちろんブログなどでも良いです。

コマンドを手打ちで行うとオペミスとかで思わぬ不具合やつまずきポイントになり、進行にも影響が出る可能性も高まります。

コピペだけ淡々と実行するだけとならないように、最初にスライドで説明したり、実行時に説明しながら実行するように心がけています。

テキスト内容では、定義ファイル等もvimでコピペできるようにしています。git cloneするでも良いですが、 手打ちまでいかなくとも少しでも定義ファイルの内容に触れられるようにしています。

ハンズオンテキストをWebで公開しておくことで、受講者がハンズオン勉強会後でも復習できるメリットもあります。 また、スライド資料も公開することで合わせて復習できます。 会場のプロジェクターで見ずらい問題も受講者の手元で見られるため、解決します。

資料を公開できない事情などある場合は、紙資料または電子資料で配布などで対応することもあります。

あくまでも自分の経験則であり、ケースバイケースもあります。 参考になれば幸いです。

良い方法などありましたら教えていただけると嬉しいです。

【書評】Docker/Kubernetes 実践コンテナ開発入門

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

 

あまりにも内容が素晴らしく感銘を受けましたので、僭越ながら感謝の気持ちを込めて書評を書かせていただきます。

コンテナ技術に関する書籍は、これまでも色々と出版されてきましたが、ここまでコンテナアプリケーションの設計、構築、デプロイ、運用に至る開発スタイルを網羅した書籍はこれまでになかったと思います。

私自身、実際にコンテナアプリケーションの開発、運用を実践している方が出版する書籍をずっと待ち望んでいたのと、著者のブログを読んでさらに早く読みたいという欲求が抑えきれず、書泉ブックタワーで先行発売の情報を知り、駆け付けた次第です。

私のコンテナ歴としては、基本的に専門学校や社内外の勉強会でのハンズオンでDocker/Kubernetes/Rancherを教えたり、個人で検証してQiitaやコミュニティでプレゼンしたりするレベルです。2017年にDockerCon、KubeCon/Cloud Native Conにも参加しました。

翔泳社コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤の第六章 Rancher2.0を執筆しました。(宣伝すみません。)

主観になりますが、章ごとに書評させていただきます。



1.Dockerの基礎

この章は、私的に知識の整理、復習として読み進めることができましたが、実際にコンテナアプリケーションの開発、運用を実践している著者だけあり、「Dockerを利用する意義」における、「Infarastructure as CodeとImmutable Infrastructureの考え方を簡単かつ低コストに実現するのがDockerです。」という一文は簡潔かつ非常に説得力感じました。

そして、全体的に言えるのですが、コラムの内容が非常に充実しています。この章のMobyプロジェクトとLinuxKitについては、長くコンテナ技術をキャッチアップしている人にとってはバックグラウンド知識として既知のことかもしれませんが、これから始める人にとって有益な情報だと個人的に思います。

「ローカルDocker環境を構築する」では、Docker for Windows/Mac,Linux環境へのインストールが非常に丁寧に書かれているので、始めやすいと思いました。

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

DockerイメージとDockerコンテナの違いを簡潔に説明し、サンプルアプリケーション、Dockerfile、Dockerイメージビルド、Dockerコンテナの実行までを出力結果を含めて説明しているので、実際に手を動かさなくても理解しやすく読み進めることができました。

コラムに書かれている、「短いdockerコマンド」では、自分はこれまで旧来のコマンドで実行していましたが、操作対象の明確性の向上という理解に共感し、今後は新コマンドで実行しようと思いました。

Dockerflileのインストラクション(命令)について、私もDockerfileを書き始めた頃に意識したADDとCOPYの違いやCMDとENTRYPOINTの使い分けについてもしっかり書かれていてさすがだと思いました。

お恥ずかしながら、MAINTAINERインストラクションが非推奨になっていたのは知らなかったので、今後はLABELを利用します。(MAINTAINER自体使っていませんでした)

docker searchコマンド結果で、公式リポジトリ名前空間に一律でlibraryがついているというのも知りませんでした。

「Dockerコンテナの操作」では、コマンド結果も書かれていますし、説明も簡潔なので非常に分かりやすいです。docker container run --rm はやはり実践ならではの説明だと思いました。

「Docker Composeでマルチコンテナを実行する」では、JenkinsコンテナのMasterとSlave構成もやったことがなかったので、勉強になりました。

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

知りたいエッセンス満載でした。

「アプリケーションをコンテナの中にどのように配置すればよいのか?、1コンテナにどれだけの役割を担わせるべきか?、細かく役割を分割したが、システム全体として複雑になっていないか?」や「1コンテナ=1プロセスを厳守すべきか?」、「コンテナのポータビリティ」、「永続化データをどう扱うか」等は、誰もが知りたいエッセンスではないでしょうか。ここはネタバレにはしたくないので、是非じっくり読んで欲しいと思います。実践経験者ならではの実績、見解を基に非常に分かりやすく、簡潔に書かれています。

この章の後半から、著者の意向としてDocker Swarmの理解が自ずとKubernetesも理解しやすいというところからDocker Swarmの内容となります。私自身、Docker Swarmを触ることなくKubernetesに行ったので、逆になるところはありますが、著者の意向を理解することができました。Rancherの1系に実装されているRancher独自のオーケストレーションツールであるCattleに似ているところもあるという印象も受けました。

dindの環境構築は少し入門者にはハードルが高い気もしました。

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

この章は、実際にTODOアプリを動かすシステムをDocker Swarm上にコンテナで構築する内容となっています。MySQL,API,Web,NginxのコンテナをDockerfileからビルドしてイメージをレジストリにpushしてから、実際にデプロイして構築していくので、それぞれの機能のコンテナをどう連携してシステムを実現していく流れを体感できます。Ingressも含まれています。

正式発売前で設定ファイル等ダウンロードできなかったので、読み進めて理解しただけですが、ここは発売後に実際に手を動かして改めて確認しようと思います。

環境変数も駆使されているのでそのあたりも学ぶポイントだと思います。

5.Kubernetes入門

この章は、Kubernetesの情勢的な話から、ローカル環境の構築、そして、Kubernetesの概念として、Master,Node,Namespace,Pod,ReplicaSet,Deployment,Service,Ingressについてマニフェストファイルの内容とkubectlコマンドの実行結果を含めて書かれているので非常に分かりやすいです。Deployment,ReplicaSet,Podの関係性の説明がしかっりされているところはさすがです。この辺りの理解の重要性は改めて感じました。

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

 この章は、GKE(Google Kubernetes Engine)を利用して、gcloudコマンドベースにKubernetesクラスタを作成して、前章のTODOアプリケーションをKubernetes用にカスタマイズしてデプロイします。その中で、PersistentVolume,PersistentVolumeClaim,StorageClass,StatefulSetをマニフェストファイルとkubectlコマンド結果を含めて簡潔に説明しているので、これまた非常に分かりやすいです。特にこれまでStatefulSetによるDBサーバを構築したことがなかったので、どういう仕組みで、どうやって実現するかを理解できたことが本当に嬉しかったです。

こちらも設定ファイル入手後に実際に手を動かしてみます。

コラムにあった、kubectxというのは正直知らなかったので有益な情報でした。

オンプレに対するKubernetesクラスタ構築について、kubesprayとAnsibleの組み合わせが簡潔に書かれています。私自身、kubesprayを使ったことが無いのでとても勉強になりました。Ansibleもyaml,Kubernetesyamlという観点で考えるととても素敵だと思ってしまいました。

7.Kubernetesの発展的な利用

この章は、KubernetesのJob,CronJob,Secret,RBACについて簡潔に書かれています。特にRBACの認証ユーザーとServiceAccountは詳細に書かれていてます。ここまで書かれている日本語書籍は現時点でこの書籍だけだと思います。この辺りも実際に運用しているからこその内容だと思います。まだ理解しきれていないところもあるので、理解できるまでじっくり読ませていただきます。

そして、著者が力を入れているであろうと感じるHelmについても簡潔に書かれています。Helmについては、日本語書籍、いや日本語ドキュメントとしてもこの書籍が初だと思います。私自身もHelmについて色々と調べている時期があって、著者のブログ記事など参考にさせていただいた記憶があります。

RBAC対応アプリケーションのインストールや独自Chart、独自Chartリポジトリの作成をここまで詳細に書かれているのは本当にありがたいです。

Kubernetesのデプロイについても簡潔かつ詳細に書かれています。

RollingUpgradeの箇所でmaxUnavailable,maxSurge,livenessProbe,readinessProbeについは、実践経験者ならではの説明で本当にありがたい有益な内容です。GracefulShutdownのコラムは読み応えありました。

BlueGreen Deploymentの箇所もselectorラベル変更によるDeployment切り替えについて簡潔に説明されています。「サービスメッシュを実現するLinkerdとIstio」というコラムも著者の検証中の内容も加味したうえでの見解が良かったです。

8.コンテナの運用

この章は、ロギングの運用として標準ログ出力の有用性、Elasticsearch Fluentd Kibanaによるログ収集と検索をdocker-comose.ymlを使って環境構築をして体感できます。この辺りも誰もが知りたいエッセンスだと思うので是非じっくり読んでもらいたいです。早く設定ファイルを入手して体感したいと思っています。

その他のログ収集ツールとして、Stackdriverについても書かれています。これも知らなかったのですが、sternというツールについても書かれていて発見でした。

「Dockerホストやデーモンの運用」の「dockerdのチューニング」箇所で、max-concurrent-downloads,max-concurrent-uploadsでpullやpushの並列数をチューニングできることを知れたのは嬉しかったです。ミラーレジストリによるレイテンシの影響を調整するのも有益情報でした。

「Docker/Kubernetesの運用はマネージド?非マネージド?」このコラムの見解も非常に参考になりました。

「障害対策」では、PodAffinity,PodAntiAffinity,Horizontal Pod Autoscaler,Cluster Autoscalerは非常に勉強になりました。このあたりもやはり実践経験者ならではと思わざるを得ませんでした。

コラムの「GKE On-Prem」については、かなり最近の情報まで入っているところが良心を感じました。

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

知りたいエッセンス満載でした。

scratchについては、ベースイメージの奥深さを感じ、勉強になりました。ここでADDの仕組みが理解できたのもよかったです。

BusyBoxといのも詳細は知らなかったので、勉強になりました。

かつて一度だけ開催されたAlpine Linux Meetupで登壇されただけあり、Alpine Linuxについて詳細に書かれていますし、ここまで詳細に書かれている書籍は他に無いです。貴重で有益な情報に感謝です。

「軽量なDockerイメージをつくる」における、Dockerイメージの構造理論からDockerfile作成の工夫、malti-stage buildsの内容は非常に勉強になりました。本当にありがたい内容です。

10.Dockerの様々な活用方法

この章では、私的に「負荷テスト」のLocustというツールは知らなかったので勉強になりました。このあたりも誰もが知りたいエッセンスではないでしょうか。

Appendix-A セキュリティ

知りたいエッセンス満載でした。

DockerHubを始めとするレジストリにおけるセキュリティ、Docker Bench for Security、適切なアクセス制御、クレデンシャル(機密情報)の扱い等、セキュリティは避けては通れないので非常に有益な内容なので、是非じっくり読んでいただきたいと思います。

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

独自Dockerレジストリの構築、CI/CDとしてCircleCI、AWS FargateとECSなど著者の観点で簡潔に書かれてます。参考になりました。

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

dockerコマンド、Dockerfileのインストラクション、docker-composeコマンド、docker swarm/stackコマンド、helmコマンドがまとめられています。Helmコマンドは詳細に書かれてます。非常にありがたいです。


こうした内容の理解は、Microservice,ServiceMeshの分野においても理解必須だと思いました。

称賛ばかりで恐縮ですが、本当に良書です。

400ページ以上にまとめ上げたのは非常に大変だったと思います。

これだけの素晴らしい内容を書籍として出版して頂けたことに感謝です。

実際に開発、運用の現場にいたくてもいられない自分にとっては、有益になる情報ばかりでした。何度も繰り返し見返し、読み続けたいと思います。

初心者から上級者、プロダクション利用の有無問わず、コンテナ技術に興味がある誰もが求めているエッセンスが盛り込まれていると思いますので、オススメ致します!!