Dockerイメージ作成 for Java EE Application Server (WildFly)

# この記事について 2017.06.22
この記事を書いた当初(2016.04.18)は流行りのDockerにまずは入門せねばという気持ちで書いただけです。
2017.06.22 現在、「まず参考にすべきではない」と言うことができます。

* Dockerfileなどを定義してコンテナイメージを作ってない(コード化してない)
* Docker for Mac の登場により、docker-machine を作る必要が無くなってる。(ケースバイケースですが本記事の目標を達成する上では不要かと。)

# 目標
* Dockerの基本操作について理解・把握する
* WildFly用 の Dockerイメージを作成する ※Dockerfileでイメージをビルドするわけではなく、手動構築なので、Dockerfile化はご自身でどうぞ

# 前提条件
* 一から構築しなくても、DockerHubでJBossが公開してるイメージをpullしてくれば終わりじゃんとか言わない
* 実行環境：OS X El Capitan
* インストールするソフト
 * Docker
 * VirtualBox -> 仮想OS(VM)実行/VMをDockerホストとして利用

# やること一覧
* VM構築
* Dockerイメージを作成
 * JDKインストール
 * WildFlyインストール

# 概念を理解しとく
http://www.slideshare.net/TrisM/docker-41045742
**Docker Lifecycle**
![alt](http://image.slidesharecdn.com/docker-141103054932-conversion-gate02/95/introduction-to-docker-what-is-it-and-how-is-it-compared-to-vms-22-638.jpg?cb=1414994093)

# 構築
## VM構築
### "dev" という名前で VirtualBox の VM (docker-machine) 構築
* VirtualBox以外も AWSのEC2, MSのAzure, VMWareのvSphere等、標準で多数用意されてる。(https://github.com/docker/machine/tree/master/drivers)
* "boot2docker コマンド" は現在、非推奨。"docker-machine コマンド" を利用
* VMのOSは "boot2docker" (24MB程度の 軽量 Linux ディストリビューション) になるらしい。 なんとも、ややこしい。

```bash
$ docker-machine create --driver virtualbox dev
Running pre-create checks...
Creating machine...
(dev) Copying /Users/YOURNAME/.docker/machine/cache/boot2docker.iso to /Users/YOURNAME/.docker/machine/machines/dev/boot2docker.iso...
(dev) Creating VirtualBox VM...
(dev) Creating SSH key...
(dev) Starting the VM...
(dev) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env dev
```

### 構築したVM (docker-machine) を確認
```bash
$ docker-machine ls
NAME   ACTIVE   URL          STATE     URL                         SWARM   DOCKER    ERRORS
dev    -        virtualbox   Running   tcp://192.168.99.101:2376           v1.11.0
```

## devの環境変数を確認/設定
* 環境変数を設定しておくことで OSXから、 docker コマンドで docker-machine (VM) の操作が可能

```bash
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/Users/YOURNAME/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell:
# eval $(docker-machine env dev)

# 環境変数の設定方法は言われた通りの方法で設定
$ eval $(docker-machine env dev)

# 設定されているか確認しておく
$ env |grep DOCKER
DOCKER_HOST=tcp://192.168.99.101:2376
DOCKER_MACHINE_NAME=dev
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/Users/YOURNAME/.docker/machine/machines/dev
```

## CentOSのDockerイメージ取得/起動
```bash
# 最新版のDockerイメージ取得。
# バージョンを指定する場合は docker pull centos:VERSION
$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a3ed95caeb02: Pull complete
5989106db7fb: Pull complete
Digest: sha256:1b9adf413b3ab95ce430c2039954bb0db0c8e2672c48182f2c5b3d30373d5b71
Status: Downloaded newer image for centos:latest

# 持ってるイメージ一覧表示
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              sha256:778a5        2 weeks ago         196.7 MB

# イメージから "jee" というホスト名,コンテナ名で 起動(バックグラウンド)で起動
## -h     : ホスト名指定オプション
## -d     : コンテナをバックグラウンド起動オプション
## --name : コンテナ名指定オプション
$ docker run -h jee -itd --name jee centos /bin/bash

# 起動したコンテナプロセス表示
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
450a788cbf03        centos              "/bin/bash"         7 minutes ago       Up 3 minutes                            jee

# 起動したコンテナに接続  ※ docker attach だと、exitした時にdockerプロセスが落ちる
docker exec -it jee /bin/bash
```

## 適当に yum で 起動したコンテナ に必要なモノをインストールしていく
```bash
# jee コンテナ に JDK をインストール
[root@jee]# yum install java-1.8.0-openjdk-devel.x86_64
# jee コンテナ に WildFly をインストール
[root@jee]# wget -p /tmp/ http://download.jboss.org/wildfly/10.0.0.Final/wildfly-10.0.0.Final.tar.gz
[root@jee]# tar zxvf /tmp/wildfly-10.0.0.Final.tar.gz -C /opt
[root@jee]# useradd -s /sbin/nologin wildfly
# その他、やっておきたいことがあれば。
```

## コンテナイメージの保存
```bash
$ docker commit jee jee/wildfly:1.0
```

## 構築したコンテナの起動
* docker run で
* 8080と9990のポートフォワード設定をして、DockerでWildFlyのプロセスを起動
* dockerプロセスを終了したら、イメージを破棄する場合は --rm オプションつける

```bash
docker run --rm -p 8080:8080 -p 9990:9990 -it jee/wildfly:1.0 /opt/wildfly/bin/standalone.sh -c standalone-full.xml -b 0.0.0.0 -bmanagement 0.0.0.0
```

## VM (docker-machine)のポートフォワーディング設定
* VirtualBox で docker-machine の 8080, 99990 へのポートフォワーディング設定 をする
 * https://www.google.co.jp/search?&q=virtualbox+ポートフォワーディング