とりあえず使ってみよう

インストールをする前に Docker を使ってみたい場合は、Docker のサイトにある「Try It!!」のページから Docker を試すことができます。 本ページではこの簡単な Hands-On を日本語で解説しながら進めていきます。 本家のページが更新されると食い違いが発生するかもしれませんがご容赦願います。

上の画像にある「Try It !!」をクリックすると、下の画像のようなページに飛ばされると思います。 右側が Docker のコンソール画面です。ブラウザから Docker を試すことができるんですね。すごい。

とりあえず、下のボタンの Start をクリックして開始してしまいましょう。

Hands-On のページに来ました。ページ上部にある番号が課題番号で、お題に沿って回答をしていくことで先へ先へと進んでいきます。 ページ左側にその課題のテーマや、その回答が記載されています。以後は画像ではなくテキストベースで解説をしていきます。

Step 0. Docker Engine について

Docker を構成するおおまかな要素は2つあります。それは「サーバープロセス」と「クライアントプロセス」です。 サーバープロセスが Docker 全体を管理して、クライアントが具体的なアクションを行います。最近だとよくあるパターンですね。

課題: Versionを確認しよう

どのバージョンの Docker が入っているか確認することで、そもそも Docker が動いているか確認ができます。 また当然ながらバージョンにより挙動が異なるので、バージョンが確認できることは重要です。

Hint

"docker" と打つことで、指定できる「コマンド」を確認できます。 Docker は基本的に "docker コマンド名"と入力することで各機能を利用できます。

Welcome to the interactive Docker tutorial
you@tutorial:~$ docker
Usage: Docker [OPTIONS] COMMAND [arg...]
-H="127.0.0.1:4243": Host:port to bind/connect to
 
A self-sufficient runtime for linux containers.
 
Commands:
 
attach    Attach to a running container
build     Build a container from a Dockerfile
commit    Create a new image from a container's changes
diff      Inspect changes on a container's filesystem
export    Stream the contents of a container as a tar archive
history   Show the history of an image
images    List images
import    Create a new filesystem image from the contents of a tarball
info      Display system-wide information
insert    Insert a file in an image
inspect   Return low-level information on a container
kill      Kill a running container
login     Register or Login to the Docker registry server
logs      Fetch the logs of a container
port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps        List containers
pull      Pull an image or a repository from the Docker registry server
push      Push an image or a repository to the Docker registry server
restart   Restart a running container
rm        Remove a container
rmi       Remove an image
run       Run a command in a new container
search    Search for an image in the Docker index
start     Start a stopped container
stop      Stop a running container
tag       Tag an image into a repository
version   Show the Docker version information
wait      Block until a container stops, then print its exit code

回答

docker version

you@tutorial:~$ docker version
Docker Emulator version 0.1.3
 
Emulating:
Client version: 0.5.3
Server version: 0.5.3
Go version: go1.1

Step 1. Docker イメージを探そう

Docker を始める一番簡単なとっかかりは誰か別の人が作った「コンテナイメージ」を利用することです。 コンテナイメージを Docker が動かすことで初めてコンテナを利用可能になります。ちょうど VMWare などの VMX ファイルやテンプレートのようなものだと思ってもらえればいいと思います。

コンテナイメージは Docker Hub と呼ばれているクラウド上のレポジトリに登録されています。 Docker コマンドを使うことで、そこからイメージを検索することができます。なお、オンラインで検索するためインターネット接続が必要です。

課題: イメージを検索しよう

「tutorial」というイメージを探して下さい。

Hint

"docker search <string>" というシンタックスです。

回答

docker search tutorial

you@tutorial:~$ docker search tutorial
Found 1 results matching your query ("tutorial")
NAME                      DESCRIPTION
learn/tutorial            An image for the interactive tutorial

Step 2. Docker イメージをダウンロードしよう

コンテナイメージを使うためには、それを利用環境にダウンロードしておくことが必要です。 先ほど見つけたイメージをダウンロードしてみましょう。

イメージのダウンロードは "docker pull" コマンドを使います。イメージ名の指定の書式は「<username>/<repository>」となります。

課題: イメージをダウンロードしよう

先ほど見つけた「tutorial」というイメージをダウンロードして下さい。

Hint

イメージの書式に注意しよう

回答

docker pull <image_name>

you@tutorial:~$ docker pull learn/tutorial
Pulling repository learn/tutorial from https://index.docker.io/v1
Pulling image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (prec
ise) from ubuntu
Pulling image b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc (12.1
0) from ubuntu
Pulling image 27cf784147099545 () from tutorial

Step 3. Docker で Hello World

