【Azure】Dockerからkubernetesまで実践入門（ハンズオン） に参加してきました

# 参加イベント
- Azure Antenna：[https://azure.connpass.com/event/77515/](https://azure.connpass.com/event/77515/) 

# 参加目的
- Docker, kubernetes について興味はあったが、触ったことはあまりなかった
- コンテナを扱う第一歩を踏み出すために参加
- できれば、今後コンテナというものをうまく使っていきたいと思っている

# イベント概要
### 当日の流れ
前半：コンテナの概要・Docker
後半：kubernetes

説明を聞きながら、都度ハンズオンでやってみるとういう流れでした。

### 資料
公開されてますので、詳しくは[こちら](https://speakerdeck.com/shin5ok/azure-antenna-aksdekontenaapuri-dockerkarakubernetesmadeshi-jian-ru-men)をご参照ください。
 
# ハンズオン内容（知識的なところを抜粋）
### コンテナの概要
- コンテナはアプリケーションを動かす小さな基盤、仮想化ではない
- centos とか ubuntu 環境のコンテナを動かしたとしても、実際動かすのは、ホストの kernel
- コンテナの ps 1 が initプロセス。ホストからみると全く違う pid で動いてる
- １コンテナ、１種類のプロセスだけ動作させるべき

##### メリット
1. 高いポータブル性
  - 事業継続性の向上
  - ステージング、開発、本番、同じ環境で実施できる（環境差異をなくす）
    <dd>⇒ paas, サーバレス （開発等をとにかく楽に）というのとはちょっと違う</dd> 

1. コンピュータ資源の効率的利用
  - 負荷分散、冗長化までやってくれる (k8s)

1. DevOps 対応しやすい
  - インフラの構成もコード管理できる
  - GitHub と連携の仕組み

1. 簡単に作って、消すことができる手軽さ

##### 主な利用シーン
1. アプリケーションを動作させる
  - アプリケーションサーバ、Webサーバ等
1. ツールなどユーティリティを動作させる
  - azure の CLI ツールも Docker イメージになっていて、 python とか適正なバージョンのものが梱包されている

★ コンテナのデファクトスタンダードが Docker

### Docker

###### docker コマンド
大事なのは /var/run/docker.sock
これに権限があるユーザのみ docker コマンドを実行できる

###### docker インストール
docker.io パッケージ   # docker パッケージとは全く別物なので注意
`$ sudo apt update && sudo apt install docker.io -y`

###### docker イメージの検索
`$ docker search ***`
STARS: いいねみたいな感じの指標
OFFICIAL : / がないのは、開発社が出してるもの

###### :タグ名
タグは管理面でも重要
何もつけなければ、latest が自動補完される

###### ホスト上に Docker コンテナのポートを割り当て
例えば、ホストの 80 を コンテナ内の 80 に bind するとか
このポートの転送は iptables(nat) で実現している

###### 主な docker コマンド
`$ docker run ****`
`$ docker ps`
`$ docker ps -a`
`$ docker images`
`$ docker pull ****`
`$ docker stop [UUID]`

###### docker ライフサイクル
1. build
  - pull / build
  - commit
  - rm / rmi
1. ship
  - push   # レジストリに登録
1. run
  - run / stop / kill

###### docker run
`$ docker run -it *****`
シェル対話型： -it オプション
名前とタグが一致すれば、ローカルにあるときはそのイメージを利用する
イメージがなかったらリモート上からとってくる

###### docker exec
`$ docker exec -it [id] sh`
デーモンとして動いている中にはいれる
debug 等でよく使う

###### 自分用のコンテナ作成
```txt:Dockerfile
  FROM alphine
  MAINTENER なくてもいい
  RUN コマンド  ex) apt install python2 apache2
  CMD ["command"] # メインプロセス docker 起動時の最後のコマンド
    ex) CMD [ "httpd -DFOREGROUND" ]

```
`$ docker build -t myapache2 ./`
同じ作業するときはキャッシュが使われる
Dockerfile 変更したら build すること

###### 覚えておくべき注意点
- コンテナ内での変更は保存されない [immutable]
  <dd>データベースサーバとしては使うべきではない（コンテナ内への保存はだめ）</dd>
- コンテナとイメージは消さないと残る
  <dd>`$ docker stop`  # docker のプロセスは消える</dd>
  <dd>`$ docker ps -a` でみれるのは、起動してないコンテナが残ってる</dd>
  <dd>停止状態のコンテナは残り続ける。イメージも残り続ける。それぞれ、下記パスに残る</dd> 

```  
    /var/lib/docker/
    /var/lib/docker/image/aufs
```

- コンテナビルド時はキャッシュが使われる
  <dd>意図せず変更が反映されないこともあります</dd>
- ホスト再起動のときは、コンテナは勝手に起動してくれない
  <dd> docker run するときに --restart=always  オプションをつけて実行すればいい
- 出力したいログは標準出力/エラー出力する
  <dd>ログファイルには出さない</dd>
  <dd>メインで実行したいプロセスを foreground で実行して終了させない</dd>
  <dd>コマンドプロンプトが戻ってこない状態にしておく、デーモン化しない</dd>
  <dd>⇒ k8s でもこれを前提に設計されている</dd>
  - 標準出力、標準エラー出力をみるには
    <dd>`$ docker logs -f [uuid]`</dd>

###### alpine linux
コンテナ用に最適化された超軽量linux
パッケージ管理ツールは apk

```
 # apk update
 # apk add
 # apk search
```

ubuntu とかに比べるとサイズが断然小さい
タグを検索したときに -alpine とかついたものは軽量版。alpine ベースになってる

###### Docker の構造
Docker は linux 2.6.32-431 以上で使える
cgroups, namespace, chroot 等を利用

| 読み書き領域 |
|:-:|
| 差分イメージ  |
| 差分イメージ |
| ベースイメージ |

ベースイメージ(ubuntu とか)があって
build することで、差分イメージがいくつも層を重ねて、
run すると、読み書き層をくっつけるという感じ

### kubernetes
また、別ページで書きます。

# 感想
docker, kubernetes の導入として、とてもありがたい機会でした。
内容が盛りだくさんで、少し時間が短かかったなという印象です。
講師の方の説明もわかりやすく、理解しやすかったです。
これから自分で環境をつくって、色々と検証していこうと思います。