EC2 + CoreOS + Dockerでコンテナ作成からデプロイまで

# EC2 + CoreOS + Dockerでコンテナ作成からデプロイまで

## この記事でやっていること
- コンテナを作ってHTTPでアクセス確認する
- Docker HubにPushする
- 別の仮想環境で先ほどのイメージをテストする
- etcd + fleetを使用してEC2で起動
- fleetを使用してDocker起動
- イメージを更新する
- fleetを使ってEC2のコンテナを更新する

## コンテナを作ってHTTPでアクセス確認する
まずは開発環境でコンテナを作成します。

- 作業ディレクトリの作成

```bash:
$ sudo mkdir /var/docker
$ sudo chown core:core /var/docker
$ cd /var/docker
```

- Dockerfileでnginxをインストールしてindex.htmlを作成

```bash:Dockerfile
FROM ubuntu

MAINTAINER onishi <-----@gmail.com>

RUN apt-get install -y nginx
RUN echo "hogehoge" > /usr/share/nginx/html/index.html
```

- build

```
$ docker build -t [username]/hogehoge_nginx ./
```

- docker起動とテスト

```
$ docker run -d -p 49100:80 --name hogehoge_nginx [username]/hogehoge_nginx /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

$ curl http://127.0.0.1:49100
hogehoge
```

- 確認できたのでstopしておく

```bash:
docker stop hogehoge_nginx
```

## Docker HubにPushする
- Docker Hubのアカウント情報を入力してPushする

```bash:
$ docker push [username]/hogehoge_nginx
The push refers to a repository [username/hogehoge_nginx] (len: 1)
Sending image list

Please login prior to push:
Username: [username]
Password:
Email: -------@gmail.com
Login Succeeded
```

- Docker Hubでリポジトリできているのを確認できたら完了

## 別の仮想環境で先ほどのイメージをテストする
先ほどの環境とは別に新しいサーバ内で実行すること

- イメージの検索
	- 先ほど登録したイメージが引っかかる

```bash:
$ docker search hogehoge_nginx
NAME                       DESCRIPTION   STARS     OFFICIAL   AUTOMATED
[username]/hogehoge_nginx                 0
```

- イメージを持ってくる

```
$ docker pull [username]/hogehoge_nginx
```

- コンテナ起動

```bash:
$ docker run -d -p 49100:80 --name hogehoge_nginx [username]/hogehoge_nginx /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

$ curl http://127.0.0.1:49100
hogehoge
```

アクセスできるのが確認できた

## etcd + fleetを使用してEC2で起動
- etcdはdiscovery.etcd.ioを使う

```bash:
$ curl -w "\n" https://discovery.etcd.io/new
https://discovery.etcd.io/[発行されたtoken]
```

- CoreOSのイメージはここから選ぶ
> https://coreos.com/docs/running-coreos/cloud-providers/ec2/

- 普段立ち上げるのとほぼ同じだが2点変更するところがある

- Security GroupのInboundに所属するSecurity Groupからの4001と7001を開ける
	- sg-12345678だった場合はsg-12345678からの4001と7001を開けておく
		- etcdで使用する

- user-dataを変更する

```bash:user-data
#cloud-config

coreos:
  etcd:
    discovery: https://discovery.etcd.io/[発行されたtoken]
    addr: $private_ipv4:4001
    peer-addr: $private_ipv4:7001
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
    - name: docker.service
      command: start
```

## fleetを使用してDocker起動

- ec2にログインしてfleetが正常に動いているか確認

```bash:
$ ssh core@54.64.109.XXX
CoreOS (stable)
core@ip-XXX-XXX-XXX-XXX ~ $

$ fleetctl list-machines
MACHINE		IP		METADATA
125eXXXX...	XXX-XXX-XXX-XXX	-
```

- hogehoge_nginxを起動するスクリプトを書く

```bash:hogehoge_nginx.service
[Unit]
Description=My hogehoge nginx
After=docker.service
Requires=docker.service

[Service]
ExecStartPre=/usr/bin/docker pull [username]/hogehoge_nginx
ExecStart=/usr/bin/docker run --rm=false --name hogehoge_nginx -p 49100:80 [username]/hogehoge_nginx /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
ExecStop=/usr/bin/docker stop hogehoge_nginx ; /usr/bin/docker rm hogehoge_nginx
```

- fleetにスクリプト登録して開始する

```bash:
$ fleetctl submit ./hogehoge_nginx.service
$ fleetctl start hogehoge_nginx.service
$ curl http://localhost:49100
hogehoge
```

- 停止する時

```bash:
fleetctl stop hogehoge_nginx.service
```

## イメージを更新する
- 新しいDockerfile

```bash:Dockerfile
FROM [ユーザー名]/hogehoge_nginx

MAINTAINER onishi <-----@gmail.com>

RUN apt-get install -y nginx
RUN echo "fugafuga" >> /usr/share/nginx/html/index.html
```

- build

```bash:
$ docker build -t [username]/hogehoge_nginx ./
```

- push

```bash:
$ docker push [username]/hogehoge_nginx
```

## fleetを使ってEC2のコンテナを更新する

- さきほどのhogehoge_nginx.serviceを使う

```bash:
$ fleetctl start hogehoge_nginx.service
$ curl http://localhost:49100
hogehoge
fugafuga
```

## まとめ
- デプロイ方法は検討する必要あり
- 次回あたりでX-Fleetに触れたい