派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】DockerとKubernetesでアプリケーション開発にコンテナをフル活用!

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年11月7日のイベントでは「DockerとKubernetesでアプリケーション開発にコンテナをフル活用!」と題して、コンテナ型の仮想サーバーソフトウェアであるDockerにフォーカス。システム開発環境から本番環境の構築まで、幅広い用途に利用され、サーバエンジニアはもとより、ソフトウェア開発エンジニアからも注目されています。
書籍『Docker/Kubernetes実践コンテナ開発入門』の著者である山田明憲さんを講師にお迎えし、Dockerの基礎から活用までをレクチャーしていただきました。

■今回のイベントのポイント

・Dockerとは?コンテナとは?
・Dockerを体験する
・Dockerフレンドリなイメージをつくる
・コンテナオーケストレーションとは?
・Kubernetesでの実践的なアプリケーション開発
・パブリッククラウドでのコンテナ運用
・コンテナの運用を支えるツール

【講師プロフィール】
山田 明憲さん
2012年、株式会社サイバーエージェント入社。ライブ配信サービス「FRESH LIVE」のテックリードを務める。著書として「Docker/Kubernetes 実践コンテナ開発入門(技術評論社刊)」。バックエンド技術を中心に、SRE、DevOps等が守備範囲。

Dockerとは? コンテナとは?

最近よく耳にするDockerとはいったい何か?山田さんは、イチから説明してくれました。

サーバの仮想化技術は、ホストOS型とコンテナ型の2つに分けられます。

f:id:itstaffing:20181226145005j:plain
▲Dockerはコンテナ型の仮想化技術。ホストOS型とコンテナ型、それぞれに長短がある

Dockerは、アプリケーション、ライブラリ、設定もコンテナ内に含まれるため、優れたポータビリティをもたらしてくれ、インフラを気にせずアプリケーションをデプロイできるという点が開発者に支持されているそうです。

Dockerを体験する

さっそく、Dockerで環境を構築してみます。

ローカルPC上でDocker環境を構築するには、PC用のアプリケーションであるDocker Desktopを利用します。Docker Desktopをインストールし、仮想環境イメージであるDockerイメージを取得し、Dockerコンテナを実行するという手順になります。

f:id:itstaffing:20181226145009j:plain
▲Docker Desktopの画面

Dockerイメージとは、コンテナを構成するファイルシステムやアプリケーション、設定などをまとめたもので、コンテナとは、その内容を具現化したものです。

多数のイメージがアップロードされているサイトDocker Hubからイメージをダウンロードします。今回は、山田さんが執筆された書籍で使用しているサンプルをダウンロード。これはHTTPでGETリクエストを送信すると「Hello Docker!!」というメッセージを返すという、ごくシンプルなサーバが稼働するDockerイメージです。

f:id:itstaffing:20181226145012j:plain
▲docker image pullコマンドでダウンロードし、docker container runコマンドで実行。オプションでポート9000を、コンテナのポートの8080にフォワードしている。これによりポート9000にGETリクエストを送ると、仮想サーバ環境のポート8080にフォワードされる

結果は、見事にメッセージが表示されました。

次に、Dockerイメージをビルドする方法も紹介してくれました。まず、アプリケーションを用意し、配置します。

f:id:itstaffing:20181226145017j:plain
▲実行したいスクリプト(ここではhelloworld)とDockerFileを配置する

DockerイメージをビルドするにはDockerFileを用意します。

f:id:itstaffing:20181226145020j:plain
▲DockerFileの内容。FROMはベースイメージ、COPYは実行させたいアプリケーションへのパス、RUNでchmodにより実行権限を与え、CMDでコマンド名を指定する

用意できたら、イメージをビルドします。

f:id:itstaffing:20181226145023j:plain
▲docker image buildコマンドでイメージをビルド。docker image lsコマンドでイメージファイルが作成されたかどうかを確認

Dockerフレンドリなイメージをつくる

コンテナは複製しやすいのですが、デプロイする環境によって、たとえばデータベースの接続先や、アプリケーション参照するAPIのホストを変えるなど、デプロイする環境に応じて制御してあげる必要があります。

こうしたコンテナの挙動は、あらかじめ指定しておくことで制御できます。その方法として「実行時の引数で指定する」「アプリケーションの設定ファイルをデプロイ先ごとに変更する」「環境変数を使う」の3つがあります。

山田さんによれば「環境変数は、変数を1箇所だけ変えて試すなど、小回りが利くため、トライアンドエラーしやすいのでお勧めです」とのこと。具体的には、アプリケーションの設定ファイルの記述に環境変数を利用します。

f:id:itstaffing:20181226145026j:plain
▲Springフレームワークの設定ファイルpropertiesの例

そして「Docker上でアプリケーションを開発する場合は、動作を指定するのに、環境変数を参照できるように設計しておくことがポイント」だそうです。

コンテナオーケストレーションとは?

コンテナを使って本格的にアプリケーションをデプロイするようになると、デプロイするコンテナも増えていきますが、コンテナの配置が難しくなります。

「どのコンテナをどのように配置するか?」「ホストのマシンリソースを効率的に使う配置はどうなるか?」「コンテナへのアクセス経路をどう決めるか?」「スケールアウト/インをどのように行うか?」など、考えなければいけない要素が膨れ上がります。

f:id:itstaffing:20181226145030j:plain
▲コンテナ数が増えていくと、その配置はもはや人間が考えることではなくなる

これを解決するのが、複数のホストを跨ぎ、複数種のコンテナを矛盾のない形でサーバリソースを考慮しながら効率的に配置するのが「コンテナオーケストレーション技術」です。

代表的なコンテナオーケストレーション技術として、Docker Compose、Docker Swarm/Stack、Kubernetes、Apache Mesos、Amazon Elastic Container Service(ECS)などがありますが、デファクトスタンダードと呼べるのがKubernetesだそうです。

Kubernetesでの実践的なアプリケーション開発

Kubernetes(クバネティス、クーベルネィティス)は、Google社内のコンテナ基板から派生した技術で、現在はOSSとして公開されています。Docker DesktopにもKubernetes統合の機能が用意されています。

f:id:itstaffing:20181226145033j:plain
▲Docker DesktopのKubernetes統合をオンにすると、コマンドラインツールkubectlがインストールされ、Kubernetesクラスタのリソースを操作・閲覧ができるようになる

kubectlで操作するKubernetesのリソースとは「アプリをデプロイさせるために必要な部品のようなもの」と考えればよいそうです。

今回はKubernetesのリソースの中から、Pod、Deployment、service、ingressの4つについて解説されました。

Podはコンテナをグルーピングするためのもので、これによりPod単位で複数のコンテナをまとめてデプロイできます。

f:id:itstaffing:20181226145037j:plain
▲Nodeを跨ぐことはできないが、コンテナをまとめて扱える

Podは1つのマニュフェストファイルにつき1つしか作成できませんが、実運用では同じPodを大量に複製することで可用性を高めます。これを実現するのがDeploymentです。

f:id:itstaffing:20181226145039j:plain
▲ReplicaSetによりPodが複製され配置される。これをコントロールするリソースがDeployment

そして、Podの集合に対するルーティングやサービスディスカバリ機能を提供するリソースがServiceです。

f:id:itstaffing:20181226145043j:plain
▲Serviceはルーティングやディスカバリだけでなくロードバランシングの機能も提供する

Serviceは、クラスタ内部にしかサービスを提供できませんが、これをクラスタの外部に公開するためのリソースがIngressです。アプリケーションを外部に公開するにはIngressの設定が必要になるそうです。

パブリッククラウドでのコンテナ運用

Kubernetesをゼロから構築していくのは大変です。そこで利用したくなるのが「Kubernetesマネージドサービス」です。GKEならば、数分でKubernetesクラスを構築可能だそうです。サービスは、Google(GKE)やAmazon(EKS:東京リージョンでは未提供)、Microsoft(AKS)などが提供されていますが、山田さんによれば、KubernetesはGoogleのプロジェクトから生まれたこともあり、GKEのサービスが一番進んでおり、EKSやAKSが後を追っている状況だそうで、「現状ではGoogleのGKEが現実的な選択肢」とのことです。

コンテナの運用を支えるツール

コンテナが増えるとログを管理するのも大変です。最後に、実運用時に便利な、コンテナ運用を支えるツールをいくつか紹介されました。

f:id:itstaffing:20181226145046j:plain
▲「Elasticsearch+Kibana」は、全文検索でコンテナのログの保存と可視化を行うツールで、対象のコンテナがどこで動いているかを把握するのに便利とのこと

今回のイベントは、以前から興味のあったDockerでしたが、短い時間でコンテナの実行から、イメージの作成、デプロイまで、概念のみならず具体的な手順やノウハウまで学ぶことができました。PC上でも動かせるので、自分で試してみたくなった方も多いはずです。注目の技術なだけに、これを機に理解を深めましょう。