エンジニアHubPowered by エン転職

若手Webエンジニアのための情報メディア

今日からはじめるDocker - コンテナー仮想化の必要性を理解して、まず開発環境に導入してみよう!

Dockerは、コンテナー仮想化ツールです。本稿では、サーバーサイドのアーキテクチャの歴史からDockerが生まれた流れや背景を説明し、PCの開発環境で実際にインストールしてDockerの動作を体験します。

Docker Container

エンジニアの方であれば、「コンテナー」や「Docker」といったキーワードを耳にしたことがあるかと思います。自分が関わっているシステムの開発や運用に活用できるかどうか検討している方もいるでしょう。

この記事の前半では、コンテナーやDockerとはそもそもどういったものかを概観していきます。後半では、PC(WindowsやMac)を使ってローカルでDockerを試していきます。

コンテナーとDockerを歴史から知る

Dockerは、コンテナー仮想化ツールです。

Dockerを理解するには、まずサーバーサイドのアーキテクチャの歴史を知るところから始めましょう。この章では、Dockerが生まれた流れや背景を説明していきます。

物理マシンでの処理プロセスの解説から始まり、サーバー仮想化の仕組みや、パブリッククラウドへの変遷、Dockerに使われるコンテナーという概念を、ひとつずつ紐解いていきます。

仮想化前はすべて手作業だった

まず、データベースやWebサーバーといった、サーバーサイドのプロセスの稼働を考えてみましょう。従来のサーバーサイドでは、物理マシン(サーバーハードウェア)上でOS(Linux、Windows Serverなど)が動作し、そのOS上で、データベースやWebサーバーのプロセスが動作します。

開発・テスト・本番環境といったさまざまな環境を構築するとき、ハードウェアが手元になければハードウェアの調達に始まり、OSやネットワーク、OS上で動作するソフトウェアなどのインストールや構成といった、多くの手順を踏む必要がありました。これは時間がかかり、手動作業によるミスも起きがちでした。

サーバー仮想化技術の採用

そんな中で発展してきたのが、サーバー仮想化技術です。古くは1960年代からメインフレームで実用化されていたものですが、2000年代に入ってから、PCサーバー上でのサーバー仮想化が広く採用されるようになってきました。

サーバー仮想化は、1台の物理マシン上で複数の「仮想マシン」を実行するものです。物理マシン上で「ハイパーバイザー」と呼ばれる仮想化に特化したOSが動作し、そのハイパーバイザー上で複数の仮想マシンが動作します。それぞれの仮想マシンでは、ゲストOS(x86サーバーの場合は、Linux、Windows Serverなど)と、そのゲストOS上で動作するソフトウェアが稼働します。

PCサーバー向けのハイパーバイザーの代表例としては、次のものがあります。

サーバー仮想化には、さまざまな利点があります。従来、別々の物理マシン上で動作していた複数のシステムを、同一の物理マシン上で動作する複数の仮想マシンとして統合、集約できるようになるのです。

仮想マシン上で動作するソフトウェアからは、自身が物理マシン上で動いているように見えるので、仮想サーバーへの移行は比較的容易です。新しい環境を準備する際も、既存のサーバー仮想化基盤に仮想マシンを作成するだけなので、ハードウェアの調達は不要です。

また、OSやソフトウェアがインストール・構成済みの「仮想マシンイメージ」を事前に準備しておくことで、まったく同じ構成の仮想マシンを何度でも作成できます。仮想マシンや、その下の物理マシンに障害が発生した場合は、正常な物理マシン上にその仮想マシンを移行して復旧できるため、システムの可用性も向上します。

仮想マシン

Windows 8.1以降(Proエディション以上)では「Hyper-V」、macOSのOS X Yosemite(10.10)ではオープンソースのハイパーバイザー型の「xhyve」がサポートされています。

エンジニアの方がローカルでサーバー仮想化を行いたい場合は、これらのハイパーバイザーか、または後述のホスト型のサーバー仮想化実装を使うことになるでしょう。記事の後半では、WindowsやMacで、Hyper-V/xhyveを使ってDockerを試していきます。

