Docker 入門ハンズオン資料

# Docker 入門ハンズオン資料

JAWS-UG CLI専門支部 #23 - ECS 入門用の資料です。
https://jawsug-cli.doorkeeper.jp/events/24371


このハンズオンの前に説明として使ったスライドも公開しました。

* Docker入門 - 基礎編　いまから始めるDocker管理
 * http://www.slideshare.net/zembutsu/introduction-to-docker-management-and-operations-basic


## 目的

Docker の「速さ」と「効率性」を体験するために、コンテナやイメージの作成と実行、Dockerfile を使った環境の管理、簡単なウェブサーバの起動を試します。

## 前提知識

* Linux のコマンドラインを操作できる
* Docker についての知識は不要

## ハンズオン手順

### A-1. コンテナ・イメージの確認と取得

`docker images` コマンドを実行し、ローカル上の Docker イメージを確認します。今回は ECS を使って環境を構築したので、初期段階からイメージが１つだけ置かれています。

```
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
amazon/amazon-ecs-agent   latest              68c50c0e92df        2 weeks ago         8.26 MB
```

もし、ECS を使わずに、はじめて実行する環境では、次のように何も表示されません。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
```

次に `docker pull` コマンドで、CentOS のイメージを取得してみます。デフォルトでは、公開レポジトリ（DockerHub）からダウンロードします。

```
$ docker pull centos
latest: Pulling from centos
f1b10cd84249: Pull complete
c852f6d61e65: Pull complete
7322fbe74aa5: Already exists
centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:a4627c43bafc86705af2e8a5ea1f0ed34fbf27b6e7a392e5ee45dbd4736627cc
Status: Downloaded newer image for centos:latest
```

再び `docker images` を実行すると、ローカル上に CentOS （centos:latest = CentOS 7 ）のイメージがダウンロードされたことが確認できます。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              7322fbe74aa5        2 weeks ago         172.2
amazon/amazon-ecs-agent   latest              68c50c0e92df        2 weeks ago         8.26 MB
```

イメージを取得するとき「イメージ名:タグ」の形式を指定すると、同じイメージで名でも異なったバージョンのものを入手できます。例えば CentOS 6 のイメージを入力するには、次のようにします。

```
$ docker pull centos:6
```

