Azure 界隈で Docker をはじめる勉強会資料

## はじめに

このドキュメントは Azure を学ぶエンジニアが WebApp on Linux をはじめとするコンテナ系サービスを扱う前に、まずは Docker を学ぶための勉強会資料です
スライドモードに最適化しています

---
## 本題の前に
- 手元のPCがBIOSなどの関係で Docker 動かせない人  
以下のコマンドで Azure 上に CoreOS 立てましょう  
(とはいえ azure-cli の Docker イメージ動かせないので誰かに立ててもらうのが吉)

```
az login

az group create (groupname)
az vm create --name node-1 --resource-group (groupname) --admin-username core --admin-password (password) --image CoreOS:CoreOS:Stable:latest --authentication-type password
```
参考: [CoreOS - Microsoft Azure](https://coreos.com/os/docs/latest/booting-on-azure.html)

---

## なぜ Docker なのか
- Infrastructure as a Code の体現
- プログラマの守備範囲拡大に伴う開発と本番の環境統一化
- 巨人やOSS界隈で整備されつつある環境  
WebApp on Linux もコレ

それぞれのトピックを参加者間で話しましょう
あとはさんざん語られてるので各自調べましょう

---

## はじめる
### 用意されている Dockerfile で docker build, docker run する
- [Azure のビルトインイメージ](https://github.com/Azure-App-Service/) で公開されているものをダウンロードし、`docker build` および `docker run` します
- ruby, php, node, dotnetcore のうちどれかで試しましょう

---

## ここからハンズオン or 演習

---

### Dockerfile を書く
- 今回は Ruby を取り上げます
- みんな大好き? Redmine を動かしましょう
- [Redmine](https://hub.docker.com/_/redmine/) をベースに、 Azureポータルで SSH できるようにカスタマイズします
  - [カスタム Docker イメージでの SSH サポート](https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-linux-ssh-support)
  - [Dockerfile リファレンス](http://docs.docker.jp/engine/reference/builder.html)
- 作成したリポジトリは [GitHub のリポジトリを用意](https://github.com/new) して公開します

---

### Docker Hub でビルドと公開
- GitHub で公開したリポジトリを Docker Hub でビルドします  
Automated Build は GitHub の変更検知してリビルドするので便利です
<img width="521" alt="docker-hub-create.png" src="https://qiita-image-store.s3.amazonaws.com/0/22059/28aa5557-0448-2eb1-3769-73f195ba017f.png">

---

### Azure
#### Webapp on Linux 
- [作成](https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-linux-how-to-create-web-app)
- [MySQL に接続するための環境変数を設定](https://github.com/docker-library/docs/tree/master/redmine#environment-variables)

#### Azure Database for MySQL
- [作成](https://docs.microsoft.com/ja-jp/azure/mysql/quickstart-create-mysql-server-database-using-azure-portal)
- [ファイヤーウォール規則を設定](https://docs.microsoft.com/ja-jp/azure/mysql/howto-manage-firewall-using-portal)
  - Webapp のグローバルIPは WebApp の「プロパティ」「送信 IP アドレス」で確認
- redmine 用のスキーマは手元から `mysql` クライアントで作成しましょう

---

### ヒント
#### Docker file
- `FROM` 句でベースとなる Docker イメージを指定します
- Windows 環境で`.sh`を書く場合は改行コードが LF になっていることを確認します

#### Webapp on Linux 
- Redmine のイメージでは、Rails の `db:migrate` をコンテナ実行時にキックしています  
コンテナ内の `/usr/src/redmine/log/production.log` で
`ActiveRecord::StatementInvalid (Mysql2::Error: Table 'redmine.settings' doesn't exist` が出て動かないときはローカルから以下で回避

```
docker pull (docker_repository)
docker run -it (docker_repository) bash
# ここから docker コンテナ内
cd /usr/src/redmine
env REDMINE_DB_MYSQL=(mysql_db_name).mysql.database.azure.com REDMINE_DB_USERNAME=(mysql_username)@(mysql_db_name) REDMINE_DB_PASSWORD=(mysql_password) rake db:migrate
```

#### Database for MySQL
- SSL 接続の強制は DockerHub の redmine イメージからそれなりに変更が必要なので、暫定的に切っておくことをオススメします  
(もちろんプロダクションはSSL使いましょう)

---

### 実装例
- [GitHubリポジトリ](https://github.com/kheiakiyama/appservice-redmine)
- [DockerHubリポジトリ](https://hub.docker.com/r/kheiakiyama/appservice-redmine/)
- Webapp on Linux のアプリケーション設定

```
REDMINE_DB_MYSQL=(mysql_db_name).mysql.database.azure.com
REDMINE_DB_USERNAME=(mysql_username)@(mysql_db_name)
REDMINE_DB_PASSWORD=(mysql_password)
```

---

## 以上