ホストOS上で仮想マシンを動かせるホスト型

サーバー仮想化には、前述の「ハイパーバイザー型」に加えて、ハイパーバイザーではない通常のOS(ホストOS)上で、仮想マシン(ゲストOS)が動作する「ホスト型」もあります。

パブリッククラウドの普及

2000年代後半になると、IaaS(Infrastructure as a Service)型のパブリッククラウドが普及しはじめました。主要なパブリッククラウドのIaaSサービスの例としては、次のものがあります。

クラウドプラットフォーム IaaSサービス
Microsoft Azure Azure Virtual Machines
AWS(Amazon Web Services) Amazon EC2(Elastic Compute Cloud)
Google Cloud Platform Google Compute Engine

これらのIaaSサービスを使うと、自分で物理マシンやネットワークを所有・管理することなく、好みのスペックの仮想マシンをオンデマンドで作成し起動できます

スペックや起動時間を基にした従量課金で料金を支払い、不要になればいつでも仮想マシンを停止・削除できるのがメリット。ハードウェアを購入する必要がないので初期投資が不要になり、システムへの負荷に合わせてエラスティック(伸縮自在)にシステムのスケーリングができるようになります。

コンテナーの活用

2013年に登場したオープンソースプロジェクトの「Docker」によって、サーバー仮想化に代わるモデルとしてコンテナーが注目され始めました。「OSレベルの仮想化」とも呼ばれるコンテナーでは、物理マシンや仮想マシンの上で動作するOS(ホストOS)上で、ゲストOSなしに、分離された複数のプロセス(コンテナー)が動作します。

コンテナーは、同じホストOS上で動作している他のコンテナーが使うリソース(CPU、メモリ、ディスクI/O、ネットワーク通信、ファイルなど)を確認することはできません。

コンテナー

そのため、サーバー仮想化の仮想マシンの場合と同様に、コンテナー内からはあたかも独立した物理マシン上で動作しているように見える利点があります。その一方で、仮想マシンごとに、最低でも数GB以上のメモリ、ある程度のCPU、数十GB以上のディスクを消費するゲストOSを起動するというオーバーヘッドを回避することができます。

コンテナー自体は、決して新しいテクノロジーではありません。コンテナーの先駆けとなったchroot(UNIXでプロセスのルートディレクトリーを変更する操作)は1982年に登場しています。2000年代に入ると、FreeBSD jail、Solaris Containersといった実装も相次いで登場しました。

Linuxでは、プロセスIDやファイルシステムといったリソースを分離するnamespacesや、CPU・メモリ・ディスクI/Oといったリソースを管理するためのcgroupsが登場し、これらのテクノロジーを組み合わせたコンテナー実装であるLXC(Linux Containers)も登場していました。

では、Dockerでは何が新しくなったのでしょうか?

Dockerの登場

Dockerは、Docker, Inc.が主導して開発されているオープンソースのコンテナーテクノロジーです。Dockerは、Linuxの既存のコンテナー実装(cgroupsやnamespacesなど)に、抽象化・自動化のためのレイヤーを追加するものです。Dockerを使うことで、LinuxのホストOS上で複数のコンテナー(実体はLinuxのプロセス)を実行できます。

Dockerには、コンテナーの「イメージ」という概念があります。イメージは実行可能なソフトウェアのパッケージであり、アプリケーションの実行に必要となるすべてのコード、ランタイム、ツール、ライブラリー、設定情報が含まれています。

ゲストOSのすべてのバイナリが含まれている仮想マシンイメージがGBクラスになるのとは違い、コンテナーのイメージは小さければ数十MB程度になります。

実行したいコンテナーイメージさえ準備しておけば、ローカルマシン、オンプレミス(社内設置型)のサーバー環境、パブリッククラウドなど、Dockerを実行できる多様な環境で、そのコンテナーイメージを実行できます。

アプリケーションをコンテナーとして実行することで、柔軟性とポータビリティーが得られるわけです。

