よしかわーるど

プログラミングで世界を変える

2018-06-30

Dockerについて学ぶ 1日目

What is Container

コンテナとは

コンテナは、アプリケーションを依存対象とともにカプセル化したもの。 コンテナは VM と同じように、コンテナは隔離された OS の環境を持ち、その中でアプリケーションを動作させることができる。 コンテナには、これまでの VM では実現が難しい、あるいは不可能なことを可能にしてくれる利点がある。

  • コンテナは、ホスト OS をリソースを共有するので、遥かに効率的です。コンテナの起動や停止は一瞬で行えます。コンテナ内で動作するアプリケーションのオーバーヘッドは、ホスト OS で直接動作するアプリケーションと比較しても、ごくわずかか、ほとんどありません。
  • コンテナのポータビリティは、動作環境の僅かな違いによって生ずるようなタイプのバグを、すべて撲滅できる可能性があります。
  • コンテナは軽量なので、開発者は数十のコンテナを同時に実行することが可能であり、実働環境そのままmの分散システムをエミュレーションできます。運用エンジニアは、VM だけを使う場合に比べて、1 台のホストマシンではるかに多くのコンテナを実行できます。
  • エンドユーザや開発者によって、クラウドへのデブロイをしない場合でも、コンテナには利点があります。ユーザは、設定とインストールの問題に数時間を費やしたり、システムへの変更について気をもんだりすることなく、複雑なアプリケーションをダウンロードして実行できます。一方で、そういったアプリケーションの開発者は、ユーザーの環境や利用可能な依存対象の差異を心配せずに済むようになります。

コンテナと VM

コンテナと VM は、一見似ているように見えますが、図で説明するのが一番わかり易いでしょう。

VM は下位層の OS やハードウェアへのアクセスを制御し、必要に応じてシステムコールを解釈してくれるハイパーバイザが必要になります。それぞれの VM には、OS、実行するアプリケーション、必要な支援ライブラリの完全なコピーが必要になります。

VM の場合とは異なり、ホストのカーネルは実行されるコンテナと共有されます、これはすなわち、コンテナは常にホストと同じカーネルを実行しなければならない。コンテナのエンジンは、ハイパーバイザ上の VM と同じようなやり方でのコンテナの起動や終了を受け持ちます。コンテナ内で動作しているプロセスは、ホスト上で直接動作しているプロセスと同等であり、ハイパーバイザの実行に伴うオーバーヘッドがありません。

VM とコンテナは、どちらでもアプリケーションを同一ホスト上の他のアプリケーションから隔離するために利用できます。VM はハイパーバイザのおかげで隔離の度合いが高く、信頼性の他界、実践で鍛え上げられた技術です。それに比較して、コンテナはまだ新しく、多くの組織はコンテナに動作実績が積まれるまでは、コンテナの分離機能を完全に使用するのをためらっています。そのため、両方の技術の利点を活かすために、VM 内でコンテナを実行するハイブリッドなシステムが広く見られます。

Docker に触れる

コンテナを起動して、Docker の動作しの感覚を掴みます Docker コンテナの基本的なビルディングブロックである Dockerfile と、コンテナの配布をサポートする Docker レジストリに話を進めます。

コンテナの生成/起動

$ docker run debian echo "Hello docker world"

出力内容

docker run debian echo "Hello docker world"
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
0bd44ff9c2cf: Pull complete
Digest: sha256:6ee341d1cf3da8e6ea059f8bc3af9940613c4287205cd71d7c6f9e1718fdcb9b
Status: Downloaded newer image for debian:latest
Hello docker world

上記のdocker runで、これはコンテナの起動を受け持つコマンドです。引数の debian は使いたいイメージの名前で、ここでは Debian Linux のディストリビューションをしています。

出力の最初の行は、この Debian のイメージのローカルコピーがないことを表しています。

latest: Pulling from library/debianは Docker Hub をオンラインでチェックし、最新バージョンの Debian のイメージをダウンロードします。ダウンロードが完了したら、Docker はそのイメージを実行中のコンテナに変え、その中で、指定されたコマンドであるecho "Hello docker world"を実行します。このコマンドの実行結果は、出力の最後の行に表示されています。

同じコマンドをもう一度実行すると、今度はダウンロードなしでコンテナがすぐに起動し、コマンドが実行されます。

注目してほしいことは、コンテナが立ち上がるまでの裏側の処理です。Docker は、コンテナをプロビジョニング指摘同士、指定された echo コマンドを実行し、そしてコンテナをシャットダウンするのにたった 1 秒程度で行っているのです。

VirtualBox などの VM では考えられない程の早さです。

$ docker run -i -t debian /bin/bash

root@3d66753d8719:/# echo "Hello Docker!"
Hello Docker!
root@3d66753d8719:/# exit
exit

これで、コンテナ内の新しいコマンドプロンプトが表示されます。これはリモートマシンへ SSH で接続するのと非常に似ています。

docker container run コマンドの構文 docker container run [オプション] イメージ名[:タグ名] [引数]

指定できる主なオプション

オプション 説明
–attach, -a 標準入力(STDIN)/標準出力(STDOUT)/標準エラー出力(STDERR)
–cidfile コンテナ ID をファイルに出力する
–detach, -d コンテナを生成し、バックグラウンドで実行する
–interactive, -i コンテナの標準入力を開く
–tty, -t 端末デバイスを使う

コンテナの生成/起動

停止中のコンテナを起動するときに使います。コンテナに割り当てられたコンテナ識別子を指定して、コンテナを起動します。

コンテナ停止

起動しているコンテナを停止するときに使います。コンテナに割り当てられたコンテナ識別子を指定して、コンテナを起動します。コンテナを削除するときは、docker container stop コマンドで起動中のコンテナを停止しておく必要があります。コンテナを再起動したいときは、docker container restart コマンドを使います。

コンテナ削除

コンテナを削除するときに使います。docker container rm コマンドを使うと、停止しているコンテナプロセスを削除できます。

コンテナの状態を確認

docker container ps コマンド

コンテナを一時停止させる

docker container pause コマンド