この状態で「docker images」を実行すると、２つのイメージがダウンロードされていることが確認できます。レポジトリ名は「centos」で共通ですが、タグや ID が異なっていることが分かります。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              6                   a005304e4e74        2 weeks ago         203.1 MB
centos              latest              7322fbe74aa5        2 weeks ago         172.2 MB
amazon/amazon-ecs-agent   latest              68c50c0e92df        2 weeks ago         8.26 MB
```

このコンテナ・イメージが誰によって作られたかを確認するには `docker history <イメージID>` を実行します。次の例では、イメージは CentOS Project によって作成されたものをベースに、変更が加えられていることが分かります。

```
$ docker history a005304e4e74
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
a005304e4e74        2 weeks ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B
fb9cc58bde0c        2 weeks ago         /bin/sh -c #(nop) ADD file:36d5dedfe60e45e7be   203.1 MB
f1b10cd84249        10 weeks ago        /bin/sh -c #(nop) MAINTAINER The CentOS Proje   0 B
```

### A-2. コンテナの起動と停止

最もシンプルな、「Hello World」と画面に表示するだけのコンテナを実行してみましょう。コンテナの起動は `docker run <オプション> <イメージ名:タグ> <コマンド> <引数>` の形式です。

```
$ docker run centos echo "Hello World"
Hello World
```

これは`centos`イメージ上で、コマンド `echo "hello wolrd"` を実行するという命令です。画面上に文字列を表示し、コンテナは終了します。

コンテナ内のプロセス状況を見てみましょう。次のように PID が１でコマンドが実行されていることが分かります。

```
$ docker run centos ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Rs     0:00 ps ax
```

操作環境上でどのようなコンテナが稼働しているか確認するには、`docker ps` コマンドを使います。

```
$ docker ps
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                        NAMES
d6a33b8c0147        amazon/amazon-ecs-agent:latest   "/agent"            38 minutes ago      Up 38 minutes       127.0.0.1:51678->51678/tcp   ecs-agent
```

何も引数を指定しないと「稼働中」のコンテナしか表示しません。今表示されているのは、ECS 用のエージェントであり、システムで自動起動しているものです。

終了したコンテナも含めて表示するには `docker ps -a` を実行します。

```
$ docker ps -a
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                        NAMES
d6a33b8c0147        amazon/amazon-ecs-agent:latest   "/agent"            38 minutes ago      Up 38 minutes       127.0.0.1:51678->51678/tcp   ecs-agent
c89b318326c9        centos              "ps ax"                4 minutes ago       Exited (0) 4 minutes ago                       kickass_banach
c0963adcc32e        centos              "echo 'hello world'"   4 minutes ago       Exited (0) 4 minutes ago                       distracted_sammet
```

ターミナルでコンテナを操作することもできます。このとき `-i` （標準入力）と `-t`（疑似ターミナル）のオプションを指定します。今度は Ubuntu の環境を起動してみます。`docker run -i -t ubuntu bash` を実行します。コンテナ起動時に、ローカルにイメージが存在しない場合、自動的に Docker Hub からイメージを取得した後、コンテナを起動します。

```
$ docker run -i -t ubuntu bash
root@d7d20a8e7bb7:/# cat /etc/issue
Ubuntu 14.04.2 LTS \n \l
```

このとき `exit` を入力すると、コンテナは停止します。停止せずに元のターミナルに戻るには `Ctrl + P + Q` キーを押します（この作業を、コンテナからデタッチする、と呼びます）。

ここまではコンテナは実行して終了するか、直接コンテナを操作してきました。画面に何も表示させず、バックグラウンドでデーモンとして動作させる `-d` オプションを使うこともできます。これはデタッチ・モードとしてコンテナを起動します。

例えば ping を実行してみます。

```
$ docker run -d ubuntu ping 127.0.0.1 -c 120
7bc2a8876520d19c08d2f71641eacaf643910ebac2cfa79870e4a7ef50dc6815
```

先ほどとは異なり、画面にコンテナ ID が表示されました。この ID は `docker ps` で表示されるものと同じです。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
7bc2a8876520        ubuntu              "ping 127.0.0.1 -c 6   36 seconds ago      Up 35 seconds                           stoic_brattain
```

また、このコンテナ ID は何度も使用するものなので、環境変数で指定しておきます。※重要：この例では「7bc2a8876520」ですが、ID は環境によって異なります。自分の環境の ID を次のように入力します。

```
$ export CONTAINER=<自分の操作しているコンテナID>
```

このコンテナは、しばらく起動していますが、120秒経過すると自動的にコンテナが停止します。コンテナの中で、どのような処理が行われているかは `docker logs <コンテナID>` コマンドで確認できます。

```
$ docker logs $CONTAINER
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.196 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.129 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.101 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.098 ms
...
```

リアルタイムで見たい場合は `docker logs -f <コンテナID>` を実行します。あるいは `docker attach <PID>` を実行してコンテナにアタッチし、直接コンテナ内のターミナルから内容を確認することもできます。このとき実行中に `Ctrl + C`を押すと ping は中断し、コンテナも終了します。

また、`docker logs --tail` コマンドや `docker logs --tai l <行数> -f` を組みあわせることもできます。

```
$ docker logs --tail 5 $CONTAINER
64 bytes from 127.0.0.1: icmp_seq=60 ttl=64 time=0.104 ms

--- 127.0.0.1 ping statistics ---
60 packets transmitted, 60 received, 0% packet loss, time 59000ms
rtt min/avg/max/mdev = 0.074/0.100/0.196/0.017 ms
```

稼働中のコンテナを停止するには `docker stop` または `docker kill` を使います。`stop` は SIGTERM シグナルで停止しますが、`stop` は `SIGKILL` で停止します。

先ほどの ping コンテナがまだ稼働しているようであれば、次のように停止できます。

```
$ docker stop $CONTAINER
```

### A-3. コンテナの詳細情報を確認

