コンテナで Hello world

Docker とは一体何なのでしょうか?

Docker はコンテナ内に作成した世界で、アプリケーションを実行可能にします。コンテナ内でアプリケーションを実行するには、docker run コマンドを実行するだけです。

注釈

Docker システムの設定によっては、ガイドにおける各ページの docker コマンドで sudo が必要になる場合があります。この挙動を回避するには、システム管理者に対して docker という名称の Unix グループを作成し、そこにユーザを追加するようご依頼ください。

Hello world の実行

まず hello world コンテナを実行しましょう。

$ docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

初めてコンテナを実行しました!

この例では以下の作業を行いました。

  • docker run でコンテナを実行します(runは「実行」の意味)。
  • ubuntu は実行するイメージです。この例では Ubuntu オペレーティング・システムのイメージです。イメージを指定したら、Docker はまずホスト上にイメージがあるかどうか確認します。イメージがローカルに存在していなければ、パブリック・イメージ・レジストリである Docker Hub からイメージを取得(pull)します。
  • /bin/echo は新しいコンテナ内で実行するコマンドです。

コンテナを起動するとは、Docker が新しい Ubuntu 環境を作成し、その中で /bin/echo コマンドを実行し、その結果を出力します。

Hello world

それでは、表示後のコンテナはどのような状況でしょうか。Docker コンテナが実行されていたのは、指定したコマンドを処理していた間のみです。この例では、コマンドを実行したのち、直ちにコンテナが停止しました。

インタラクティブなコンテナを実行

新しいコマンドを指定して、別のコンテナを起動しましょう。

$ docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

この例は、次の処理を行います。

  • docker run コマンドでコンテナを実行します。
  • ubuntu イメージを使って起動します。
  • -t フラグは新しいコンテナ内に疑似ターミナル (pseudo-tty) を割り当てます。
  • -i フラグはコンテナの標準入力 (STDIN)を取得し、双方向に接続できるようにします(訳者注:正確には標準エラー STDOUT も含めた標準入出力を扱います)。
  • /bin/bash はコンテナ内で Bash シェルを起動します。

コンテナを起動したら、次のようなコマンド・プロンプトが表示されます。

root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

この例は:

  • pwd を実行し、現在のディレクトリが表示されます。ここでは / ルート・ディレクトリにいることが分かります。
  • ls はルートディレクトリ以下のディレクトリ一覧を表示します。典型的な Linux ファイル・システムのように見えます。

これで、コンテナ内で遊べます。終わったら exit コマンドまたは Ctrl-D を入力して終了できます。

root@af8bae53bdd3:/# exit

注釈

先ほど作成したコンテナと同様に、Bash シェルのプロセスが終了すると、コンテナは停止します。

Docker 化した Hello world の起動

デーモンとして実行するコンテナを作成しましょう。

$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

この例では:

  • docker run はコンテナを実行します。
  • -d フラグはバックグラウンドで(デーモン化して)コンテナを実行します。
  • ubuntu は実行しようとしているイメージです。

最後に、実行するコマンドを指定します:

/bin/sh -c "while true; do echo hello world; sleep 1; done"

出力は先ほどのように hello world を表示せず、文字列を表示します。

1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

注釈

コンテナ ID は長くて扱いにくいものです。あとで短い ID を扱います。こちらを使えば、コンテナをより簡単に操作できます。

このコンテナ ID を使い、hello world デーモンで何が起こっているのかを調べます。

はじめに、コンテナが実行中であることを確認しましょう。 docker ps コマンドを実行します。docker ps コマンドは、Docker デーモンに対し、デーモンが知っている全てのコンテナ情報を問い合わせます。

$ docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
1e5535038e28  ubuntu:14.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

この例はデーモン化したコンテナを見ています。 docker ps は便利な情報を返します。

  • 1e5535038e28 はコンテナ ID の短いバージョンです。
  • ubuntu は使用したイメージです。
  • コマンド、状態、コンテナに自動で割り当てられた名前は insane_babbage です。

注釈

Docker はコンテナ開始する時、自動的に名前を作成します。自分自身で名前を指定する方法は、後ほど紹介します。

これでコンテナが実行中だと分かりました。しかし、実行時に指定した処理が正しく行われているでしょうか。コンテナの中でどのような処理が行われているか確認するには、docker logs を使います。

コンテナ名 insane_babbage を指定しましょう。

$ docker logs insane_babbage
hello world
hello world
hello world
. . .

この例では:

  • docker logs でコンテナ内をのぞき込んだら、 hello world を返します。

すばらしいです! デーモンとして動いています。初めて Docker 化(Dockerized)したアプリケーションを作成しました!

次は docker stop コマンドでデタッチド・コンテナ(バックグラウンドで動作しているコンテナ)を停止します。

$ docker stop insane_babbage
insane_babbage

docker stop コマンドは、Docker に対して丁寧にコンテナを停止するよう命令します。処理が成功したら、停止したコンテナ名を表示します。

docker ps コマンドを実行して、動作確認しましょう。

$ docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES

素晴らしいですね。コンテナが停止しました。

次のステップ

ここまでは docker run コマンドを使い、初めてのコンテナを起動しました。フォアグラウンドで動作する、双方向に操作可能なコンテナを実行しました。また、バックグラウンドで動作するデタッチド・コンテナも実行しました。この過程で、複数の Docker コマンドを学びました。

  • docker ps - コンテナの一覧を表示。
  • docker logs - コンテナの標準出力を表示。
  • docker stop - 実行中のコンテナを停止。

以上で、Docker の基本と高度な処理を学びました。次は シンプルなアプリケーションの実行 に移動し、Docker クライアントを使って実際のウェブアプリケーションを構築しましょう。