コンテナのクイックスタート

このクイックスタートは、Docker のインストール作業完了を想定しています。Docker がインストールされているか確認するには、次のコマンドを実行します。

# インストールしたものが正常に動作するか確認
$ docker info

もしも docker: command not found/var/lib/docker/repositories: permission denied のような表示が出る場合は、Docker のインストールが不完全か、マシン上の Docker に対してコマンドに対する権限がありません。標準の Docker インストールでは、docker コマンドを実行するには docker グループのユーザ、もしくは root の必要があります。

Docker はシステム設定の依存状態により、各 docker コマンドの前に sudo が必要になる場合があります。docker コマンドで sudo を使わないようにする方法の1つに、docker という Unix グループを作成し、ユーザを docker グループに追加し、docker コマンドを使えるようにします。

Docker のインストールや sudo 設定に関しては、 インストール を参照ください。

構築済みイメージのダウンロード

# ubuntu イメージのダウンロード
$ docker pull ubuntu

このコマンドは Docker Hub 上の ubuntu イメージを探し、Docker Hub からローカルのイメージ・キャッシュにダウンロードします。

注釈

イメージのダウンロードに成功すると、12文字のハッシュ 539c0211cd76: Download complete が表示されます。これはイメージ ID を短くしたものです。この短いイメージ ID(short image ID)は、完全イメージ ID (full iamge ID)の始めから12文字です。完全イメージ ID は docker inspectdocker images --no-trunc=true で確認できます。

対話型シェルの実行

次のようにして、Ubuntu イメージの対話型シェルを実行します:

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

-i フラグは対話型 (interactive) のコンテナを起動します。-t フラグは疑似ターミナル (pseudo-TTY) を起動し、stdinstdout (標準入出力)をアタッチ(接続)します。

シェルを終了せずに tty をデタッチ(取り外し)するには、エスケープ・シーケンス Ctrl-p + Ctrp-q を使います。コンテナから出たあとも、停止するまでコンテナは存在し続けます。

Docker を他のホスト・ポートや Unix ソケットに接続

警告

docker デーモンが標準で利用する TCP ポートと Unix docker ユーザ・グループの変更は、ホスト上の非 root ユーザが root アクセスを得られるという、セキュリティ・リスクを増やします。docker に対する管理を確実に行ってください。TCP ポートの利用時、ポートにアクセスできる誰もが Docker に対する完全なアクセスを可能です。そのため、オープンなネットワーク上での利用は望ましくありません。

-H オプションを使うと、Docker デーモンは指定した IP アドレスとポートをリッスンします(ポートを開きます)。標準では、unis:///var/run/docker.sock をリッスンし、ローカルの root ユーザのみ接続できます。これを 0.0.0.0:2375 や特定のホスト IP を指定することで、誰でもアクセス可能にできましたが、推奨されていません。理由は、デーモンが稼働しているホスト上の root アクセスを誰もが簡単に得られるためです。

同様に、Docker クライアントは -H を使い、任意のポートに接続可能です。Docker クライアントは、Linux 版では unix:///var/run/docker.sock に接続し、Windows 版では tcp://127.0.0.1:2376 に接続します。

-H は次の書式でホストとポートを割り当てます:

tcp://[host]:[port][path] or unix://path

例:

  • tcp://127.0.0.1 に TCP 接続時、TLS 暗号化が有効であればポート 2376 を、通信がプレーンテキストの場合はポート 2375 を使います。
  • tcp://host:2375 → 対象ホスト:2375 に TCP 接続します。
  • tcp://host:2375/path → 対象ホスト:2375 に TCP 接続し、あらかじめリクエストのパスを追加します。
  • unix://path/to/socketpath/to/socket にある Unix ソケットに接続します。

-H の後に何も指定しない場合は、標準では -H を指定していないのと同じです。

また、-H は TCP の指定を省略できます:

`host:` または `host:port` または `:port`

Docker をデーモン・モードで起動する:

$ sudo <path to>/docker daemon -H 0.0.0.0:5555 &

ubuntu イメージをダウンロードする:

$ docker -H :5555 pull ubuntu

複数の -H を使えます。例えば TCP と Unix ソケットの両方をリッスンしたい場合です。

# docker をデーモン・モードで実行
$ sudo <path to>/docker daemon -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock &
# 標準の Unix ソケットを使い、Ubuntu イメージをダウンロード
$ docker pull ubuntu
# あるいは、TCP ポートを使用
$ docker -H tcp://127.0.0.1:2375 pull ubuntu

長時間動作するワーカー・プロセスの開始

# とても便利な長時間動作プロセスの開始
$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")

# これまでのジョブの出力を収拾
$ docker logs $JOB

# ジョブの停止(kill)
$ docker kill $JOB

コンテナの一覧

$ docker ps # 実行中のコンテナのみリスト表示
$ docker ps -a # 全てのコンテナをリスト表示

コンテナの制御

# 新しいコンテナの起動
$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")

# コンテナの停止
$ docker stop $JOB

# コンテナの起動
$ docker start $JOB

# コンテナの再起動
$ docker restart $JOB

# コンテナを SIGKILL で停止
$ docker kill $JOB

# コンテナを削除
$ docker stop $JOB # Container must be stopped to remove it
$ docker rm $JOB

TCP ポートにサービスを割り当て

# コンテナにポート 4444 を割り当て、netcat でリッスンする
$ JOB=$(docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444)

# どの外部ポートがコンテナに NAT されているか?
$ PORT=$(docker port $JOB 4444 | awk -F: '{ print $2 }')

# 公開ポートに接続
$ echo hello world | nc 127.0.0.1 $PORT

# ネットワーク接続の動作を確認
$ echo "Daemon received: $(docker logs $JOB)"

コンテナの状態をコミット(保存)

コンテナの状態をイメージに保存すると、その状態を再利用可能です。

コンテナをコミット(commit)すると、Docker は元のイメージとコンテナ・イメージの現在の状態との diff (差分)のみを保管します。どのイメージを持っているかは、docker images コマンドを使います。

# コンテナを新しい名前のイメージとしてコミットする
$ docker commit <container> <some_name>

# イメージ一覧を表示する
$ docker images

イメージの状態を手に入れました。これは、新しいインスタンス(訳者注:コンテナのこと)を作成可能なものです。

次はどこに行きますか

  • Docker ユーザ・ガイド の中に進む
  • レポジトリを通したイメージの共有 について読む
  • コマンドラインの練習 を参照