コンテナに関する情報は、`docker inspect <コンテナID>` で確認します。自分の環境で `docker ps -a` コマンド等を実行し、任意のコンテナ情報を表示します。

```
$ docker inspect $CONTAINER
[
{
    "Id": "7bc2a8876520d19c08d2f71641eacaf643910ebac2cfa79870e4a7ef50dc6815",
    "Created": "2015-07-06T03:43:46.882917122Z",
    "Path": "ping",
    "Args": [
        "127.0.0.1",
        "-c",
        "120"
    ],
    "State": {
        "Running": false,
        "Paused": false,
...
```

画面に多くの情報が表示されます。この情報は `--format` コマンドを使ってフィルタすることもできます。

```
$ docker inspect --format='{{.Config.Cmd}}' $CONTAINER
‘{[ping 127.0.0.1 -c 120]}
```

また表示形式の切り替えも可能です。JSON 形式で表示するには、次のように指定します。

```
$ docker inspect --format='{{json .Config.Cmd}}' $CONTAINER
["ping","127.0.0.1","-c","120"]
```

### A-5. 不要なコンテナの削除

Docker コンテナを停止しても、コンテナ内での処理結果（ログ）やファイル差分などの情報はデータとして残り続けます。特に使わない場合は `docker rm` コマンドで停止します。次のコマンドは、停止した（コンテナの status が exited のもの）全てのコンテナをフィルタし、対象を削除するものです。

```
$ docker rm $(docker ps -aq --filter='status=exited')
ea13ae07f702
7bc2a8876520
d7d20a8e7bb7
c89b318326c9
```

この状態で `docker ps -a` コマンドを実行すると、停止したコンテナは全て削除されています。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d6a33b8c0147        amazon/amazon-ecs-agent:latest   "/agent"            38 minutes ago      Up 52 minutes       127.0.0.1:51678->51678/tcp   ecs-agent
```

### A-6. イメージの内容確定（コミット）や変更差分

コンテナは起動し直すと、内容が削除されることを確認しましょう。ubuntu イメージ上で `/hello.txt` を作成し、`exit` でコンテナを終了します。

```
$ docker run -i -t ubuntu bash
root@8a8828e2bdfa:/# echo "hello world" > /hello.txt
root@8a8828e2bdfa:/# ls -al /hello.txt
-rw-r--r-- 1 root root 12 Jul  6 04:06 /hello.txt
root@8a8828e2bdfa:/# exit
```

再び `ubuntu` イメージを起動しても、先ほどの内容は記録されていません。

```
$ docker run -i -t ubuntu bash
root@eb0942edc229:/# ls -l /hello.txt
ls: cannot access /hello.txt: No such file or directory
```

もう一度、`/hello.txt` を作成し、コンテナを停止してみましょう。

```
$ docker run -i -t ubuntu bash
root@728c30a9d97d:/# echo "hello world" > /hello.txt
root@728c30a9d97d:/# ls -al /hello.txt
-rw-r--r-- 1 root root 12 Jul  6 04:32 /hello.txt
root@y:/# exit
```

コンソールに戻ってきたあとは、`docker ps -l` を実行し、最後に実行したコンテナIDを確認します。

```
zem@ubuntu:~$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
728c30a9d97d        ubuntu              "bash"              About a minute ago   Exited (0) 6 seconds ago                       pensive_goldstine
```

それから `docker diff <コンテナID>` を実行すると、どのような変更が加わったかが分かります。

```
zem@ubuntu:~$ docker diff <コンテナID>
A /hello.txt
C /root
A /root/.bash_history
```

そして、内容を確定するには `docker commit <コンテナID> <レポジトリ名:タグ>` の形式で指定します。以下は実行例です。`<ユーザ名>`の箇所は、任意のものに置き換えます。ここでは`ecsdocker/myapp:1.0`としていますが、任意のレポジトリ名:タグを利用できます。

```
$ docker commit $CONTAINER ecsdocker/myapp:1.0
1b07ddefe341abdae8f497a4dea24b2fef46a2a32621a0998fb0e7e8c2fbf666
```

コミットしたイメージは、`docker images` コマンドで確認できます。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ecsdocker/myapp      1.0                 1b07ddefe341        17 seconds ago      188.3 MB
```