開発者・運用担当者から見るDockerのメリット

DevOps(開発者と運用担当者が一体化した開発手法)という言葉がありますが、ここではDevとOpsそれぞれにとっての利点を考えてみましょう。

開発者(Dev)にとっては、Dockerを使って開発環境の構築を自動化することにより、アプリケーション開発に集中することができます。

面倒なデータベースのインストール作業をする必要もないですし、プログラミング言語やツールの複数のバージョンをインストールして、それらを切り替えながら使っていく必要もありません。必要となるソフトウェアや依存関係はすべてコンテナーの中にあるので、「自分のマシンでは動くのだけど、他の環境では動かない」といった問題を回避できるのです。

次に、運用担当者(Ops)はDockerによって、アプリケーションのデリバリーが簡素化されます。バグ修正や新機能を迅速にデプロイできるようになります。開発環境から本番環境にわたって、アプリケーションのビルド、テスト、デプロイを自動化しやすくなるのです。

目的別Dockerの利用パターン

Dockerの典型的な利用パターンを、いくつか見てみましょう。

利用パターン 説明
DevOps CI/CD(継続的インテグレーション/デリバリー)によってデプロイのパイプラインを自動化し、フィードバックを迅速に取得し、開発生産性を向上する
マイクロサービス マイクロサービスアーキテクチャで設計されたアプリケーションの開発、デプロイを簡素化する
従来型アプリケーションのモダナイゼーション(現代化) 既存アプリケーションをコンテナー化することで、コード修正することなしに、コストを削減し、クラウドへの移行もしやすくする
インフラストラクチャ最適化 アプリケーションをコンテナー化することで、サーバーの高密度化、集約を進め、コストを削減する
ハイブリッドクラウド オンプレミス環境からパブリッククラウドまで、コードの修正することのない、完全なポータビリティーを実現する

これらにメリットを感じるようであれば、コンテナーのより詳細な情報をぜひ調べてみてください。

Dockerを試してみよう! 開発環境へのインストールと起動

さて、ここからは実際にDockerを使ってコンテナーに触れてみましょう。

Dockerには、中核となるコンテナーエンジンを提供する無償のCommunity Edition(CE)と、運用管理やセキュリティーを強化した有償サブスクリプションで利用できるEnterprise Edition(EE)があります。どちらも、Red Hat Enterprise Linux(RHEL)やUbuntuなど各種のLinuxディストリビューション、Windows Serverなどサーバー環境、AzureやAWSといったパブリッククラウド環境で利用できます。

さらに、Docker Community Editionは、開発環境(WindowsまたはmacOS)でも利用できます。ここでは、自分の開発環境に次のDocker Community Editionをインストールしてみましょう。

Docker for Windows
Docker for Mac

Docker for WindowsとDocker for Macには、共通して次のコンポーネントが含まれています。

コンポーネント 説明
Docker Engine サーバーサイドで動く中核となるコンテナーエンジン
Docker CLI クライアントサイドで動くコマンドラインインターフェイス
Docker Compose 複数のコンテナーを定義し実行するためのツール
Docker Machine ローカル、またはパブリッククラウド上のリモートの仮想マシンにDockerをインストールし管理するためのツール
Kitematic Windows、macOSでDockerを管理するためのGUIツール

Docker for Windowsの場合

記事執筆時点(2017年9月)では、Docker for Windowsは、64bitのWindows 10 Pro以上のエディション(Pro、Enterprise、Education)で、「1511 November Update, Build 10586」以降のバージョンをサポートしています。

また、Docker for Windowsでは、Hyper-Vが有効化されている必要があります。これは、WindowsのホストOS上でLinuxのコンテナーを直接起動することができないため、Docker for Windowsでは、WindowsのホストOS上でHyper-Vを使ってLinuxの仮想マシン(ゲストOS)を起動し、その上でLinuxのコンテナーを起動する、というアーキテクチャになっているためです。

32bit環境、Windows 7、Windows 10 Homeなどはサポートされていないことに注意してください。サポートされていないWindows環境をお使いの場合、可能であれば、64bitのWindows 10 Proへのアップグレードをご検討ください。

64bit環境であれば、Docker for Windows以前のソリューションであるDocker Toolboxを使うこともできます。Docker Toolboxは、64bitのWindows 7以降のWindowsをサポートしています。Docker Toolboxでは、Linux仮想マシンの起動のためにHyper-VではなくOracle VM VirtualBoxを使っているため、Hyper-Vが有効化されている必要はありませんし、Hyper-Vを使えないHomeエディションもサポートされています。

Docker Toolbox

この記事ではDocker Toolboxの情報は割愛します。詳細はDocker Toolboxのドキュメントをご確認ください。

Docker StoreからDocker for Windowsをダウンロードします。記事執筆時点では、Windows向けのStable、Edge、Windows Server 2016向けのEdgeというビルドが提供されています。特に理由がなければ、Stableをダウンロードし、インストールしましょう。

Docker Community Edition for Windows - Docker Store

インストールが完了したら、スタートメニューから「Docker for Windows」アプリケーションを実行します。初回実行時には「Welcome」ダイアログが表示されます。

初期化が完了したら、ステータスバーのクジラのDockerアイコンにマウスオーバーすると、「Docker is running」と表示されます。

ステータスバーのDockerアイコンを右クリックし「Settings...」をクリックすると、「Settings」ダイアログが表示されます。このダイアログでは、Windows起動時のDockerの自動実行の有無、Dockerの自動アップデートの有無、共有ドライブ、ネットワーク、プロキシなど、さまざまな設定を行えます。「Advanced」では、Dockerに割り当てるCPU数やメモリ量を設定できます。Dockerの起動に失敗する場合は、メモリ量やCPU数を減らしてみましょう。

ここまでで問題が発生した場合は、ドキュメントナレッジベースGitHubリポジトリのIssuesなどで調べてみてください。

Docker for Macの場合

記事執筆時点で、Docker for Macは、2010以降のモデル、OS X El Capitan 10.11以降、4GBのRAMを必要としています。

Docker for Macがサポートされない環境では、Windowsと同様にDocker Toolboxを利用できます。Docker Toolboxは、OS X 10.8 Mountain Lion以降をサポートしています。

Docker Storeで、Docker for Macをダウンロードします。Stable、Edgeというビルドが提供されています。特に理由がなければ、Stableをダウンロードし、インストールしましょう。

Docker Community Edition for Mac - Docker Store

インストールが完了したら、アプリケーションフォルダーの「Docker.app」を実行します。初回実行時には「Welcome」ダイアログが表示されます。

初期化が完了したら、ステータスバーのクジラのDockerアイコンをクリックします。

running.png

「Docker is running」というステータスやメニューが表示されます。

メニューの「Preferences...」をクリックすると、Preferencesダイアログが表示されます。このダイアログでは、macOS起動時のDockerの自動実行の有無、Dockerの自動アップデートの有無、共有ドライブ、プロキシなど、さまざまな設定を行えます。

「Advanced」では、Dockerに割り当てるCPU数やメモリ量を設定できます。Dockerの起動に失敗する場合は、メモリ量やCPU数を減らしてみましょう。

running.png

問題が発生した場合は、ドキュメントナレッジベースGitHubリポジトリのIssuesなどで調べてみてください。

Linuxマシンへのインストール

ローカルでLinuxの仮想マシンや物理マシンを使えたり、AzureやAWSといったパブリッククラウド上のLinuxの仮想マシンを使える場合は、そのLinuxマシンにDockerをインストールすることもできます。

詳細は、パブリッククラウドプロバイダーやLinuxディストリビューション向けのドキュメントを確認してください。

Docker CLIの実行

Dockerのインストールが完了していれば、ターミナル(Windowsのコマンドプロンプト、macOSやLinuxのターミナル)では、Docker CLIdokcerコマンド)が使えるようになっているはずです。この記事では、Windowsのコマンドプロンプトを利用した場合の表示結果を記載しています。

