コンテナで 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 クライアントを使って実際のウェブアプリケーションを構築しましょう。
参考
- Hello world in a container
- https://docs.docker.com/engine/userguide/containers/dockerizing/