かつてVirtualBoxとVagrantを用いた仮想化技術を用い、開発環境を構築していた方も多いのではないでしょうか。

しかし現在ではDockerが広く利用されるようになり、その差は圧倒的。Dockerを採用すると様々な恩恵が受けられるからです。

記事前半ではDockerの特徴やメリット・デメリットについて解説します。またDockerとDocker Hubなど、類似する単語の意味について整理します。

また後半では実際にDockerをインストールし、イメージのダウンロードとコンテナの作成をおこなってみましょう。


Dockerとは

Dockerはコンテナ型の仮想環境を構築するための軽量なプラットフォームです。

2013年3月に登場し、一気に注目を集めました。その後GoogleやMicrosoftなどの企業もDockerを採用し始めます。

今ではAWSの「Fargate」「ECS」「EKS」をはじめ、AzureやGCPなどDockerを扱うサービスは広く展開されています。


Dockerの特徴

Dockerの特徴の最大のポイントはコンテナ型仮想化技術

コンテナは独立した仮想的な空間です。複数コンテナを同時に立てることができますが、通常は互いにアクセスできないようになっています。

アプリケーションを起動するために必要なアプリケーション本体やライブラリなどを含み、1コンテナにつき1プロセスを実行させるのが慣例です。

コンテナ型の仮想化では同一ホストOS上でコンテナエンジンが起動し、これが各コンテナの管理を行います


Dockerのメリット

Dockerの特徴に由来するメリットを順番に説明していきましょう。


環境構築が容易・短時間

Dockerを利用した環境構築の難易度は低く、公式ドキュメントやGitHubでも積極的にDockerイメージの紹介や共有が行われています

開発者は求める環境に近いDockerイメージをDocker Hubからダウンロードし、少しの変更を加えるだけで望む環境を手に入れることができます。

また軽量かつリソースの消費が少ないため、Dockerコンテナの作成コマンドを打ってから、起動するまでの時間も早いです。


手軽に環境を共有・統一できる

Dockerさえインストールされていれば、同じDockerイメージをダウンロードし、コンテナを作成するだけでアプリケーションを動かせます。

環境構築手順書などは不要です。Dockerfileやdocker-compose.yamlファイルが環境構築手順そのものです。

多くのプロジェクトでは環境別設定ファイルを修正し、「docker-compose up -d」コマンドを打つだけで開発に着手できるようにしています。

また本番環境でも同様の手順でコンテナが使用できるため、環境差異が極めて少ない状態で開発を行うことができます


リソースの消費が少ない

従来のハイパーバイザー型の仮想化と比べ、ディスクやメモリの消費が少なく済みます

これはハイパーバイザー型が仮想マシン上でゲストOSを起動するのに対し、コンテナはあくまでアプリケーションの実行のみを担うからです。


有益なDocker専用のWebサービス

Dockerの利用を前提とする便利なWebサービスが多く存在します。

例えばAmazon ECSはDockerコンテナの動作を管理するサービスで、自動スケーリングやコンテナの自動復旧機能などが利用可能です。

またCircleCIなどのCI/CDツールではDockerを用いたテスト・ビルド・デプロイの自動化が行えます。


Dockerのデメリット

Dockerにもできないことや苦手なことはあります。


単一OS(カーネル)上で動作

WindowsやMacでは裏側で高速なLinux仮想マシンを立ち上げ、この中でDockerを動かしています。

CentOSやUbuntuなどのDockerイメージが配布されていますが、これらはディストリビューション独自の部分のみを含んでいるものです。

Linuxカーネルの互換性を利用することで、動作を再現しているに過ぎず、互換性のない機能を利用している場合は動作しません。

もっとも極稀なケースであり、通常の使用で動かない状況に陥る機会はないでしょう。


Windowsでの利用のハードル

例えばWindows 10で「Docker for Windows」を利用するためにはHyper-Vの有効化をしなければなりません。

そしてHyper-Vを利用するには「Windows 10 Pro」が必要です。「Windows 10 Home」では利用できません。

また技術記事に出てきたコマンドが、Macでは動くがWindowsでは動かない、という場面に遭遇することもあります。

共有ディレクトリのマウントや権限周りの認証など、LinuxディストリビューションやMacに比べるとハードルが高いです。


Dockerの基本

DockerイメージとDockerコンテナは混乱しがちなキーワードです。

ここでしっかり定義を確認しておきましょう。


Dockerイメージ

DockerイメージはDockerコンテナを作成する時のベースとなるものです。

1つのDockerイメージから複数の別のコンテナを作成することもできます。

また特定のDockerイメージをベースに指定し、プロジェクトで必要な設定を追加したコンテナを作成することもできます。


Dockerコンテナ

DockerコンテナはDockerイメージから作成した、実際に動かせるものです。

DockerコンテナからDockerイメージを作成することもできますが、コンテナ内の状態が分からなくなる可能性があります。

このため後述するDockerfileを利用して明示的にDockerイメージを作成することをおすすめします。


Docker Hubとは

Gitに対するGitHubに相当するものがDocker Hubです。Docker HubはいわばDockerイメージのリポジトリです。

