コンテナ技術は、実行環境をホストOS上に論理的な区画を造り、他のプロセスから隔離し、その区画の中でアプリケーションを動作させる技術です。
コンテナ技術は一見すると仮想マシンと同じような技術と思われがちですが、コンテナは仮想マシンと比べてオーバーヘッドが少なく、軽量で高速に動作するのが特徴です。
通常、ホストOS上で動作する様々なアプリケーションは、同じシステムリソースを共有します。データを格納するディレクトリも共有しますし、同じIPアドレスで通信します。そのため、複数のアプリケーションで試用しているミドルウェアやライブラリのバージョンが異なる場合は、それぞれのアプリケーションで影響を受けないようにする必要があります。
これに対してコンテナは、OSやディレクトリ、IPアドレスなどのシステムリソースを、個々のアプリケーションが占有しているかのように扱うことができます。コンテナの中からホストOSやほかのコンテナを見ることはできません。
仮想マシンでは、アプリケーションやライブラリの他にOSを動作させなくてはいけません。そのため、仮想マシンごとにCPUやメモリ、ストレージを消費してしまいます。起動時間も数分かかってしまいます。対してコンテナはアプリケーションやライブラリの実行に必要なリソースだけでよいので、起動時間も数秒レベルで起動します。オーバーヘッドが小さい分、同じハードウェアであれば仮想マシンよりも多くのコンテナを同時に起動させることができます。
アプリケーションやミドルウェアの稼働が確認されているコンテナであれば、他のサーバに移して動かしても確実に動くことが保証されます。仮想マシンの場合、実行環境が変わるとその都度ハードウェアやOSの設定を確認し、場合によっては設定変更も必要になります。
コンテナはリソースの管理が楽というメリットもあります。仮想マシンは仮想的なハードウェアレベルで隔離されるため、仮想マシンで実行されるアプリケーションはホストOSから確認することはできません。コンテナの場合、ホストOSのプロセスのひとつとして動作するので、ホストOSのプロセスリストからコンテナのプロセスを確認することが可能です。
逆に仮想マシンは、仮想マシンからホストOSなどへのアクセス方法が限定されているため、コンテナよりもセキュリティが高いともいえます。コンテナの場合、ホストOSのリソースを共有するため、セキュリティ面に問題があるコンテナをデプロイした場合、ホストOSや他のコンテナに影響を与える可能性があります。
それでは実際にコンテナを触ってみましょう。コンテナを実行するためのソフトウェアをコンテナエンジンと呼びますが、その中で最も有名なコンテナエンジンがDockerです。Dockerがコンテナ市場を醸成してきたといっても過言では無く、コンテナを実行する仕組みはもちろん、コンテナイメージの作成やコンテナイメージの共有といった、現在のコンテナの仕組みを確立してきました。
DockerはDocker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。(Why Docker? | Docker)
Dockerを使えば、簡単にコンテナを作ったり、イメージを作成して別のマシンで起動することができます。Dockerの機能には大きく次の3つの機能があります。
アプリケーションの実行に必要になるプログラム本体やライブラリ、ミドルウェア、OSやネットワークの設定などを1つにまとめてDockerイメージ(コンテナイメージ)を作ります。 Dockerイメージは、コマンドラインから作成したり、Dockerfileから作成することが可能です。
Dockerは、1つのイメージに1つのアプリケーションを入れて、複数のアプリケーションを連携させたい場合は、複数のコンテナを組み合わせてサービスを構築することを推奨しています。
Dockerイメージとは、コンテナを起動するために必要なファイルが格納されたディレクトリになります。Dockerイメージはコンテナの元になるものであり、Dockerイメージからコンテナを起動すると理解しておきましょう。 DockerではこのDockerイメージを共有することで、様々なマシンで同じコンテナを動作させることができます。
Dockerレジストリ(Docker Hub)と呼ばれるDocker公式のレジストリ(データストア)などを利用し、イメージの管理を行うことができます。Docker Hubでは、イメージのアップロードやダウンロード、検索などが行えます。
よりセキュアな環境が必要であれば、プライベートなレジストリを使うこともできます。パブリッククラウドの多くは、コンテナーイメージを共有するプライベートなレジストリサービスを提供しています。
Dockerイメージをビルドし、コンテナとして実行することができます。コンテナは、開始/停止/削除が行えます。Dockerイメージさえあれば、Dockerがインストールされた環境であればどこでもコンテナを動かすことができます。Dockerイメージから複数のコンテナを起動することも可能です。
Dockerはさまざまなプラットフォームに対応しています。インストール手順については、公式ページに各OSとAWS、Azureのようなクラウドサービス向けのインストール方法が紹介されていますので、各自インストールを実施してください。
正しくインストールされているかを確認します。
❯ docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:22:34 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:29:19 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.10
GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
runc:
Version: 1.0.0-rc8+dev
GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
docker-init:
Version: 0.18.0
GitCommit: fec3683
インストールが完了したら、Dockerの基本動作を試してみましょう。nginxのイメージを使って、次の流れでDockerの基本動作を試してみます。
コンテナイメージの作成(Build)
コンテナの実行(Run)
nginxのDockerイメージを取得します。イメージを取得するには、 docker image pull コマンドを使います。
❯ docker image pull nginx:latest
latest: Pulling from library/nginx
8ec398bc0356: Pull complete
465560073b6f: Pull complete
f473f9fd0a8c: Pull complete
Digest: sha256:b2d89d0a210398b4d1120b3e3a7672c16a4ba09c2c4a0395f18b9f7999b768f2
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
正常にイメージ取得できたか確認するには、 docker image ls コマンドを使います。
❯ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f7bb5701a33c 9 days ago 126MB
Dockerイメージを取得できたら、そのイメージを使ってコンテナを作成します。コンテナを作成するには、 docker container create コマンドを使います。
コンテナの名前をtest-nginx(--nameオプションで指定)、コンテナ内のnginxには80番ポートでアクセス出来るよう指定(-pオプションで指定)して、Dockerコンテナを作成します。
❯ docker container create --name test-nginx -p 80:80 f7bb5701a33c
2be5810fadd3ade22b92ce05eb437ac1754cf7df145cbbdc65c5705322cbae0b
正常にコンテナを作成が完了したかを確認するには、 docker container ls コマンドを使います。オプションなしで実行すると実行中のコンテナしか表示されないため、全てのコンテナを表示するオプション(-aオプション)をオプションを利用します。
❯ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2be5810fadd3 f7bb5701a33c "nginx -g 'daemon of…" 2 minutes ago Created test-nginx
docker container create コマンドで作成した場合は、コンテナが停止状態となっていますので、 docker container start コマンドでコンテナを実行します。
❯ docker container start 2be5810fadd3
2be5810fadd3
正常にコンテナが起動されたか、 docker container ls コマンドで確認します。
❯ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2be5810fadd3 f7bb5701a33c "nginx -g 'daemon of…" 4 minutes ago Up 34 seconds 0.0.0.0:80->80/tcp test-nginx
STATUSがUPとなっていれば正常に起動しています。
「http://localhost」にアクセスして、nginxのWelcomeページが表示されるか確認してみます。
実行中のコンテナを停止します。コマンドは、 docker container stop です。
❯ docker container stop 2be5810fadd3
2be5810fadd3
コンテナが停止しているかをdocker container lsコマンドで確認してみます。
❯ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
最後に作成したnginxコンテナを削除します。docker container rmコマンドで削除します。
❯ docker container rm 2be5810fadd3
2be5810fadd3
コンテナが削除されているかを、docker container lsコマンドで確認してみます。
❯ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
以上がDockerの基本動作になります。次回からはより実践的な使い方を紹介していきます。