Ubuntu+Monit+Fluentd起動の自作DockerイメージをDockerHubに配置までをやってみた

流行り物に触れてみた。
みなさまのアウトプットに支えられてのまとめのようなもの。
感謝です。

## 成果物
* https://registry.hub.docker.com/u/ume3/docker-ubuntu-monit-log/dockerfile/
* https://github.com/ume3/docker-ubuntu-monit-log

### 起動
```
docker login
docker pull ume3/docker-ubuntu-monit-log
docker images
docker run -dt -p 2812:2812 ume3/docker-ubuntu-monit-log
docker ps
```

* DockerHub経由でDLして立ち上げるとMonit経由で以下が閲覧できる
 * ex) `http://127.0.0.1:2812`

![image](https://qiita-image-store.s3.amazonaws.com/0/20303/68347cc8-08f3-bace-f8e1-21ce2728dca2.png)

---

## つくりかた
* 必要なもの
 * [GitHub](https://github.com/)
 * [DockerHub](https://hub.docker.com/)
* Dockerを立ち上げる環境
 * 今回は、Mac(homebrew利用)
 * [boot2docker](https://github.com/boot2docker/boot2docker)
 * VirtulaBox
* Dockerを立ち上げる環境その2
 * 作ったイメージを別のDocker環境で用意したい場合
 * 適当に：AWSでUbuntuでもたちあげればいいんじゃないでしょうか（雑）

### GitHubにDockerfileを管理したいリポジトリを作成する
* Dokcerfileをおく用意をする
 * `git clone git@github.com:ume3/docker-ubuntu-monit-log.git`
 * 該当ディレクトリで作業する

### boot2docker (Macの場合）
* Dockerコンテナを立ち上げる環境を用意する
 * MacでDockerを扱いたいのでhomebrewを使う
* refs: https://docs.docker.com/installation/mac/
* refs: http://qiita.com/AH_korikori/items/8a165c081e8eb699deb3

```
brew update
brew tap homebrew/binary
brew install docker
brew install boot2docker
brew cask install virtualbox
```

* boot2dockerは `1.3`以上がよいです
 * `brew info boot2docker` で確認

#### boot2dockr のセットアップ
* boot2dockerをセットアップする

```
boot2docker init
boot2docker start
```

* セットアップ時に以下のようにdocker操作する際の環境変数を設定する
 * そのままコピペ(or `.zshenv`, `.bashenv`などに設定する）

```
---snip
To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/hoge/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
```

* Dockerコマンドを使えることを確認

```
% docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS
```

ここまでで準備はOK

---

### Dockerfileを用意してビルドする
* `Dockerfile` を書く
* ex) Ubuntuでdocker:dockerでsshログインする環境

```sh
# Latest Ubuntu LTS
FROM ubuntu:14.04
MAINTAINER ume3

ENV USER_NAME docker
ENV USER_PASSWORD docker

## install
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install sudo passwd openssh-server -y

## setup
# ssh
RUN sed -ri 's/^#PermitRootLogin yes$/PermitRootLogin no/' /etc/ssh/sshd_config

# useradd
RUN useradd $USER_NAME
RUN echo "$USER_NAME:$USER_PASSWORD" | chpasswd
RUN echo "$USER_NAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$USER_NAME
RUN mkdir /var/run/sshd
RUN mkdir /home/${USER_NAME}

## service
# ssh
EXPOSE 22

ENTRYPOINT [ "/usr/sbin/sshd", "-D" ]
```

* Dockerイメージの作成

```sh
# build
% docker build -t ubuntu .
# imagesの確認
% docker images
```

### Dockerコンテナの起動
* 10000番ポートでフォワーディングする設定を記載する（後述）

```
% docker run -dt -p 10000:22 ubuntu
bac4eb2001b2f6618a6c3b5b5b4b3e712b968ce403418059d15b92df4ca799b6
% docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES
bac4eb2001b2        ubuntu:latest       "/usr/sbin/sshd -D"   6 days ago          Up 12 seconds       0.0.0.0:10000->22/tcp   hungry_pasteur
```

### virtualbox経由でsshログインする
* boot2dockerを立ち上げると、VirtualBoxのイメージが立ち上がっている
* virutalbox起動より

![image](https://qiita-image-store.s3.amazonaws.com/0/20303/15b71c71-a214-45a1-7e0a-24415bf429ba.png)

#### VirtualBoxでポートフォワーディング
* refs: 
http://blog.ieknir.com/blog/build-docker-image-for-ssh-server/

ポートフォワーディングをして、以下の関係をつくってあげる。
今回は10000番とする。

```
[ssh:10000] -> [boot2docker-vm:10000] -> [docker-container:22]
```

* GUI操作でもいいがコマンドだと以下

* before

```sh
% VBoxManage showvminfo boot2docker-vm | grep ^NIC
NIC 1:           MAC: 080027502227, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: virtio, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny, Bandwidth group: none
NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
NIC 2:           MAC: 0800276ADD18, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: virtio, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny, Bandwidth group: none
NIC 3:           disabled
NIC 4:           disabled
NIC 5:           disabled
NIC 6:           disabled
NIC 7:           disabled
NIC 8:           disabled
```

* after

```sh
% VBoxManage controlvm "boot2docker-vm" natpf1 "ssh_container,tcp,127.0.0.1,10000,,10000"

%  VBoxManage showvminfo boot2docker-vm | grep Rule
NIC 1 Rule(0):   name = ssh_container, protocol = tcp, host ip = 127.0.0.1, host port = 10000, guest ip = , guest port = 10000
```

#### VirtualBox(GUI)確認
* VBoxManageで設定したことで以下。他、応用がきく。
![image](https://qiita-image-store.s3.amazonaws.com/0/20303/ae43526e-2fe4-9881-5aef-f59d2e840166.png)

#### sshログイン確認

```
% ssh -p 10000 docker@127.0.0.1
docker@127.0.0.1's password:
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.2.0-54-generic x86_64)
---snip
```

OK

#### 削除・整理コマンド
* このあたり

```
docker stop <CONTAINER>
docker ps
docker ps -q
docker stop `docker ps -q`
docker images
docker rmi <IMAGE>
```

---

## GitHub+DockerHub
* refs: http://qiita.com/jagaximo/items/4cbda778a10fd37f68e6
* refs: http://ameblo.jp/tech-cz/entry-11886401333.html
* refs: http://sawara.me/docker/2055/

### GitHub
* 動作確認のとれた `Dockerfile`をCommitして、GitHubへ`push`しておく

### DockerHub
* ログイン後
 * [settings] - [Linked Accounts]
 * GitHubとの認証を先に済ませておく

![image](https://qiita-image-store.s3.amazonaws.com/0/20303/8a812fb6-150a-92f7-107c-eacd9e774875.png)

* 認証後

![image](https://qiita-image-store.s3.amazonaws.com/0/20303/78293134-c07e-2ae5-4cd9-2f294344e782.png)

#### Automated Build
* refs: http://qiita.com/jagaximo/items/4cbda778a10fd37f68e6
* 連携開始。 `Automated Build` を選択する

![image](https://qiita-image-store.s3.amazonaws.com/0/20303/adc1e25a-3fca-d524-2400-ae6196ec67b1.png)

* 画面遷移しつつ、 __用意したGitHubのリポジトリ__ を参照させる
 * とくに迷わない

#### 連携結果
![image](https://qiita-image-store.s3.amazonaws.com/0/20303/390e57e9-ee1e-f208-6fd2-81cf67b1e6db.png)

---

## GitHubへPushするとDockerHubへBuildが走ることを確認する
* 今回のポイント

### 更新してみる
* refs: http://qiita.com/mykysyk@github/items/7553e8fef2948de10844
 * Monitをいれてみよう
* Dockerfileをいじって `Monit+sshd` 環境を用意
 * Monitは2812ポートでweb閲覧できる設定にしているので以下

```
% docker build -t ubuntu:monit .
% docker run -dt -p 10000:22 -p 2812:2812 ubuntu:monit
% VBoxManage controlvm "boot2docker-vm" natpf1 "monit_contaner,tcp,127.0.0.1,2812,,2812"
```

* 上記コマンドで `http://127.0.0.1;2812` を確認できる

![image](https://qiita-image-store.s3.amazonaws.com/0/20303/c03da6cf-914b-9dc1-06ed-4b20c0fe2fed.png)

### DockerHubの更新確認
* 自身の `GitHub` のリポジトリへ `git push origin master` する
* すると、`DockerHub` でBuildが走る（連携したので）
* https://registry.hub.docker.com/u/ume3/docker-ubuntu-monit-log/builds_history/94617/
 * `Build Histroy` の履歴はそのまま、GitHubのCommitログと同様ということ

これで、連携更新が可能となった。

### UbuntuでFluetnd
* おまけのように
* 公式のとおり：http://docs.fluentd.org/ja/articles/install-by-deb
 * `Dockerfile` に記載してげればよい
* moduleいれるときも以下とかで
 * `RUN /usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-twitter`
* こうなってくるとDockerfile以外のファイル管理をしたくなるのでGithub連携がいきてくる

---

## DockerHubから自作のDockerイメージを使う
* このイメージを `pull` すれば、どの `Docker環境` でも使える
 * 別の環境で起動してみよう

### AWS(Ubuntu) + Docker + DockerHubイメージ
* AWSで適当に作成（ざっくり省略）
* 今だとVPCでしか作成できない（クラシックモードじゃないなら）
 * 気にせず、 `t2.micro` あたりでも使う(VPC限定だが）
 * `ec2-user` じゃなくて `ubuntu`なのは注意

![image](https://qiita-image-store.s3.amazonaws.com/0/20303/eda7c67d-a1b7-1abe-8a89-4326db24d445.png)


#### Ubuntu + docker
* 公式より：https://docs.docker.com/installation/ubuntulinux/
* このとおりやれば動く動く
 * 今回は、 `Ubuntu Trusty 14.04 (LTS) (64-bit)`にした。

### Docker起動後、DockerHubへアクセス
* refs: http://qiita.com/zembutsu/items/b0fbb1ca1a759eff31e4
 * DockerHubのログイン情報をコンソールでたたく
* ログイン

```
ubuntu@ip-172-30-0-10:~$ sudo docker login
Username: ume3
Password: ******
Email: <mail@mail.com>
Login Succeeded
```

#### 自作イメージをpullする
* ポイント
 * これがやりたいこと `docker pull <自作イメージ>`

```shell-session
ubuntu@ip-172-30-0-10:~$ sudo docker pull ume3/docker-ubuntu-monit-log
Pulling repository ume3/docker-ubuntu-monit-log
dab621726aea: Pulling dependent layers
511136ea3c5a: Download complete
01bf15a18638: Download complete
30541f8f3062: Download complete

---snip

194a6d0fae98: Download complete
Status: Downloaded newer image for ume3/docker-ubuntu-monit-log:latest
```

### 確認と起動
```sh
## イメージ確認
ubuntu@ip-172-30-0-10:~$ sudo docker images | grep docker-ubuntu-monit-log
ume3/docker-ubuntu-monit-log   latest              dab621726aea        16 minutes ago      257 MB
## 起動
ubuntu@ip-172-30-0-10:~$ sudo docker run -dt ume3/docker-ubuntu-monit-log
ce36f0cf42c7e31b4864da3f862e0937711e27bba697579b144b3146005c7be6

## 起動確認
ubuntu@ip-172-30-0-10:~$ sudo docker ps
CONTAINER ID        IMAGE                                 COMMAND                CREATED             STATUS              PORTS               NAMES
ce36f0cf42c7        ume3/docker-ubuntu-monit-log:latest   "/bin/sh -c '/usr/bi   27 seconds ago      Up 27 seconds       22/tcp, 2812/tcp    sick_mccarthy
```

```sh
# コンテナのipを知りたいなら以下
ubuntu@ip-172-30-0-10:~$ sudo sh -c 'docker inspect --format="{{ .NetworkSettings.IPAddress }}" `docker ps -q`'
172.17.0.82

## SSH OK
ubuntu@ip-172-30-0-10:~$ ssh docker@172.17.0.82
The authenticity of host '172.17.0.82 (172.17.0.82)' can't be established.
ECDSA key fingerprint is 6a:aa:ad:15:21:f2:0b:b8:1a:95:0a:5d:6c:71:a6:b4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.82' (ECDSA) to the list of known hosts.
docker@172.17.0.82's password:
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.2.0-54-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
---snip
```

* ログイン後、起動確認すれば無事にたちあがっている。あとはよしなに。

```sh
$ bash
docker@f255f6f58ca6:~$ sudo netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:24224           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:24230         0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:2812            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
```


---


### 参考情報
* 説明途中に参照すべき情報はのせましたが、多くのかたの情報でささえられました。
* アウトプット万歳