C:\>docker

Usage:  docker COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default
                           "C:\Users\nasat\.docker")
  -D, --debug              Enable debug mode
      --help               Print usage
  -H, --host list          Daemon socket(s) to connect to
.....
Run 'docker COMMAND --help' for more information on a command.

クライアントであるDocker CLIは、サーバーであるDocker Engineに接続します。リモートホストのDocker Engineに接続することもできますが、ここではローカルホストのDocker Engineに接続しています。

docker versionコマンドを実行すると、クライアントとサーバーの情報を確認できます。ここでは、Windows上のクライアント(Docker CLI)が、同じWindows上のHyper-V上の仮想マシンとして動作しているLinux上のサーバー(Docker Engine)に接続しています。

C:\>docker version
Client:
 Version:      17.06.1-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   874a737
 Built:        Thu Aug 17 22:48:20 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.06.1-ce
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   874a737
 Built:        Thu Aug 17 22:54:55 2017
 OS/Arch:      linux/amd64
 Experimental: true

docker infoコマンドで、Docker Engineの詳細情報を確認できます。

C:\>docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.06.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host ipvlan macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
.....

Docker CLIの詳細については、次のドキュメントを参照してください。

Use the Docker command line | Docker Documentation

公開されているコンテナーイメージの利用

Docker Hubは、Dockerイメージの公開リポジトリです。人気の高いソフトウェアの多くが、Docker Hubでコンテナーイメージとして公開されています。ぜひ検索してみてください。ここでは、そのうちいくつかを実行してみます。

Docker Hub

Hello Worldコンテナーの実行

docker run hello-worldコマンドを実行してみましょう。

このコマンドによって、まず、hello-worldコンテナーイメージで、タグ名が(最新バージョンを意味する)latestのものが、ローカルにないことを確認し、Docker Hubからこのコンテナーイメージをプル(ダウンロード)します。

library/hello-world - Docker hub

その後、このコンテナーイメージを基に、新たにコンテナーを実行します。このコンテナーは、「Hello from Docker!」から始まるメッセージを出力して終了します。

C:\>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b04784fba78d: Pull complete
Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

docker imagesコマンドを実行し、ローカルに存在しているコンテナーイメージの一覧を確認します。先ほどプルされたhello-worldイメージがあります。

C:\>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              1815c82652c0        2 months ago        1.84kB

docker psコマンドを実行し、実行中のコンテナーの一覧を確認します。先ほど実行したhello-worldコンテナーは終了しているので、現在実行中のコンテナーはありません。

C:\>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker ps -aコマンドを実行し、終了済みのものを含むすべてのコンテナーの一覧を確認します。先ほど実行したhello-worldコンテナーが表示されます。

C:\>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
7def86dc6a12        hello-world         "/hello"            8 seconds ago       Exited (0) 7 seconds ago                           flamboyant_euler

Ubuntuコンテナーのインタラクティブ実行

hello-worldコンテナーの出力でも紹介されていた、docker run -it ubuntu bashコマンドを実行してみましょう。これによって、Docker Hubから、Ubuntuコンテナーイメージの最新バージョン(latest、記事執筆時点では16.04)がプルされ、Ubuntuコンテナーが実行されます。