作成された `IMAGE ID` は環境変数に入れます。

```
$ export IMAGEID=<作成したイメージの IMAGE ID>
```

この作成したコンテナを使えば、先ほどの `/hello.txt` を確認できます。

```
$ docker run ecsdocker/myapp:1.0 cat /hello.txt
hello world
```

また、`docker history` コマンドで、これが centos をベースとしたイメージであることも分かります。

```
$ docker history $IMEGEID
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
1b07ddefe341        2 minutes ago       bash                                            66 B
6d4946999d4f        3 weeks ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B
9fd3c8c9af32        3 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.895 kB
435050075b3f        3 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
428b411c28f0        3 weeks ago         /bin/sh -c #(nop) ADD file:b3447f4503091bb6bb   188.1 MB
```

### A-7. Dockerfile で wget・ping のコンテナを構築

`Dockerfile` は、どのような Docker イメージを構築するかを指示する設定ファイルです。都度 docker イメージを作成して commit するのは大変ですが、Dockerfile であれば、迅速・手軽に環境を構築します。

まず、作業用のディレクトリを作成し、移動します。基本的に、１つのディレクトリの中に、１つの Dockerfile を置きます。

```
$ mkdir dev
$ cd dev
```

ここでは Ubuntu で `wget` を実行する、シンプルなコンテナを作成します。テキストエディタを開き、`Dockerfile` という名前で次の内容を保存します。

```
FROM ubuntu:14.04

RUN apt-get install -y wget
CMD /usr/bin/wget
```

`FROM` は、Docker イメージ構築時に元となるイメージ名やタグを指定します。

`RUN` はコンテナの中で実行するコマンドを記述します。ただし、このコマンドを使ってデーモンを起動することはできません。

`CMD` はコンテナ内で PID 1 として実行されるコマンドを指定します。

次に `docker build` コマンドを使って構築します。「<名前>/wget」というイメージで構築してみましょう。画面上には構築時の経緯が表示されます。もし、指示が間違っていたり、何らかのエラーがあれば画面上に表示し、処理は中断します。

```
$ docker build -t ecsdocker/wget .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04
(省略)
Running hooks in /etc/ca-certificates/update.d....done.
 ---> 7e1de0cfab32
Removing intermediate container 3689bf774a1c
Successfully built 7e1de0cfab32
```

この構築されたイメージを使って、コンテナを起動します。特に何も無ければ、自動的にコンテナ内の wget が実行され、その結果が表示されます。

```
$ docker run -ti ecsdocker/wget
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
```


ここでは `CMD` を使いましたが、似たようなものに `ENTRYPOINT` があります。これは、予めパラメータを決めておくことができます。もし、コンテナ起動時に何らかのオプションがあれば、`CMD` 同様にコマンドを実行しますが、何も引数が無ければ `ENTRYPOINT` で指定したものを実行します。

例として、ping を実行するコンテナを作成します。Dockerfile は次の通りです。

```
FROM ubuntu:14.04

ENTRYPOINT ["ping", "-c", "60"]
```

`docker build` でイメージを作成します。

```
docker build -t ecsdocker/ping .
```

あとは `docker run` でコンテナを実行します。引数は `127.0.0.1` のみ指定すると、先ほど `ENTRYPOINT` に記述した `-c 60` オプションが自動適用されます。

```
$ docker run ecsdocker/ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.108 ms
```

もちろん、`-c 10` など、任意のオプションを指定することもでき、その場合はそのオプションが優先されます。

```
$ docker run ecsdocker/ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.092 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.092/0.092/0.092/0.000 ms
```

なお、`ENTRYPOINT` が `Dockerfile` で指定されている場合でも、Docker コンテナ起動時に `--entrypoint` コマンドで設定を変更できます。以下のように、ping コンテナに bash で操作できるようになります。

```
$ docker run -t -i --entrypoint bash  ecsdocker/ping
root@cb197726e198:/#
```

### A-8. Dockerfile で Nginx のコンテナを構築

