Part 1:概要説明とセットアップ

ようこそ! 皆さんが Docker の使い方を学ぼうとしており、私たちは嬉しく思います。

このチュートリアルは6つのパートで構成されています。

  1. セットアップと概要説明、このページです。
  2. 初めてのアプリを構築・実行
  3. アプリをスケールするサービスに変える
  4. 複数のマシンにまたがってサービスを展開
  5. 来訪者カウンタで残しておくデータの追加
  6. swarm をプロダクションにデプロイ

アプリケーションそのものは非常にシンプルです。そのため、プログラムが行っていることが分からなくなるようなことはありません。何といっても Docker の真価は、アプリケーションをどのように構築(build)・移動(ship)・実行(run)するかというところにあります。皆さんのアプリケーションが実際に何をするのかには関係がないのです。

必要条件

これから用語の定義を示していきます。あらかじめ Docker とは何か?(英語)なぜ Docker を使うのか(英語) を読んでおけば理解に役立つでしょう。

また以下の用語については理解できているものとして話を進めていきます。

  • IP アドレスとポート
  • 仮想マシン
  • 設定ファイルの編集
  • コード実行に関する依存関係と構築に関する考えについて、基本の熟知
  • CPU 使用率、メモリをバイトで扱うなど、マシン・リソースの使用に関する用語

コンテナの概要を説明

イメージ(image) とは実行可能なパッケージであり、軽量で、単独で動作(stand-alone)します。パッケージにはコード、ランタイム、ライブラリ、環境変数、設定ファイルなど、ソフトウェアの実行に必要な部品すべてを含みます。

コンテナ(container) とはイメージのランタイム・インスタンス(runtime instance;実行状態にあるモノ)です。そのイメージがメモリ上に置かれ実行されている状態のものです。デフォルトにおいてコンテナはホスト環境からは独立していますが、設定を行えばはホストのファイルやポートにアクセスできます。

ホストマシンのカーネル上で、コンテナはアプリケーションをネイティブに(訳者注;何らかのプログラムを通さず、直接の意味)実行します。仮想マシンでは、ホスト上のリソースにハイパーバイザを通してしかアクセスできません。そのためコンテナには仮想マシン以上の性能特性があります。コンテナはネイティブにアクセス可能であり、個々のコンテナは分離されたプロセス内で動作します。したがって通常の実行モジュールに比べてもメモリ消費が少なくて済ます。

コンテナと仮想マシン

以下の図を用いて、仮想マシンとコンテナの違いを見ていきます。

仮想マシン概念

仮想マシンスタックの例

仮想マシンではゲスト・オペレーティング・システムが稼動します。図における枠内の OS 層にあたります。仮想マシンはリソース負荷が高くなります。生成されるディスク・イメージやアプリケーションの状態は、さまざまな要素が複雑に入り組んでしまいます。OS の設定、インストールパッケージ、セキュリティパッチなどです。いずれも一時的なものにすぎず、どうなったかすぐ分からなくなるし、再構成するのも難しいものです。

コンテナ概念

コンテナスタックの例

コンテナは複数であっても1つのカーネルを共有します。コンテナイメージにとって必要なものは、実行モジュールと依存パッケージの情報のみです。これはホストシステム上にインストールされていなくても構いません。各プロセスはネイティブプロセスのように動作するので、docker ps というコマンドを使って個々に管理できます。 ちょうど Linux 上でアクティブプロセスを確認する時に ps を実行するのと同じです。つまり、依存関係がすべて含まれているため、入り組んだ設定となることもありません。コンテナ化(containerized)されたアプリはどこでも動く(run anywhere)ということです。

セットアップ

説明を進める前に、皆さんのシステム上に Docker 最新版がインストールされていることを確認してください。

注釈

Docker バージョン 1.13 以上が必要です。

docker run hello-world を実行したら、次のように表示されます。

$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
...(省略)...

ここでバージョン 1.13 以上を使っているかどうか確認してみてください。docker --version によって確認することができます。

$ docker --version
Docker version 17.05.0-ce-rc1, build 2878a85

このようなメッセージが表示されれば、旅に出る準備が整いました。

まとめ

取り扱う単位が、個別化し可搬性のある実行モジュールになるということには、極めて重要な意味があります。つまり継続的インテグレーション (CI)/継続的デリバリ (CD) においては、提供するアプリケーションのどの部分であっても容易に更新が可能となることを意味します。システムへの依存はもはや問題になることはなく、リソースの集約がさらに高まります。このような規模のプログラムを寄せ集めて実行できるわけですから、いかに素早く実行モジュールを提供できるかが問題になるのであって、新たな VM ホストを作り出す話ではないのです。

これらの全てを学ぶ前に、今は前に進みましょう。

参考

Get Started, Part 1: Orientation and Setup | Docker Documentation
https://docs.docker.com/get-started/