Dockerとは
コンテナ型のサーバ仮想化技術を用いた、デプロイに対する課題を解決するために作られた技術。
サーバ仮想化
サーバ仮想化とは、『あるマシン』上で仮想的に『別のマシン』を動かすことで、仮想化する側の『あるマシン』を ホストマシンと呼び、仮想化される『別のマシン』を ゲストマシンと呼ぶ。
例えば、Amazon EC2のような仮想ソフトウェアのXenを使って物理サーバ上で仮想的に複数台のサーバを動かすなどという形で使われていたりする。
サーバ仮想化技術には主に次の2つがある。
VM型仮想化
上記で述べたように、Amazon EC2などのクラウドサービスで見られる仮想化方式。基本的には、仮想化ハイパーバイザの機能によって。ハードウェアやファームウェアレベルまで丸ごと仮想化することで、あるOSのマシン上で独立したOSのマシンを動かせる。
コンテナ型仮想化
コンテナ型仮想化は、Dockerで用いられている仮想化方式。
コンテナ型仮想化の場合、マシン上で稼働するOSはひとつだけ。そのOSの内部のユーザー空間を分離して、それぞれのプロセス、ファイル、ネットワーク、CPU/メモリ/デバイスなどのリソースを制御し、閉じ込めたユーザ空間が「コンテナ」と呼ぶ。なので、ゲストOSはホストマシンと同じである必要がある。
Dockerは、このコンテナ型仮想化技術であるLinuxコンテナ(LXC)のローレベルのカーネル機能を活用するためのツールで、コンテナ内部で動かすアプリケーションの実行環境の管理が簡単になる。
Dockerのメリット
- アプリケーション実行環境に必要十分なものをパッケージングし、再現性を保ったままデプロイできる。
- VMと比較してパフォーマンスの劣化が少なく、仮想マシンの起動が早い
- それぞれのアプリケーションが独立した環境で実行される
- パッケージング、デプロイ、起動のどれもが簡単に行える
結果として、次のワークフローが可能になる - 開発者がアプリケーションをイメージに保存し、
- そのイメージをシステム管理者に共有し、
- システム管理者が本番環境までイメージを運び、
- 開発環境で動いていたアプリケーションをそのまま本番環境で動かす
Dockerコンテナ
Dockerでは仮想マシンのことを、Dockerコンテナ、またはコンテナと呼ぶ。各コンテナは独立しており、作成、起動、停止、削除が行える。
Dockerイメージ
仮想マシンにはもとになるイメージが必要になる。DockerではDockerイメージ、またはイメージと呼ぶ。
アプリケーションをイメージとして保存することをパッケージングすると表現していたが、Dockerではイメージをビルドすると表現する。1つのイメージからいくつでもコンテナを作成できる。
Dockerイメージを構築するには、主に3つの方法がある。
- Docker Hubから取得
- コンテナをコミットする
- Dockerfileで構築する
これらの構築方法の一番の違いは、イメージの作成を手動で行うか、自動で行うか。
何をインストールするかやどのようなコマンドを実行するかなど、すべての処理が明示的である、Dockerfileをのみを使って運用するのがベストプラクティス。
ベストプラクティス
- Dockerfileを使う
- コンテナレイヤのサイズを抑え、レイヤ数を最小限に
- .dockerignoreを使う
- コンテナはいつでも捨てれるようにする
- シンプルに保つ
- 1コンテナ1プロセス
Dockerfileを書く際の基本方針は小さいイメージを作ること。そして、レイヤ数を少なくするには &&
と \
を使って関連するコマンドを連結することでレイヤ数を減らすことができる。連結しすぎると、キャッシュを使った効率的なビルドという恩恵が受けられなくので注意。.dockerignoreや不要なファイルを削除することによって、イメージをより小さくすることができる。
イメージが小さければ、ビルドや、pushやpull、コンテナの起動にかかる時間が短くなる。
コンテナがいつでも捨てられる状態というのは、
- プロセスの起動・終了が秒単位で実行できる
- コンテナの設定とアプリケーションコードが分離している
- ステートレス(データは外部に保存している)
- コンテナ外にログを出力している
上記の条件を満たしていること。
1コンテナ1プロセスとは、アプリサーバコンテナとwebサーバコンテナやFluentdコンテナのように、それぞれ別々に立てたのちに連携させること。1コンテナ1プロセスにしておくことで、あるサービスだけリスタート・アップデート・垂直/水平にスケールさせたい場合や別のミドルウェアに入れ替えたい場合などに対応しやすくなる。
複数のコンテナにまたがるサービスを管理するにはどうすればいいのか?
Docker Composeとは
複数コンテナ管理のためのオーケストレーションツール。
Docker Composeを使うと、複数コンテナから成るシステムを一括管理できる。(YAMLファイル)
Docker Composeでできること
- 複数のコンテナをコードで管理
- コンテナの同時起動・停止
- コンテナのスケール
- ネットワーク機能に対応
以下のようにYMLファイルで書くことができる
mysql:
image: mysql:5.6.23
environment:
MYSQL_ROOT_PASSWORD: 'pass'
ports:
- '3306:3306'
nginx:
build: nginx
ports:
- '8080:80'
links:
- app
app:
build: .
ports:
- "80:80"
- '3000:3000'
links:
- mysql
こういった感じで複数コンテナを一括で管理できるかつ、だいたいdocker run
のオプションとも対応しているので楽に管理できる。
複数サーバの管理はDocker Swarmというのがあるけど、それはまたこんど。