今日からはじめるDocker - コンテナー仮想化の必要性を理解して、まず開発環境に導入してみよう!
Dockerは、コンテナー仮想化ツールです。本稿では、サーバーサイドのアーキテクチャの歴史からDockerが生まれた流れや背景を説明し、PCの開発環境で実際にインストールしてDockerの動作を体験します。
エンジニアの方であれば、「コンテナー」や「Docker」といったキーワードを耳にしたことがあるかと思います。自分が関わっているシステムの開発や運用に活用できるかどうか検討している方もいるでしょう。
この記事の前半では、コンテナーやDockerとはそもそもどういったものかを概観していきます。後半では、PC(WindowsやMac)を使ってローカルでDockerを試していきます。
- コンテナーとDockerを歴史から知る
- Dockerを試してみよう! 開発環境へのインストールと起動
- 公開されているコンテナーイメージの利用
- Dockerfileを使ったコンテナーのビルド
- おわりに
- 執筆者プロフィール
コンテナーと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サーバー向けのハイパーバイザーの代表例としては、次のものがあります。
- Microsoft Hyper-V
- VMware vSphere
- Linuxカーネルに組み込まれたKVM(Kernel-based Virtual Machine)
- オープンソースのXen
サーバー仮想化には、さまざまな利点があります。従来、別々の物理マシン上で動作していた複数のシステムを、同一の物理マシン上で動作する複数の仮想マシンとして統合、集約できるようになるのです。
仮想マシン上で動作するソフトウェアからは、自身が物理マシン上で動いているように見えるので、仮想サーバーへの移行は比較的容易です。新しい環境を準備する際も、既存のサーバー仮想化基盤に仮想マシンを作成するだけなので、ハードウェアの調達は不要です。
また、OSやソフトウェアがインストール・構成済みの「仮想マシンイメージ」を事前に準備しておくことで、まったく同じ構成の仮想マシンを何度でも作成できます。仮想マシンや、その下の物理マシンに障害が発生した場合は、正常な物理マシン上にその仮想マシンを移行して復旧できるため、システムの可用性も向上します。
Windows 8.1以降(Proエディション以上)では「Hyper-V」、macOSのOS X Yosemite(10.10)ではオープンソースのハイパーバイザー型の「xhyve」がサポートされています。
エンジニアの方がローカルでサーバー仮想化を行いたい場合は、これらのハイパーバイザーか、または後述のホスト型のサーバー仮想化実装を使うことになるでしょう。記事の後半では、WindowsやMacで、Hyper-V/xhyveを使ってDockerを試していきます。
サーバー仮想化には、前述の「ハイパーバイザー型」に加えて、ハイパーバイザーではない通常のOS(ホストOS)上で、仮想マシン(ゲストOS)が動作する「ホスト型」もあります。
- Windows、macOS、Linux上で動作するOracle VM VirtualBox
- macOS上で動作するParallels Desktop for Mac
パブリッククラウドの普及
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 StoreからDocker for Windowsをダウンロードします。記事執筆時点では、Windows向けのStable、Edge、Windows Server 2016向けのEdgeというビルドが提供されています。特に理由がなければ、Stableをダウンロードし、インストールしましょう。
{$image_7}Docker Community Edition for Windows - Docker Store{$image_8}
インストールが完了したら、スタートメニューから「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をダウンロードし、インストールしましょう。
{$image_9}Docker Community Edition for Mac - Docker Store{$image_10}
インストールが完了したら、アプリケーションフォルダーの「Docker.app」を実行します。初回実行時には「Welcome」ダイアログが表示されます。
初期化が完了したら、ステータスバーのクジラのDockerアイコンをクリックします。
{$image_11}
「Docker is running」というステータスやメニューが表示されます。
メニューの「Preferences...」をクリックすると、Preferencesダイアログが表示されます。このダイアログでは、macOS起動時のDockerの自動実行の有無、Dockerの自動アップデートの有無、共有ドライブ、プロキシなど、さまざまな設定を行えます。
「Advanced」では、Dockerに割り当てるCPU数やメモリ量を設定できます。Dockerの起動に失敗する場合は、メモリ量やCPU数を減らしてみましょう。
{$image_12}
問題が発生した場合は、ドキュメント、ナレッジベース、GitHubリポジトリのIssuesなどで調べてみてください。
Linuxマシンへのインストール
ローカルでLinuxの仮想マシンや物理マシンを使えたり、AzureやAWSといったパブリッククラウド上のLinuxの仮想マシンを使える場合は、そのLinuxマシンにDockerをインストールすることもできます。
詳細は、パブリッククラウドプロバイダーやLinuxディストリビューション向けのドキュメントを確認してください。
Docker CLIの実行
Dockerのインストールが完了していれば、ターミナル(Windowsのコマンドプロンプト、macOSやLinuxのターミナル)では、Docker CLI(dokcer
コマンド)が使えるようになっているはずです。この記事では、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{$image_13}
公開されているコンテナーイメージの利用
Docker Hubは、Dockerイメージの公開リポジトリです。人気の高いソフトウェアの多くが、Docker Hubでコンテナーイメージとして公開されています。ぜひ検索してみてください。ここでは、そのうちいくつかを実行してみます。
{$image_14}Docker Hub{$image_15}
Hello Worldコンテナーの実行
docker run hello-world
コマンドを実行してみましょう。
このコマンドによって、まず、hello-worldコンテナーイメージで、タグ名が(最新バージョンを意味する)latestのものが、ローカルにないことを確認し、Docker Hubからこのコンテナーイメージをプル(ダウンロード)します。
{$image_16}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
)を実行し、インタラクティブに操作できます。
{$image_17}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 images
、docker ps
コマンドなども適宜実行し、状況を確認してみましょう。
nginxコンテナーとポート公開
docker run -d -p 8080:80 --name webserver nginx
コマンドを実行します。Docker Hubからnginxコンテナーイメージがプルされ、実行されたnginxコンテナーを「webserver」と命名しています。
{$image_18}library/nginx - Docker hub{$image_19}
コンテナー内では、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.html
、Dockerfile
を作成します。
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におけるコンテナーのページを参照してください。
{$image_20}Microsoft Azure Containers | Microsoft Azure執筆者プロフィール
さとうなおき {$image_21}@satonaoki
編集:薄井千春(ZINE)