Docker のコンテナは Virtual Macnihe と異なり、ホストのプロセスとして動作します。 ただ、通常のプロセスと異なるのは、Dockerのコンテナのプロセスは「閉じられた環境」で動作するということです。

その閉じられた環境はプロセスが必要とするファイルシステムやライブラリ、シェルといったものが用意されています。 ただ、それらはデフォルトでは動作していないので明示的に「start」させる必要があります。

課題: ダウンロードしたイメージを起動しよう

ダウンロードしたイメージを起動させて、「Hello World」と出力させて下さい。 これを行うためにはコンテナ内で「echo」コマンドを使う必要があります。

Hint

「docker run」コマンドでコンテナを起動できます。引数としてコンテナとなるイメージ名と、そのコンテナで実行するコマンドを指定します。

回答

docker run <image_name> <command>

you@tutorial:~$ docker run learn/tutorial echo "hello world"
hello world 

「echo "hello world"」がコンテナに実行させているコマンドです。

Step 4. Docker コンテナでのインストール作業

Docker のコンテナはデフォルトでは ping といったユーティリティ系のコマンドすらインストールされていません。 そのため、先ほどの「echo "hello world"」と同じ要領でコンテナにツール等をインストールする必要があります。

ここでは ping をコンテナにインストールしてみましょう。 私達が現在動かしているコンテナは ubuntu ベースなので、インストールには「apt-get install -y ping」とします。 なお、コンテナはインストール完了後にすぐに止まりますが、変更は残ります。

課題: ダウンロードしたイメージを起動しよう

ダウンロードしたイメージを起動させて、ping コマンドをインストールして下さい。

Hint

-y オプションはインストール時に YES/NO が確認されるのを防ぐために利用しています。

回答

