コンテナ技術とは その2

コンテナ技術は、実行環境をホストOS上に論理的な区画を造り、他のプロセスから隔離し、その区画の中でアプリケーションを動作させる技術です。

コンテナ技術は一見すると仮想マシンと同じような技術と思われがちですが、コンテナは仮想マシンと比べてオーバーヘッドが少なく、軽量で高速に動作するのが特徴です。

仮想マシンとコンテナの比較

通常、ホストOS上で動作する様々なアプリケーションは、同じシステムリソースを共有します。データを格納するディレクトリも共有しますし、同じIPアドレスで通信します。そのため、複数のアプリケーションで試用しているミドルウェアやライブラリのバージョンが異なる場合は、それぞれのアプリケーションで影響を受けないようにする必要があります。

これに対してコンテナは、OSやディレクトリ、IPアドレスなどのシステムリソースを、個々のアプリケーションが占有しているかのように扱うことができます。コンテナの中からホストOSやほかのコンテナを見ることはできません。

コンテナと仮想マシンの違い

起動速度

仮想マシンでは、アプリケーションやライブラリの他にOSを動作させなくてはいけません。そのため、仮想マシンごとにCPUやメモリ、ストレージを消費してしまいます。起動時間も数分かかってしまいます。対してコンテナはアプリケーションやライブラリの実行に必要なリソースだけでよいので、起動時間も数秒レベルで起動します。オーバーヘッドが小さい分、同じハードウェアであれば仮想マシンよりも多くのコンテナを同時に起動させることができます。

可搬性

アプリケーションやミドルウェアの稼働が確認されているコンテナであれば、他のサーバに移して動かしても確実に動くことが保証されます。仮想マシンの場合、実行環境が変わるとその都度ハードウェアやOSの設定を確認し、場合によっては設定変更も必要になります。

リソース管理

コンテナはリソースの管理が楽というメリットもあります。仮想マシンは仮想的なハードウェアレベルで隔離されるため、仮想マシンで実行されるアプリケーションはホストOSから確認することはできません。コンテナの場合、ホストOSのプロセスのひとつとして動作するので、ホストOSのプロセスリストからコンテナのプロセスを確認することが可能です。

逆に仮想マシンは、仮想マシンからホストOSなどへのアクセス方法が限定されているため、コンテナよりもセキュリティが高いともいえます。コンテナの場合、ホストOSのリソースを共有するため、セキュリティ面に問題があるコンテナをデプロイした場合、ホストOSや他のコンテナに影響を与える可能性があります。

コンテナエンジン「Docker」とは

それでは実際にコンテナを触ってみましょう。コンテナを実行するためのソフトウェアをコンテナエンジンと呼びますが、その中で最も有名なコンテナエンジンがDockerです。Dockerがコンテナ市場を醸成してきたといっても過言では無く、コンテナを実行する仕組みはもちろん、コンテナイメージの作成やコンテナイメージの共有といった、現在のコンテナの仕組みを確立してきました。

DockerはDocker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。(Why Docker? | Docker

Dockerを使えば、簡単にコンテナを作ったり、イメージを作成して別のマシンで起動することができます。Dockerの機能には大きく次の3つの機能があります。

  • コンテナイメージの作成(Build)
  • コンテナイメージの共有(Ship)
  • コンテナの実行(Run)

コンテナイメージの作成(Build)

アプリケーションの実行に必要になるプログラム本体やライブラリ、ミドルウェア、OSやネットワークの設定などを1つにまとめてDockerイメージ(コンテナイメージ)を作ります。 Dockerイメージは、コマンドラインから作成したり、Dockerfileから作成することが可能です。

Dockerは、1つのイメージに1つのアプリケーションを入れて、複数のアプリケーションを連携させたい場合は、複数のコンテナを組み合わせてサービスを構築することを推奨しています。

Dockerイメージ

Dockerイメージとは、コンテナを起動するために必要なファイルが格納されたディレクトリになります。Dockerイメージはコンテナの元になるものであり、Dockerイメージからコンテナを起動すると理解しておきましょう。 DockerではこのDockerイメージを共有することで、様々なマシンで同じコンテナを動作させることができます。

コンテナイメージの共有(Ship)

Dockerレジストリ(Docker Hub)と呼ばれるDocker公式のレジストリ(データストア)などを利用し、イメージの管理を行うことができます。Docker Hubでは、イメージのアップロードやダウンロード、検索などが行えます。

よりセキュアな環境が必要であれば、プライベートなレジストリを使うこともできます。パブリッククラウドの多くは、コンテナーイメージを共有するプライベートなレジストリサービスを提供しています。

コンテナの実行(Run)

Dockerイメージをビルドし、コンテナとして実行することができます。コンテナは、開始/停止/削除が行えます。Dockerイメージさえあれば、Dockerがインストールされた環境であればどこでもコンテナを動かすことができます。Dockerイメージから複数のコンテナを起動することも可能です。

Dockerを触ってみる

Dockerのインストール

Dockerはさまざまなプラットフォームに対応しています。インストール手順については、公式ページに各OSとAWS、Azureのようなクラウドサービス向けのインストール方法が紹介されていますので、各自インストールを実施してください。

Explore - Docker Hub

正しくインストールされているかを確認します。

❯ 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の基本動作を試す

インストールが完了したら、Dockerの基本動作を試してみましょう。nginxのイメージを使って、次の流れでDockerの基本動作を試してみます。

  1. コンテナイメージの作成(Build)

    • nginxイメージの取得
    • nginxコンテナの作成
  2. コンテナの実行(Run)

    • nginxコンテナの実行
    • nginxコンテナの停止
    • nginxコンテナの削除

nginxイメージの取得

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

nginxコンテナの作成

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

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ページが表示されるか確認してみます。

nginxのWelcomeページ

nginxコンテナの停止

実行中のコンテナを停止します。コマンドは、 docker container stop です。

❯ docker container stop 2be5810fadd3
2be5810fadd3

コンテナが停止しているかをdocker container lsコマンドで確認してみます。

❯ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

nginxコンテナの削除

最後に作成した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の基本動作になります。次回からはより実践的な使い方を紹介していきます。

関連記事