GitHubがGitのリポジトリを扱うのに対し、Docker HubではDockerfileから生成されたDockerイメージを取り扱います

DockerではこれをDockerレジストリと呼んでいます。詳しく見ていきましょう。


世界中のDockerイメージを蓄積

Dockerレジストリには世界中のDockerイメージが集積されています。ほんの一部ですがご紹介しましょう。

  • Webサーバー(nginx・httpd)
  • データベース(postgres・mongo・mariadb)
  • Webアプリケーションフレームワーク(rails・django)

Docker Hubには自作のDockerイメージを公開できる機能や、組織とチームを作成して複数メンバーでリポジトリを共有できる機能もあります。


Docker公式の認定と検証で安心

公式と認定されたリポジトリの内容は、Docker社の専任チームによりレビューが行われています。

Dockerイメージは公式リポジトリのものを使用するようにしましょう。

検索条件に「Verified Publisher」「Official Images」を指定すれば絞り込み検索ができます。


DockerとDocker Hubの違い

GitとGitHubがそうであるように、DockerとDocker Hubもまた似たような関係にあります。

Dockerはプラットフォーム、Docker HubはDockerイメージをホスティングするWebサービスです。


Dockerのセットアップ

Dockerのセットアップ手順はmacOS・Windows 10・各種Linuxディストリビューション毎に異なっています

本項では「Docker Desktop for Mac」の手順に絞って解説します。

詳細な手順については以下を参照して下さい。


Dockerのダウンロード

Docker Hubにアクセスし、インストールファイルをダウンロードします。


Dockerのインストール

ダウンロードした.dmgファイルをダブルクリックし、インストールを行って下さい。


Dockerの使い方

Dockerを利用する時の流れは次のようになります。

「Dockerの基本」で触れたイメージとコンテナの違いを意識し、コマンドの意味を理解しながら手を動かして下さい

試しにnginxのDockerイメージをダウンロードし、コンテナを起動してページにアクセスしてみましょう。


Dockerイメージのダウンロード

Docker Hubのnginxのページにアクセスし、「docker pull nginx」コマンドをコピーしましょう。

コマンドを実行するとダウンロードを開始します。

  1. ~$ docker pull nginx
  2. Using default tag: latest
  3. latest: Pulling from library/nginx
  4. (中略)
  5. Status: Downloaded newer image for nginx:latest
  6. docker.io/library/nginx:latest

「Using default tag: latest」と表示されています。Dockerはタグを指定しなければ、デフォルトで最新のDockerイメージを取得しましょう。

特定のタグのDockerイメージを取得したい場合はTagsから探します。例えばバージョン1.17のDockerイメージが欲しい場合は次のようになります。

  1. ~$ docker pull nginx:1.17

docker images」コマンドでダウンロードされたDockerイメージを確認することができます。

  1. ~$ docker images
  2. REPOSITORY TAG   IMAGE ID   CREATED   SIZE
  3. nginx    1.17  6678c7c2e56c 3 weeks ago 127MB
  4. nginx    latest 6678c7c2e56c 3 weeks ago 127MB

Dockerコンテナの作り方

次のコマンドを実行するとNginxのWebサーバーが起動します。

  1. ~$ docker run –name mynginx -p 8080:80 nginx
  • http://localhost:8080/

上記URLにアクセスするとNginxのデフォルトの画面が表示されている筈です。

docker ps」コマンドで起動中のDockerコンテナを確認することができます。別のコンソールを開いて確認してみましょう。

  1. ~$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. f2e8b5436516 nginx ”nginx -g ‘daemon of…” 31 hours ago Up 4 minutes 0.0.0.0:8080->80/tcp mynginx

また起動中のコンテナ内には以下のコマンドで入ることができます。

  1. ~$ docker exec -it mynginx bash


Dockerで使用するファイル

ここではDockerを使用するプロジェクトに存在する3つのファイルについて簡単に説明します。


Dockerfile

公開されているDockerイメージをベースに、カスタムしたDockerイメージを作成するために使用する定義ファイルです。

ライブラリのインストールやディレクトリ共有、ポートフォワーディングなどの設定を記述します。

Dockerfileを見ればベースのDockerイメージに加えられた変更が分かるようになっています。


.dockerignore

Dockerイメージを作成する際に、含めたくないディレクトリやファイルを指定しましょう。

.gitignoreと考え方は似ていますが、ビルドの速度に影響が出るため、必要最低限の記述に留めるのが良いとされています。


docker-compose.yaml

「docker-compose up」コマンド一発で複数のDockerコンテナを起動する時に使用される設定ファイルです。

例えばWebアプリケーションの開発環境であれば、Webサーバー・プログラミング言語の動作環境・データベースなどのコンテナの用意が要ります。

またデータベースと通信するためのポートの設定なども行います。


DockerはWeb開発に必要不可欠なツール

Dockerは今やGitやチャットツールなどと同様、プロジェクトに参加する上で扱えるようにしておくべきプラットフォームです。

共有された開発環境をスムーズに扱えるよう、最低限の使い方やコマンドは頭に留めておきましょう

また環境を構築し共有する側に立つこともあるかもしれません。

必要に迫られてから慌てないよう、基本的な概念や仕組みについて理解しておきましょう。