ローカルの静的ファイルをコンテナ内に送ることもできます。`Dockerfile` で`ADD`を使います。似たようなものに `COPY` がありますが、`ADD` のほうが URL や圧縮ファイルも指定できるので、より汎用的です。

まず、コンテンツを作成します。

```
$ mkdir contents
$ echo "hello world" > ./contents/index.html
```

そして、Dockerfile は次のように編集します。オフィシャルの nginx レポジトリを使ってイメージを作成し、`./contents` ディレクトリの中身を、ドキュメントルート `/usr/share/nginx/nginx` にコピーします。

```
FROM nginx
ADD ./contents /usr/share/nginx/html
```

次に構築します。

```
$ docker build -t ecsdocker/web .
```

次にコンテナを起動しますが、`-p` オプションを使います。これは、ホスト側とコンテナ内のポート・マッピングを行うもので、`-p ホスト側のポート:コンテナ内のポート`の形式で任意の指定ができます。

```
$ docker run -d -p 80:80 ecsdocker/web
010a5fbd22acbfab818541e3f07055b5338f9fa010ee9a26899423dd5944938c
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                         NAMES
010a5fbd22ac        ecsdocker/web        "nginx -g 'daemon of   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp, 443/tcp   determined_albattani
```

このようにコンテナが起動したら、ホスト側の curl やブラウザ上で `hello world` が表示されることが分かります。

```
$ curl http://127.0.0.1/
hello world
```

確認したら、一旦`docker stop <コンテナID>` でコンテナを停止します。この例では `010a5fbd22ac` ですが、各々の環境で `docker ps` を実行して確認します。

```
$ docker stop <コンテナID>
```

`Dockerfile` でコンテンツをコピーしなくても `-v` オプションでホスト側とコンテナ内でボリュームを共有する機能もあります。ボリューム機能を使えば、コンテンツだけでなく、ログなど動的に変わるデータをコンテナ内ではなくホスト側に保管します。

使うにはコンテナ起動時、`-v ホスト側のパス:コンテナ内のパス` の形式で指定します。ホスト側のパスは、各々の環境にあわせて書き換えてください。

```
$ docker run -d -p 80:80 -v /home/<自分の環境のパス>/contents:/usr/share/nginx/html ecsdocker/web
21e7709d3aa9a1cd012dd5ba1343653dae49f81bbd75b1fd54e57598b2d8db13
```

このように指定すると、ホスト側の contents を編集すると、コンテナの応答内容も同時に変わることが分かります。あとは、色々操作して動作をみてみましょう。

```
zem@ubuntu:~/dev$ date > ./contents/date.txt
zem@ubuntu:~/dev$ curl http://127.0.0.1/date.txt
Mon Jul  6 00:55:49 EDT 2015
zem@ubuntu:~/dev$ rm ./contents/date.txt
zem@ubuntu:~/dev$ curl http://127.0.0.1/date.txt
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.9.2</center>
</body>
</html>
```

`nginx` コンテナの詳細は[こちら](https://registry.hub.docker.com/_/nginx/)です。 ほかにも様々なアプリケーションやミドルウェアだけでなく、データベースも含めた幅広いイメージが [Docker Hub 上に公開されています](https://registry.hub.docker.com/)。


ハンズオン手順は以上です。お疲れさまでした。

## 番外編

### X-1. Docker Machine を使った EC2 上の Docker 環境構築

Docker Machine を使い、Amazon EC2 上に Docker Engine をすぐに利用可能な環境を構築し、リモートでの操作、ログイン、削除を行います。

まず、Docker Machine のバイナリをダウンロード・セットアップを行います。以下は Linux (64bit) での実行例です。その他の OS 環境は[ダウンロード用ページ](https://docs.docker.com/machine/#installation)を参照ください。

```
$ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_linux-amd64 > ./docker-machine
$ chmod +x ./docker-machine
```

ダウンロード後は、バージョンが表示されることを確認します。

```
$  docker-machine -v
docker-machine version 0.3.0 (0a251fe)
```

`docker-machine` コマンドを使い、EC2 インスタンスを自動起動します。次のコマンドを実行すると「ec2docker」というインタンスを起動します。本来は様々なリージョンやインスタンス・タイプを選択できますが、ここではデフォルトの US-EAST リージョンで、t2.micro インスタンスを起動します。リージョン等の様々なオプションについては[ドキュメント](https://docs.docker.com/machine/#amazon-web-services)をご覧ください。

```
$ docker-machine create --driver=amazonec2 \
    --amazonec2-access-key=<アクセス・キー> \
    --amazonec2-secret-key=<シークレット・キー> \
    --amazonec2-vpc-id=<VPC ID>  \
       ec2docker

```

起動までに時間がかかります。これは、EC2 インスタンスの起動後、Docker 実行環境のプロビジョニングも同時に行われるからです。

暫く待つと、次のような画面が表示されます。

```
Creating CA: /root/.docker/machine/certs/ca.pem
Creating client certificate: /root/.docker/machine/certs/cert.pem
Launching instance...
To see how to connect Docker to this machine, run: docker-machine env ec2docker
```

これで環境が利用可能になりました。リモートの Docker を操作できるように `docker-machine env ec2docker` を実行します。

```
# docker-machine env ec2docker
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://54.152.12.116:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/ec2docker"
export DOCKER_MACHINE_NAME="ec2docker"
# Run this command to configure your shell:
# eval "$(docker-machine env ec2docker)"
```

画面に表示される export 行または `eval "$(docker-machine env ec2docker)"` を実行します。あとは、通常通り `docker` コマンドが利用できます。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
$ docker info
Containers: 0
Images: 0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-53-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 1
Total Memory: 992.5 MiB
Name: ec2docker
ID: 64Q4:ZURU:X4FL:BFPV:QWMW:NUBP:B2QB:JIYE:V4EI:PLKH:NSNT:5YVC
WARNING: No swap limit support
Labels:
 provider=amazonec2
```

`docker-machine` コマンドを使い、どの環境で、どのようなコンテナが起動しているか確認します。

```
$ docker-machine ls
NAME        ACTIVE   DRIVER      STATE     URL                        SWARM
ec2docker   *        amazonec2   Running   tcp://54.152.12.116:2376
```

リモートに SSH ログインしてみます。

```
$ docker-machine ssh ec2docker
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-53-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Mon Jul  6 02:34:02 UTC 2015

  System load:  0.65              Processes:              107
  Usage of /:   9.1% of 15.61GB   Users logged in:        0
  Memory usage: 11%               IP address for eth0:    10.0.1.244
  Swap usage:   0%                IP address for docker0: 172.17.42.1

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud


*** System restart required ***
ubuntu@ec2docker:~$ uptime
 02:36:37 up 5 min,  1 user,  load average: 0.05, 0.27, 0.16
```

最後にインスタンスを削除するため、`docker-machine rm` を実行します。

```
$ docker-machine rm ec2docker
Successfully removed ec2docker
```

`docker-machine ls` で何も表示されていなければ、対象インスタンスは Terminate 済みです。マネジメント・コンソロール上でも、同様に停止していることが確認できます。

```
# docker-machine ls
NAME        ACTIVE   DRIVER      STATE     URL                        SWARM
```


### X-2. もくもく自習用

更に Docker と連携する、Docker Machine、Docker Swarm、Docker Compose のオーケストレーションを試すこともできます。

* 【参考訳】Docker Machine 0.3.0 Deep Dive http://pocketstudio.jp/log3/2015/07/03/docker-machine-0-3-0-deep-dive/
* Docker Machine ドキュメント参考日本語訳 http://qiita.com/zembutsu/items/9d189da5d2c7708717a3
* Overview of Docker Machine https://docs.docker.com/machine/
* Docker Swam ドキュメント参考日本語訳 http://qiita.com/zembutsu/items/a1f0a89581d1d5832e2e
* Overview of Docker Swarm https://docs.docker.com/swarm/
* Overview of Docker Compose https://docs.docker.com/compose/

### X-3. おまけ

```
$ docker run -it --rm supertest2014/nyan
```
※ `Ctrl+C` で終了