-itオプションを使うと、実行したコンテナー上で、指定したコマンド(ここではbashを実行し、インタラクティブに操作できます。

library/ubuntu - Docker hub

ここでは、Ubuntuコンテナーでいくつかのコマンドを実行し、exitコマンドでコンテナーを終了しています。

C:\>docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
d5c6f90da05d: Pull complete
1300883d87d5: Pull complete
c220aa3cfc1b: Pull complete
2e9398f099dc: Pull complete
dc27a084064f: Pull complete
Digest: sha256:34471448724419596ca4e890496d375801de21b0e67b81a77fd6155ce001edad
Status: Downloaded newer image for ubuntu:latest
root@f0bb88d7fd85:/# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    11 pts/0    00:00:00 ps
root@f0bb88d7fd85:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
root@f0bb88d7fd85:/# exit
exit

初回実行時には、コンテナーイメージのダウンロードに多少の時間がかかります。同じdockerコマンドを再実行すると、ローカルにコンテナーイメージをプル済みなので、コンテナーが即座に起動することがわかるでしょう。docker imagesdocker psコマンドなども適宜実行し、状況を確認してみましょう。

nginxコンテナーとポート公開

docker run -d -p 8080:80 --name webserver nginxコマンドを実行します。Docker Hubからnginxコンテナーイメージがプルされ、実行されたnginxコンテナーを「webserver」と命名しています。

library/nginx - Docker hub

コンテナー内では、Webサーバーのnginxが起動しており、ポート80をリッスンしています。-pコマンドによって、コンテナーのポート80が、ホストOSのポート8080にマッピングされています。

C:\>docker run -d -p 8080:80 --name webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
94ed0c431eb5: Pull complete
9406c100a1c3: Pull complete
aa74daafd50c: Pull complete
Digest: sha256:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3
Status: Downloaded newer image for nginx:latest
f1144c3bdf811d31d4f358e41e0f2b3b17d0c43e0d29c62b3fc67bae19b4127d

Webブラウザーやcurlコマンドなどでhttp://localhost:8080/にアクセスし、nginxのデフォルトのトップページが表示されることを確認してみましょう。

docker psコマンドで、nginxコンテナーが実行中であることを確認し、docker stopコマンドでこのコンテナーを停止します。docker stopのパラメーターには、コンテナー実行時に命名した名前に加えて、docker psコマンドで確認できるコンテナーIDを使うこともできます。

コンテナーIDは、最初の数桁だけの省略形を使うこともできるので、次の実行例では、docker stop f114でも動作します。

C:\>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f1144c3bdf81        nginx               "nginx -g 'daemon ..."   2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   webserver

C:\>docker stop webserver
webserver

C:\>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Dockerfileを使ったコンテナーのビルド

ここまでは、Docker Hubで公開されているコンテナーイメージを使ってきました。 しかし、自分で開発・運用するシステムでは、カスタムのインストールや構成、コード追加を行ったコンテナーイメージを作成する必要があります。

ここでは、先ほど使ったnginxコンテナーイメージを基にして、カスタムのindex.htmlを追加したコンテナーイメージをビルドしてみましょう。

作業ディレクトリーを作成し、そのディレクトリーで、お好みのテキストエディターを使って、次の内容を含む2つのファイルindex.htmlDockerfileを作成します。

C:\mynginx>dir
.....
08/29/2017  01:36 PM                95 Dockerfile
08/29/2017  01:34 PM                20 index.html
.....

C:\mynginx>type Dockerfile
FROM nginx
MAINTAINER satonaoki <satonaoki@example.com>
ADD index.html /usr/share/nginx/html/

C:\work\mynginx>type index.html
Hello from Docker!

ここで作成したDockerfileは、カスタムのコンテナーイメージを作成するための手順を示したファイルです。ここでは、nginxコンテナーイメージを基にして、index.htmlファイルを/usr/share/nginx/html/ディレクトリーに追加しているだけです。

docker buildコマンドを実行します。ここでは、ビルドするコンテナーイメージの名前をsatonaoki/nginx、タグを1.0に指定しています。docker imagesコマンドを実行すると、今ビルドしたコンテナーイメージの存在を確認できます。

C:\work\mynginx>docker build -t satonaoki/nginx:1.0 .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx
 ---> b8efb18f159b
Step 2/3 : MAINTAINER satonaoki <satonaoki@example.com>
 ---> Using cache
 ---> 0bc0c44cec12
Step 3/3 : ADD index.html /usr/share/nginx/html/
 ---> Using cache
 ---> 1c0260ee1f3f
Successfully built 1c0260ee1f3f
Successfully tagged satonaoki/nginx:1.0
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

C:\work\mynginx>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
satonaoki/nginx     1.0                 1c0260ee1f3f        About a minute ago   107MB
ubuntu              latest              ccc7a11d65b1        2 weeks ago          120MB
nginx               latest              b8efb18f159b        4 weeks ago          107MB
hello-world         latest              1815c82652c0        2 months ago         1.84kB

ビルドしたコンテナーイメージを基にコンテナーを実行し、Webブラウザーやcurlコマンドなどでhttp://localhost:8080/のレスポンスを確認してみましょう。カスタムのトップページindex.htmlを備えたnginxのコンテナーイメージを作成できていることがわかりますね。

C:\work\mynginx>docker run -d -p 8080:80 satonaoki/nginx:1.0
0eda88e080dd797b131c6f70d0a3322c1c905f4e2ce2693bf8a02b04576eb043

C:\work\mynginx>curl http://localhost:8080/
Hello from Docker!

Dockerfileの詳細については、Dockerfileリファレンスを参照してください。

おわりに

ここまで紹介してきたのは、Dockerのほんの入り口にすぎません。Docker Composeを使った複数コンテナー構成の実行、Docker Hubやプライベートレジストリを使ったコンテナーイメージの管理、DevOpsやCI/CD(継続的インテグレーション/デリバリー)におけるDockerの統合、Kubertenes、Docker Swarmといったコンテナーオーケストレーションの利用、マイクロサービスアーキテクチャにおけるDockerの活用などなど、この分野には興味深いトピックが数多くあります。

また、この分野は、技術的に変化、進化、アップデートが激しい分野でもあります。 今回の記事を読んで、Dockerやコンテナーに興味を持ったら、Webの情報、勉強会、コミュニティやセミナー、書籍などでさらに知識を深め、実際にテクノロジーに触れてみてくださいね。

付録A. Windowsコンテナー

今回の記事では、LinuxのホストOS上でLinuxベースのアプリケーションを実行する、Linuxコンテナーを紹介してきました。その一方で、MicrosoftとDocker Inc.は協力して、Windowsでのコンテナーの実装に取り組んできました。Windowsコンテナーでは、Windows Server 2016やWindows 10をホストOSとし、その上でWindowsベースのアプリケーションをコンテナーとして実行できます。

詳細は、Microsoft Docsの「Windows コンテナーに関するドキュメント」を参照してください。

Windows 10上でDocker for Windowsをお使いの方は、Docker for Windowsのメニューで「Switch to Windows containers...」をクリックすると、Docker for WindowsがLinuxコンテナーモードからWindowsコンテナーモードに切り替わります。

試してみたい方は、ドキュメント「Windows 10 の Windows コンテナー」のチュートリアルを試してみてください。

付録B. Azureにおけるコンテナーのサポート

Microsoftのパブリッククラウド「Microsoft Azure」では、単にLinuxやWindows Serverの仮想マシン(IaaS)上でDockerを使えるだけではなく、次のようなコンテナー関連の多様なサービスを提供しています。これらのサービスを活用することで、より効率よくコンテナーを利用できるようになります。

サービス 説明
Azure Container Service Kubernetes、DC/OS、Docker Swarm を使った、コンテナーのスケーリングとオーケストレーション
Azure Container Instances コマンド1つでのコンテナーの手軽な実行
Azure Container Registry コンテナーイメージのレジストリへの格納、管理
Azure Service Fabric Windows、Linuxでのマイクロサービスの開発とコンテナーオーケストレーション
Azure App Service Linuxコンテナーを使ったWebアプリケーションのデプロイ
Azure Batch コンテナーを使ったコンピューティング ジョブの実行

詳細は、Azureにおけるコンテナーのページを参照してください。

Microsoft Azure Containers | Microsoft Azure

執筆者プロフィール

さとうなおき @satonaoki

さとうなおき
2010年にMicrosoftに入社以降、一貫してパブリッククラウドプラットフォーム「Microsoft Azure」のテクノロジスト/エバンジェリストとして、技術啓蒙やプロジェクトの技術支援を行っている。

編集:薄井千春(ZINE)