you@tutorial:~$ docker run learn/tutorial apt-get install -y ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1 ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 1s (50.3 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...

Step 5. 変更を加えた Docker コンテナを保存しよう

Step4 で Docker のコンテナに対して変更を加えました。この変更を保存しないと、次回にイメージから起動した際に変更が反映されていません。

変更されたコンテナイメージを保存してみましょう。なお、この保存のことを Docker では「commit(コミット)」と呼んでいます。 コミットをすると、古いイメージに変更の差分がどんどん追加されていきます。

課題: 変更を加えたコンテナを見つけて、それをコミットしてみよう

ping がインストールされたコンテナはオリジナルの learn/tutorial ではなく、別に新しく作成されています。 まずはそれを探すことから始まります。 これには「docker ps -l」を利用します。

コンテナを見つけたら、それを保存しましょう。

Hint

「docker commit」と入力すると、指定可能な引数が表示されます。 コミットする際に「ID」を指定する必要があるのですが、必ずしも全ていれる必要はありません。他のコンテナと一意に区別できる箇所までで問題ありません。

回答

プロセス ID を特定

you@tutorial:~$ docker ps -l
ID                  IMAGE               COMMAND                CREATED             STATUS              PORTS
6982a9948422        ubuntu:12.04        apt-get install ping   1 minute ago        Exit 0

プロセス ID を指定して commit

you@tutorial:~$ docker commit 6982 learn/ping
effb66b31edb

Step 6. 保存された新しいイメージを起動してみよう

Step5 で ping コマンドをインストールした新しい Docker コンテナを作成しました。 この新しいイメージは Docker がインストールされたホストであれば、どこでも動かすことができます。

新しく作成したコンテナを起動し、google に ping させてみよう

特に新しいことはありません。前回と同じようにコンテナを起動させて、ping コマンドを使います。

Hint

Step5 では「learn/ping」という名前でコンテナを commit しました。

回答

you@tutorial:~$ docker run learn/ping ping www.google.com
PING www.google.com (74.125.239.129) 56(84) bytes of data.
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=1 ttl=55 time=2.23 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=2 ttl=55 time=2.30 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=3 ttl=55 time=2.27 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=4 ttl=55 time=2.30 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=5 ttl=55 time=2.25 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=6 ttl=55 time=2.29 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=7 ttl=55 time=2.23 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=8 ttl=55 time=2.30 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=9 ttl=55 time=2.35 ms
-> This would normally just keep going. However, this emulator does not support Ctrl-C, so we quit here.

Step 7. コンテナの情報を取得してみよう

新しく作成したイメージ learn/ping でコンテナが起動しています。 「docker ps」コマンドで起動中のコンテナ一覧を得られます。 また、「docker inspect」コマンドで指定されたコンテナの情報を取得可能です。

課題: 起動中のコンテナの情報を取得してみよう。

「docker ps」でコンテナID を取得し、「docker inspect」でコンテナの情報を取得できます。

Hint

コンテナIDは全てを指定する必要はありません。区別できるところまでで大丈夫です。

回答

you@tutorial:~$ docker ps
ID                  IMAGE               COMMAND               CREATED             STATUS              PORTS
efefdc74a1d5        learn/ping:latest   ping www.google.com   37 seconds ago      Up 36 seconds
you@tutorial:~$ docker inspect efef
[2013/07/30 01:52:26 GET /v1.3/containers/efef/json
{
  "ID": "efefdc74a1d5900d7d7a74740e5261c09f5f42b6dae58ded6a1fde1cde7f4ac5",
  "Created": "2013-07-30T00:54:12.417119736Z",
  "Path": "ping",
  "Args": [
      "www.google.com"
  ],
  "Config": {
      "Hostname": "efefdc74a1d5",
      "User": "",
      "Memory": 0,
      "MemorySwap": 0,
      "CpuShares": 0,
      "AttachStdin": false,
      "AttachStdout": true,
      "AttachStderr": true,
      "PortSpecs": null,
      "Tty": false,
      "OpenStdin": false,
      "StdinOnce": false,
      "Env": null,
      "Cmd": [
          "ping",
          "www.google.com"
      ],
      "Dns": null,
      "Image": "learn/ping",
      "Volumes": null,
      "VolumesFrom": "",
      "Entrypoint": null
  },
  "State": {
      "Running": true,
      "Pid": 22249,
      "ExitCode": 0,
      "StartedAt": "2013-07-30T00:54:12.424817715Z",
      "Ghost": false
  },
  "Image": "a1dbb48ce764c6651f5af98b46ed052a5f751233d731b645a6c57f91a4cb7158",
  "NetworkSettings": {
      "IPAddress": "172.16.42.6",
      "IPPrefixLen": 24,
      "Gateway": "172.16.42.1",
      "Bridge": "docker0",
      "PortMapping": {
          "Tcp": {},
          "Udp": {}
      }
  },
  "SysInitPath": "/usr/bin/docker",
  "ResolvConfPath": "/etc/resolv.conf",
  "Volumes": {},
  "VolumesRW": {}

Step 8. 作成したイメージを Docker Hub に Push しよう

新しく作成したイメージ learn/ping が問題無く動作することが確認できました。 このイメージを他の Docker ユーザと共有してみましょう。

最初に learn/tutorial イメージを Pull(download) したことを思い出して下さい。 新しく作成したイメージを Push することで、そのイメージを他の Docker ホストでも簡単に利用することが可能となります。 また、他のユーザと作成したコンテナをシェアすることもできます。

課題: learn/ping イメージを Docker Hub に Push しよう

「docker images」コマンドでホストにあるイメージ一覧を得られます。「docker push」コマンドでイメージを Push できます。

Hint

今回はユーザ「learn」としてログインしているので、「learn/XXX」という名前でしか Push できません。

回答

you@tutorial:~$ docker images
ubuntu                latest              8dbd9e392a96        4 months ago        131.5 MB (virtual 131.5 MB)
learn/tutorial        latest              8dbd9e392a96        2 months ago        131.5 MB (virtual 131.5 MB)
learn/ping            latest              effb66b31edb        10 minutes ago      11.57 MB (virtual 143.1 MB)
you@tutorial:~$ docker push learn/ping
The push refers to a repository [learn/ping] (len: 1)
Processing checksums
Sending image list
Pushing repository learn/ping (1 tags)
Pushing 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c
Image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c already pushed, skipping
Pushing tags for rev [8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c] on {https://registry-1.docker.
io/v1/repositories/learn/ping/tags/latest}
Pushing a1dbb48ce764c6651f5af98b46ed052a5f751233d731b645a6c57f91a4cb7158
Pushing  11.5 MB/11.5 MB (100%)
Pushing tags for rev [a1dbb48ce764c6651f5af98b46ed052a5f751233d731b645a6c57f91a4cb7158] on {https://registry-1.docker.
io/v1/repositories/learn/ping/tags/latest}

Done !!

              _ _       _                    _
__      _____| | |   __| | ___  _ __   ___  | |
\ \ /\ / / _ \ | |  / _` |/ _ \| '_ \ / _ \ | |
 \ V  V /  __/ | | | (_| | (_) | | | |  __/ |_|
  \_/\_/ \___|_|_|  \__,_|\___/|_| |_|\___| (_)
                                              
 
 
 
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 
              |          |
           __ |  __   __ | _  __   _
          /  \| /  \ /   |/  / _\ |
          \__/| \__/ \__ |\_ \__  |