Docker学習中につき！(コマンドの整理とイメージ構築など)

# ◎はじめに
[AWS ECSを使用する前にDockerを理解しなきゃ](http://qiita.com/mitzi2funk/items/14fa88d85498db28144a)
↑前回の投稿に引き続き、Dockerを学習中の私
こういった学習にありがちな、何から手を付けたらいいか分からない！
そんな時に目に飛び込んできた公式ドキュメント(日本語版)の[例で学ぶ](http://docs.docker.jp/engine/tutorials/index.html)シリーズ
こちらをなぞりながら、不明点を一つ一つ潰すことにしました。
本稿はその途中経過になります。

[公式サイト](https://docs.docker.com/)
[Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/index.html)

# 01. Dockerコマンド整理
・学習中に出てきたコマンドを整理してみました。

## 01-1. 基本書式

```bash
[sudo] docker [サブコマンド] [フラグ] [引数]

例:
$ docker run -i -t ubuntu /bin/bash
```

## 01-2. runコマンドのフラグ

> -i: コンテナの標準入力 (STDIN)を取得し、双方向に接続できるようにする
-t: 新しいコンテナ内に疑似ターミナル (pseudo-tty) を割り当てる
-d: コンテナをバックグラウンドで実行するよう Docker に命令する
-p: Docker コンテナに割り当てるポートの指定
-P: コンテナ内部のネットワークで必要なポートを、ホスト側にマップする（割り当てる）よう Docker に命令する

ちなみに[Docker run リファレンス](http://docs.docker.jp/engine/reference/run.html)

■ 備考
・dockerコマンドを実行するには、root権限が必要になる。
sudoが面倒であればdockerグループに実行ユーザグループを登録する。

```bash
sudo groupadd docker (dockerグループがなかった場合)
sudo gpasswd -a $USER docker
sudo service docker restart (反映)
exit (ログインし直す)
```

## 01-3. その他コマンド

[コマンドリファレンス](http://docs.docker.jp/engine/reference/commandline/cli.html)

### ■ 全般

```
docker version ・・・ Docker クライアントとデーモンのバージョン情報を確認

docker --help
-> docker [サブコマンド] --help
```

### ■ コンテナ関連

```
docker ps ・・・ コンテナの一覧を表示
-> docker ps -a ・・・ 停止したコンテナ情報も表示

docker logs ・・・ コンテナの標準出力を表示
-> docker logs -f [コンテナID or コンテナ名] ・・・ tail -f コマンドのように動作するもので、コンテナの標準出力を表示

docker stop [コンテナID or コンテナ名] ・・・ 実行中のコンテナを停止

docker start [コンテナID or コンテナ名] ・・・ 指定コンテナの再開

docker rm [コンテナID or コンテナ名] ・・・ 指定コンテナの削除。先に停止する必要あり

docker port [コンテナID or コンテナ名] [公開ポート] ・・・　割り当てたポートの確認

docker top [コンテナID or コンテナ名] ・・・ コンテナ内で実行中のプロセスを確認
```

### ■ image関連

```
docker images ・・・ ローカルにあるイメージの一覧を表示

docker search [検索対象のイメージ名] ・・・ Dockerイメージの検索(部分一致)
→ 検索結果に関して
  Official(公式リポジトリ)とは、Docker 社のサポートよって丁寧に精査されている Docker リポジトリ
  Automated (自動構築) とは有効なソースコードを元に、イメージ内容が自動構築されたリポジトリ

docker pull [イメージ名] ・・・ デフォルトのリポジトリ(Docker Hub)からイメージを取得する

docker commit -m "コメント" -a "更新した担当者名" [コンテナID] [ユーザ名]/[イメージ名]:[タグ] ・・・ イメージの更新
※ 例: docker run ~ でコンテナを作成し、コンテナ内の更新(ミドルウェアの追加など)をした後、更新を実施する

docker build -t [ユーザ名]/[イメージ名]:[タグ] [Dockerfileのパス] ・・・ Dockerfileからイメージを構築

docker tag [イメージID] [ユーザ名]/[イメージ名]:[タグ] ・・・ 指定イメージにタグを設定
→ docker images でイメージIDを確認出来る

docker push [ユーザ名]/[イメージ名]　・・・ デフォルトのリポジトリ(Docker Hub)へイメージを送信

docker rmi [ユーザ名]/[イメージ名]　・・・ イメージの削除
```

# 02. 実行例
## 02-1. ウェブ・アプリケーションを実行

・ウェブ・アプリケーションとして、Python の Flask アプリケーションを実行

```bash
$ docker run -d -P training/webapp python app.py

<or>

$ docker run -d -p 80:5000 training/webapp python app.py

※ 割当ポートを指定する場合。本件では、ローカルホスト上のポート80を、コンテナ内のポート5000に割り当てています。
※ 「training/webapp」ローカルになかった場合、Docker Hub レジストリからダウンロードしたイメージ

・該当コンテナの確認
$ sudo docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
e06e45c26e5d        training/webapp     "python app.py"     55 seconds ago      Up 55 seconds       0.0.0.0:32769->5000/tcp   eloquent_booth

・上述のpython アプリケーションの動作確認
[root@mitzi_dev02 ~]# curl localhost:32769
Hello world!
```

## 02-2. Dockerfileからのイメージ構築

### ■ 参考
[Dockerfile を書くベスト・プラクティス]
(http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html)

### ■ Dockerfileからのsinatraイメージ構築
・例に従い、sinatraイメージを作成しています。

```bash
・ディレクトリとDockerfileを作成する
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile
```

```bash
・新しいイメージ層を作成 (例: sinatraイメージ)
$ vi Dockerfile
---
FROM ubuntu:14.04
MAINTAINER Mitzi <mitzi@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra
---

※　Dockerfileの書式は後述
```

```bash
・Dockerfileよりイメージ構築
$ docker build -t mitzi/sinatra:v2 .　(※1)

↓ (ここで問題発生。下記エラーが出力されbuildが失敗する)

Step 4/4 : RUN gem install sinatra
 ---> Running in 32e389cdc908
ERROR:  Error installing sinatra:
    rack requires Ruby version >= 2.2.2.
The command '/bin/sh -c gem install sinatra' returned a non-zero code: 1


▽原因
Ubuntu 14.04 の 標準Rubyバージョンは 1.9 or 2.0系のため、この事象が起きている模様。

▽補足
(※1) 最後の'.'は、Dockerfileの場所を指定している
ちなみにファイル名まで指定したらディレクトリを指定しなさいって怒られました。。。
```

```bash
・対処としてsinatraのバージョンを下げました。
$ vi Dockerfile
---
FROM ubuntu:14.04
MAINTAINER Mitzi <mitzi@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra -v=1.4.5　★コチラ
---

・その上で再度build実行
[ec2-user@mitzi_dev02 sinatra]$ docker build -t mitzi/sinatra:v2 .
Sending build context to Docker daemon 2.048 kB
Step 1/4 : FROM ubuntu:14.04
 ---> 132b7427a3b4
Step 2/4 : MAINTAINER Mitzi <mitzi@example.com>
 ---> Using cache
 ---> b69fccc09fc0
Step 3/4 : RUN apt-get update && apt-get install -y ruby ruby-dev
 ---> Using cache
 ---> da210e15c311
Step 4/4 : RUN gem install sinatra -v=1.4.5
 ---> Running in c24ea754b41a
unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping
unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping
Successfully installed rack-1.6.8
Successfully installed tilt-1.4.1
Successfully installed rack-protection-1.5.3
Successfully installed sinatra-1.4.5
4 gems installed
Installing ri documentation for rack-1.6.8...
Installing ri documentation for tilt-1.4.1...
Installing ri documentation for rack-protection-1.5.3...
Installing ri documentation for sinatra-1.4.5...
Installing RDoc documentation for rack-1.6.8...
Installing RDoc documentation for tilt-1.4.1...
Installing RDoc documentation for rack-protection-1.5.3...
Installing RDoc documentation for sinatra-1.4.5...
 ---> 9974da1f281f
Removing intermediate container c24ea754b41a
Successfully built 9974da1f281f

→ 無事 build出来ました。
```

```bash
・作成したイメージからコンテナ作成
[ec2-user@mitzi_dev02 sinatra]$ docker run -t -i mitzi/sinatra:v2 /bin/bash
root@6fe2c9908c28:/#
```

### ■ Dockerfileの書式

```
[命令] [ステートメント]
コメントアウトは '#'

・ 命令
FROM ・・・  Docker に対して基となるイメージを伝える
MAINTAINER　・・・ 当該イメージの管理者指定
RUN ・・・ イメージ中で実行するコマンドを指示
```

# 02-3. イメージにタグを設定

・コミットまたは構築後のイメージに対しても、タグを付けられる

```bash
・既存イメージに新しいタグを付与
[ec2-user@mitzi_dev02 ~]$ docker tag 9974da1f281f mitzi/sinatra:devel

・タグ付けられたことを確認
[ec2-user@mitzi_dev02 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mitzi/sinatra       devel               9974da1f281f        2 days ago          323 MB
mitzi/sinatra       v2                  9974da1f281f        2 days ago          323 MB
```

以上になります。
引き続き学習の方、進めてゆきます。