AWSで初めてのDocker: AmazonLinux上でAmazonLinuxのコンテナを動かす

* AmazonLinuxをホストとして、AmazonLinuxのコンテナを動かします
    * SSH,HTTPを公開したコンテナを作ります

## 1. ホストの用意
* 以下の構成で始めてみました

| AMI |Instance type |
|:--|:--|
|Amazon Linux AMI 2014.09.2 (HVM) | t2.medium |

dockerのインストール・起動

```
$ sudo yum install -y docker
$ sudo /etc/init.d/docker start
$ sudo chkconfig docker on
```

## 2. コンテナイメージの作成
* AmazonLinuxのコンテナを作ります
    * http://dev.classmethod.jp/cloud/aws/docker-serverspec-configspec-ci/ の手順で作れました、先人に感謝！

----
* 1) Amazon Linux EC2を普通にLaunchし、そのままStopします
    * これがコンテナイメージの元になります

* 2) そのEC2のEBS VolumeをDettach後、DockerがセットアップされたEC2にAttachし、mountします
    * mount方法については http://dev.classmethod.jp/cloud/aws/ec2-investigate-detach-attach/ に詳しく書かれてます
    * 上の文書に従い /mnt/ebs にマウントします

```
$ sudo mkdir /mnt/ebs
$ sudo mount /dev/xvdf1 /mnt/ebs/
```

* 3) 不要なファイルを削除します

```
$ cd /mnt/ebs/
$ sudo rm -rf ./var/log/* ./var/cache/yum/* ./home/ec2-user/.ssh/authorized_keys
```

* 4) イメージの作成、インポート
    * 上記コマンドで3,4分ほどでした
    * この時点ではまだ起動はしません(起動してもSSH接続できないので)

```
$ sudo tar --numeric-owner -cjp . | sudo docker import - local/amzn

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
local/amzn          latest              9d8833faf01f        4 minutes ago       810.1 MB
```

* 5) EBS VolumeをアンマウントしDettachします

```
$ cd ~/
$ $ sudo umount /mnt/ebs/
```

* 6) Dockerfileを用意します
    * 場所はどこでも良いです
    * http://matsukaz.hatenablog.com/entry/2014/11/17/190233 に書かれてるように、Dockerfileでauthorized_keysの権限を変更する必要があるようです(下記は対応済)

```:Dockerfile
FROM local/amzn

# PAM設定を変えておかないとsshがいきなり切れる
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
RUN passwd -f -u ec2-user

# start-stopしてhost_keyを作る
RUN service sshd start
RUN service sshd stop

# SSH接続の公開鍵ファイルの設置
ADD ./authorized_keys /home/ec2-user/.ssh/authorized_keys
RUN chmod 600 /home/ec2-user/.ssh/authorized_keys
RUN chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys

EXPOSE 22 80
```

* 7) SSH接続で使用する公開鍵をauthorized_keysとして配置します
    * 鍵がない場合は適当に作ってください

```
$ cp ~/.ssh/id_rsa.pub authorized_keys
```

* 8) SSH接続できるイメージをビルドします
    * イメージの完成です
    * Dockerfile,authorized_keysは不要なので消してOKです

```
$ sudo docker build -t local/amznssh .

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
local/amznssh       latest              2d3d4f7e4ff9        33 seconds ago      810.1 MB
local/amzn          latest              9d8833faf01f        16 hours ago        810.1 MB
```

### 3. コンテナの起動
* コンテナを起動します
    * sshを待ち受けるようにします

```
$ sudo docker run -d -p 22 -p 80 local/amznssh /usr/sbin/sshd -D
8b3b849ade972c9cb75c58f5912a6474fb5745b858e0269a368e5941fe7d460f

$ sudo docker ps
CONTAINER ID        IMAGE                  COMMAND               CREATED             STATUS              PORTS                                          NAMES
8b3b849ade97        local/amznssh:latest   "/usr/sbin/sshd -D"   19 seconds ago      Up 18 seconds       0.0.0.0:49153->22/tcp, 0.0.0.0:49154->80/tcp   focused_wilson 
```

* sshログインできました
    * ここでは49153番ポートで接続していますが、docker runの-pオプションで ```-p 10022:22``` のようにすれば待ち受けポートを指定することも可能です

```
$ ssh 127.0.0.1 -p 49153

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
[ec2-user@8b3b849ade97 ~]$ 

```

### 【おまけ】負荷について
* １コンテナ起動した状態ではCPU/メモリともに余裕たっぷりといった感じでした
* (もちろん処理内容にもよりますが)micro/smallインスタンスでも十分に動かせるかもしれません