はじめてのDocker in AWS


初めてのDockerなので、とりあえず動けばOK。
チュートリアルはいろいろあるけど、自分用に手順をまとめてみるぐらいの意味合いなので汎用的とか気にしない。
よくわからん状況になってもいいようにEC2で動かすことにする。
OSはAmazonLinux使う。yumで簡単にインストールできるようになったみたいだし。
手探りでやってるので、間違いも多くあると思います。発見したらコメント、修正リクエスト歓迎です。

# 下準備

EC2でAmazonLinuxをSmallで起動する。
気をつけることは多分64bitしておくことと、microだとメモリとか問題出るかもだしsmallインスタンスにしておくこと。
容量も20GBぐらいはあったほうがいい気がする。
ポートはいろいろ使用するので、全開放しておいたほうが楽。ただしテスト以外ではやってはいけない。立ち上げっぱなしもしてはならない。あくまでテスト用の使い捨て。
色々試すならGithubからcloneしてビルドみたいなことをやるようになるみたいなので、gitのインストールとgithubの鍵登録ぐらいはしておくとよさげ。

# インストール

```bash:yumでインストール
yum search docker
sudo yum install docker
```

今回は0.9.0がインストールされた。

# 起動

```bash:dockerを起動する
sudo service docker start
#Starting cgconfig service:                                 [  OK  ]
#Starting docker:	                                   [  OK  ]

ps ax |grep docker
#1709 pts/0    Sl     0:00 /usr/bin/docker -d
```

こんな感じになる。

```bash:起動しているコンテナの確認
sudo docker ps
```

当然なにも起動していないので、テーブルの項目だけが出てくる。
Dockerはsudoコマンド必須っぽい。

# コンテナの起動

```sudo docker run ほにゃらら```みたいな形式でコンテナを起動。

```bash:centOSのイメージを起動させてbashを起動
sudo docker run -i -t centos /bin/bash
```

これでcentOSが起動してbashで操作できる。
初回は、OSのイメージ(でいいのかな)をダウンロードするために時間がかかる。20分とかかかることもあるようなのでのんびり待つ。
初回ダウンロードとかビルドが終わればCentOSなら数秒で立ち上がるようになった。確かにこの早さは魅力的。

__余談__
ちなみにここでコケたけど、原因はdockerのリポジトリにあったみたい。しばらくしたら通るようになった。
certificate is valid for ssl6268.cloudflare.com
こんなメッセージが含まれていたので、CDNとしてcloudflare使ってるみたい。このエラーはSSL証明書の更新中とか更新に失敗したとかそんな理由なんじゃないかと思うのでめったにあることではなさそう。

```bash:起動しているOSの種類とバージョンの確認
cat /etc/`ls /etc -F | grep "release$\|version$"`
```

終了するときは```exit```でコンテナを抜ける。
ただし、停止するだけでコンテナそのものは残っている。

# コマンドリファレンス

とりあえず使ってみる上で最低限必要な物だけメモる。詳しいことは知らないし。
基本sudoつけてるけど、ちゃんと使うなら権限付与するべき。

```bash:
sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
```

オプションがたくさんある。よく使うっぽいのだけピックアップ。
ビルドするためのコマンドもあるけど、ローカルにイメージがない場合はダウンロードして勝手にビルドして起動までしてくれるっぽい。

-i, --interactive=false: Keep stdin open even if not attached
インタラクティブモード、つまりシェルとか入力できる状態で起動何と対話モードになるかは起動したものによる。下の-tと一緒に使うことが多そう

-t, --tty=false: Allocate a pseudo-tty
仮想端末を割り当てる。つまりシェルを使えるようにすると同義でいいのだろうか？

-d, --detach=false: Detached mode: Run container in the background, print new container id
バックグラウンドで実行。実用で使う場合はほとんどこれつけるんだろうな

-p, --publish=[]: Map a network port to the container
ポートをマッピングする。```-p 8080:80```こんな指定をすると、Dockerで動作しているアプリケーションは80番ポートで起動。それを親OSの8080にマッピングとなるようだ。

動きを見るために適当に使ってみる。
CentOSをbashで動かすのをオプションを変えてやってみる。

```bash:
sudo docker run -i -t centos /bin/bash
#インタラクティブモードで起動してプロンプト(bash-4.1\#)が表示される、普通のbashとして使用できる。終了するとコンテナは停止する。

sudo docker run -i -t centos python
#ついでにpythonだとどうなるか。
#CentOSでpythonをインタラクティブモードで起動した状態になる。exit()で終了するとコンテナは停止する。

sudo docker run -i centos /bin/bash
#プロンプト(bash-4.1\#)は出ないが、起動してコマンドも受け付ける状態になる。見ただけだと-tがついてる状態とほぼ同じに見える。exitで抜けるとコンテナは停止する

sudo docker run -t centos /bin/bash
#プロンプト(bash-4.1\#)とは出てくるけど入力しても反応はない。実行もされていないようだ。Ctrl+Cで終了させてもコンテナは停止しない

sudo docker run centos /bin/bash
#エラーなどは出ないが、起動しない。正確には起動してそのまま停止してるだけっぽい。停止したコンテナが残っている。
#見た目的には何も起こらない。
```

これだけ見ると、-tと-iは片方だけで使用することはほとんどなさそうだ。
ドキュメント見ても、特殊な場合を除き両方ついてるのでそういうものだと思っておこう。

```bash:
sudo docker ps
#現在動いているコンテナ一覧を表示

sudo docker ps -a
#停止しているコンテナも含めたすべてのコンテナ一覧を表示

sudo docker start [コンテナID]
#停止していたコンテナをスタート

sudo docker stop [コンテナID]
#コンテナを停止

sudo docker rm [コンテナID]
#停止しているコンテナを削除。動いているとエラーになる
```

# いろいろ動かす

動かして楽しい物を適当に動かしてみる。見た目にわかりやすいということでcmsとか。
起動してもDBとか動き始めるまでに数分かかる場合が多いので注意。

## イメージ

https://index.docker.io/
OSとかアプリとか探す場合はここからイメージを探すのが一般的っぽい。
仕組みはhomebrewなんかと近そう。実態はgithubとかにあって、そこからダウンロードしてビルドして使えるようにしてるようだ。

## 動かす

#### 定番のwordpress

https://index.docker.io/u/tutum/wordpress/

```bash:
sudo docker run -d -p 81:80 tutum/wordpress
```

__アクセス__
http://[EC2のPublicDNS]:81/

#### 適当にDrupal

https://index.docker.io/u/ricardoamaro/drupal-lamp/

```bash:
sudo docker run -d -p 82:80 ricardoamaro/drupal-lamp
```

__アクセス__
http://[EC2のPublicDNS]:82/

#### LAMP環境

https://index.docker.io/u/tutum/lamp/

```bash:
sudo docker run -d -p 83:80 -p 3306:3306 tutum/lamp
```

__アクセス__
http://[EC2のPublicDNS]:83/

# ここからどうするか

今回はいろんなのが起動して動いたことが確認できればOKなのでここまでにします。
一番面白そうなところは、Dockerfileを作ってコミットしたりとリポジトリ的に扱えるところっぽいので今後はその辺試してみようと思います。