Dockerは開発環境や本番環境、あるいはインフラCIのためのテスト環境を構築する際など、アプリケーション開発・運用のいろいろなケースで使われるようになりました。

チームの開発環境にDockerを採用するメリットとして、「Dockerについて特に理解していなくても、コマンドを実行するだけで開発環境を整えられる」という利便性があります。 これは特にデザイナーなど非エンジニアのいるチームに有用です。

一方で、知識がまったくない状態だと、ちょっとした問題に当たったときに原因の特定に時間がかかってしまいます。 今回は、まだDockerを利用したことがない人を対象に、基礎についてまとめてみました。

Dockerとは

Dockerは、コンテナ型の仮想化を実現するためのソフトウェアです。

これまでの仮想化技術として、Vagrantに代表されるハイパーバイザー型があります。 ハイパーバイザー型はホストマシン上でゲストマシンを動作させ、その中でさまざまなプロセスが動きます。 自由度が高い一方、OSからブートするため起動に時間がかかり、またリソースの消費が多いなどの問題があります。

一方コンテナ型は、ホストマシン上で、一般的なアプリケーション同様プロセスとして動作します。 ハイパーバイザー型でいうOSのブートがないので、高速に起動できます。 また、ホストマシンのカーネルを直接利用するため、メモリやディスク消費を抑えることができます。

1コンテナ=1プロセスなので、コンテナ単位の自由度はハイパーバイザー型に比べて低いですが、複数のコンテナを組み合わせることでいろいろなケースに活用することができます。

Dockerのメリット

Dockerはコンテナ型ですが、このコンテナの元となるイメージをDockerfileというファイルで定義します。 つまりコンテナのふるまいをコードとして記述できるため、動作が明示的であるというメリットがあります。

また、一般的なWebアプリケーションを開発する際、アプリケーションやDB、Redis、Elasticsearchなど多くのサービスを立ち上げる必要が出てきます。 Dockerを利用すると、それぞれ専用のマシンを立ち上げる必要がないため、起動が速く、またメモリやディスク容量といったリソースの消費を抑えることができます。

このサービス単位でイメージを用意することで、開発環境や本番環境などで設定を共通化することもできます。 環境ごとの差異がなくなることで、開発にかかるコストを少なくすることができます。

こういった理由から、Dockerはチームでの開発環境の構築や本番環境としてなど、さまざまなところで利用されています。

用語集

次に、Dockerを利用する上で聞くことになる基本的な用語についてまとめてみます。

Dockerイメージ

コンテナのテンプレート。 ベースとなるイメージを指定、それに対して処理を定義していき、最終的にビルドしたものがDockerイメージとなります。

コンテナ

Dockerイメージからつくられる仮想環境で、プロセス空間やネットワークなどが隔離されたところ。 1つのコンテナで1つのプロセスが動作します。

レジストリ

Dockerイメージが登録されている場所。 たとえば、パブリックなレジストリサービスとしてDocker Hubがあります。

Dockerサーバ

Dockerイメージやコンテナを管理するサービス。 このサービスに対して、CLIなどをとおしてイメージやコンテナを操作します。

Dockerクライアント

ユーザがDockerを操作するためのコマンドなど、周辺ツールをまとめたもの。 いわゆるdockerコマンドなどがこれにあたります。

インストール

Dockerはインストール用のパッケージが公式サイト上で配布されているので、一般的なアプリケーションと同じ方法でインストールを行ないます。 手順にしたがってインストールすることで、Dockerサーバ/クライアントの両方がインストールされます。

参考記事

おわりに

Dockerはいろいろなユースケースがありますが、開発環境の構築だけでもできるようになると、開発がとても楽になります。

次回は、RubyとPostgreSQLを用いてRuby on Railsアプリケーションの開発環境をつくってみます。