Docker for Mac 試した

# Docker 
MacOSとWindowsのネイティブ仮想化を用いたDocker純正ツール「Docker for Mac/Windows」登場、VirtualBoxは不要に
http://www.publickey1.jp/blog/16/docker_for_macwindows.html

上記の記事を見かけ、早速β版使ってみました。ちなみに、面倒なので、画面キャプチャしてません、すいませんすいません。


https://beta.docker.com/
なんかよくわからないままに、DockerIDを作成し、申し込むと、Docker Teamさんからメールが送られてきて、ちょっと待てと言われ、その後、Docker Toolboxをダウンロードできるメールがきた。

##Docker Toolbox
送られたメールをちゃんと読めって話なのですが、このToolboxには、クライアントソフト、Docker−machine、Docker−compose、Kitematic（Docker Hubさん用アプリ？）、VirtualBox
ということで、しっかりVirtualBoxは含まれています。上記の記事タイトルで全くネイティブで動作すると思い込んでしまいました。

### ダウンロード
これは単にpkgファイルです。これを解凍すると、２つのアプリが登録されます。
その一つが「Docker Quickstart Terminal」です。今までのように、VitualBoxを入れ、Boot2Dockerを入れ、、という手順をすっ飛ばして、docker動作環境が作れてしまうものです。（たぶん）
以前入れていたVitualBox、Boot2Dockerがあったので、何も入っていない端末に入れた場合、どうなのかはちょっとわかりません。

### 起動：Docker Quickstart Terminal
macのLaunchPadから該当アイコンをタップすると、コンソールが起動しはじめ、しばし待つと、例のクジラがでてきます。
もともとコンソールを起動していると、一番フォアグラウンドにあるコンソールと同じディレクトリにDocker環境が整備されたコンソールが表示されるようです。

sudoは不要で、docker ps、docker imeagesなどは実行できますが、他のターミナルからは実行できません。

```bash
bash --login /Applications/Docker/Docker Quickstart Terminal.app/Contents/Resources/Scripts/start.sh
```

このようなコマンドで起動されているので、詳細はstart.shを見るとわかるでしょう。

### centosを入れる
centosからリポジトリを検索すると、最近はdocker.io/centos:centos7のような名前で登録されているようだけれど、searchした結果、単にcentos:7という感じで登録されていました。見に行くところが違うのか深くは見ていません。

```bash
docker pull centos:7
```
で簡単に持ってきて、もともと作っていたDockerfileをビルドして実行するとあっけないほどスムーズ。
ただ、内容自体はDocker内でWebサーバを動かすものなので、どうやって外からここにアクセスするかでちょっと手間取った。
もともとVirtualBoxを利用してうまく環境を整えている人は問題ない部分だと思います。
逆に、dockerが動作する環境が本当に簡単に作れるようになった感じです。

#紆余曲折
まぁ、VitualBoxで動作しているとわかれば、色々とやったことは雑音にしかならないので、とりあえずスキップw

#目標
- 構成は以下のようなイメージになります。

iPhoneなどのスマホー＞macー＞nginxー＞docker内のサーバ


##VirtualBox設定
外からアクセスするには、VirtualBoxの設定で、ポートフォワーディングを設定する必要があります。

今回のToolBoxではdefaultという名前のBoxが作成されるので、そのBoxのネットワーク設定をいじることになります。
Boxを選択して、設定ー＞ネットワークー＞ポートフォワーディング
具体的な操作方法は以下のようなページをご覧ください。
http://blog.pg1x.com/entry/2014/06/20/234518

ホスト側（MacOS）の待ち受けポートとBox側の待ち受けポートを紐づける設定となります。nginx−＞Boxの部分に該当する。

ホストIPは特に入力しなくてもOK
ホストポートは8080、これはとりあえずなんでも良い
ゲストIP：192.168.99.100
ゲストポート：80

ここのゲストIPはboxが持つIPになります。以下のファイルに設定されていますが、このファイルを書き換えても変更されるわけではないようです。
~/.docker/machine/machines/default/config.json 

一応修正して、boxの再起動をしていました、ダイナミックに変更されるかは確認していません。

### ためす
ここまできたら、またDocker環境を立ち上げて、ホストOS（mac側）からアクセスできるか確認する。

```bash
docker run -d --privileged --name=testserver -h testserver -p 80:80 -v `pwd`/log:/var/log/httpd imagename
```

上記のような感じでdockerインスタンスを起動
mac側から

```bash
curl http://localhost:8080/
```

で、トップページの内容が返って来ればOK
タイムアウトの場合、ファイアウォールの問題か、docker内でWebサーバが起動できていないか確認しましょう。
今回、こちらでは、docker内部から、mac側に入れているmysqlにアクセスしていたため、mac標準のファイアウォールではなんとも解決できなかったので、切って試しました。

##nginxを入れる

今回はbrewを利用。ちなみに、今回は諸般の事情で80でアクセスしたかったので、root（su）で実行することになります。

```bash
brew install nginx
sudo ln -sfv /usr/local/opt/nginx/homebrew.mxcl.nginx.plist  /Library/LaunchAgents
sudo launchctl load /Library/LaunchAgents/homebrew.mxcl.nginx.plist 
# 以下のような感じで設定ファイルを編集
vi /usr/local/etc/nginx/nginx.conf

http{ server {

# for reverse proxy
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;

location /v1 {
  proxy_pass http://v1;
}
}
upstream v1 {
  least_conn;
  server 192.168.99.1:8080 max_fails=10 fail_timeout=30s;
}
}

# 以下のコマンドでsyntaxチェックをすると幸せになれます。
sudo nginx -t -c /usr/local/etc/nginx/nginx.conf
```

###試す
```bash
# nginxを起動
sudo launchctl start  homebrew.mxcl.nginx

# アクセス
curl http://localhost/v1/
```

これでdocker内のWebサーバにアクセスできればOKです。
あとは、iPhoneとかスマホから、mac側のIPに対してアクセスすれば、サーバがなくても動作確認が進められると言う環境ができました。

※ ちなみに、iOSは9からApp Transport Securityが追加されたので、この環境の時にはATS設定を無効にするなどして試す必要がります。この環境でオレオレ証明書を作るのも面倒ですしね。。エロい人はきっと自分ように無料ssl証明書とか用意するのでしょう、きっと :laughing: