【イベントレポート】Docker×さくらのクラウド～開発環境構築ハンズオン

みなさんこんにちは！
今回は、6/22(土)に開催されたOthloTechイベントのレポートを書きたいと思います。参加できなかった人にもDockerについて少しでも理解していただけることを本稿の目標としたいと思います。

とはいえ、イベント中に取ったメモを参考に本稿を作成しておりますので、間違った情報・分かりにくい表現等ございましたらご意見いただけますと幸いです。

※イベントの詳細については[こちら](https://othlotech.connpass.com/event/133175/)をご覧ください。

## OthloTechについて
OthloTechは東海圏の学生エンジニア/デザイナー界隈のコミュニケーションの活性化やスキルアップを目標に、月2回のペースで勉強会「OthloEvent」を開催している学生団体です。

毎年10月には[OthloHack](https://nagoyastartupnews.jp/hackathon-othlohack2018/)という非常に大きなハッカソンイベントも開催しています。
私自身も去年参加しましたが、東京や大阪など全国各地から噂を聞きつけ参加する学生も多く、自分の実力を試したり全国にエンジニア友達を広げるのにはうってつけの場だと思います！
また、スポンサー企業の多さも特徴の1つだと思います。人気Web系企業さんのエンジニアの方がメンターについたり、アウトプットへの評価をして下さいます！

エンジニア/デザイナーを目指す学生クリエイターのみなさんには是非利用していただきたいコミュニティですので、一度HPやconnpassページを覗いてみてください！

HP: https://www.othlo.tech/
OthloHackイベントレポート: https://nagoyastartupnews.jp/hackathon-othlohack2018/
connpass: https://othlotech.connpass.com/

## 本イベントのサポート企業と講師の方について
本イベントはさくらインターネットさんのご協力の元イベントが開催されました。今回のイベント用に、無料でさくらのクラウドをご用意いただいたりと、ものすごく太っ腹なご対応をいただきました。

講師情報: さくらインターネット株式会社 テクノロジー・エバンジェリスト 前佛 雅人さん(Twitter:@zembutsu)

---

## コンテナ技術とは？
### コンテナ技術を使用しない場合
* コンピュータの基本システム(CPU,メモリ,記憶装置)に依存する
    * OSの領域でファイルを定義
    * Linuxカーネル場でプロセスが走る

### コンテナを使った場合
**✨それぞれのプロセスを隔離できる**

- セットアップ・・・Dockerイメージ
- プロセス管理・・・Dockerコンテナ
- 名前空間を利用してisolate(分離)

### 仮想化とコンテナ化は異なる
* 仮想化はコンピュータ資源の中に仮想的に拡張できる
* コンテナ化はただ隔離するだけ

### コンテナ技術概論
* コンテナ・・・Dockerイメージの中にあるプログラムをプロセスで走らせる
    * 名前空間のisolate
    * cgroupでリソース制限
* 一つのホスト上にありながら、いくつものバージョンを共存させることができる
* コンテナごとに分離されているので、他のコンテナからは見えなくさせることができる

### コンテナが流行った理由
* クラウドが発達してきた
* ネットにある全てのサービスを止めたくない
    * アップデートが必要
        * バージョンをあげたりするときにもサービスを止めたくない
        * 従来はロードバランサーを使っていた↔︎高価
* 仮想化により横にスケールさせることができるので、多くのトラフィックを捌けるようになった
* これまでは新しいサーバーを立てたりといったコストがかかっていた
* 現存のコンピュータ資源だけでバージョンアップやバージョンダウンを実現できる
* 世界に流行した理由
    * 会社の趣味で使っていた物をGitHubに公開したから
    * オープンソースは素晴らしい

### Dockerとは？
* 上記に挙げたコンテナ技術のうちの1つ
* サーバ・クライアント型モデル
    * Dockerエンジンが立ち上がっていなければ動かすことはできない

## 実践Docker入門
* 上記に挙げたコンテナ技術のうちの1つ
* サーバ・クライアント型モデル
    * Dockerエンジンが立ち上がっていなければ動かすことはできない

![IMG_4464.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/a636803b-5aa7-988d-fe78-f92242ef7e97.jpeg)

### Dockerイメージはイメージレイヤの積み重ね
* プログラムやライブラリとメタ情報（実行するプログラムやポート）といったようにイメージレイヤをいくつも積み重ねられる
    * 変更分だけをサーバ場にコピーしたりすることができる
        * 高速に移動できる
        * 開発を高速化できる
    * イメージレイヤごと他のDockerイメージに派生できる

``` Dockerfile
# イメージレイヤーは1行につき1イメージレイヤーとなる
# image layer1
FROM scratch
# image layer2
ADD rootfs.tar.xz /
# image layer3
CMD ["/bin/sh"]
```

#### Dockerイメージを作るためのコマンド
``` bash
docker image build -t hello:v1 .
```

* v1, v2・・・といったバージョン指定も可能
* [docker-alpine](https://hub.docker.com/_/alpine)もあるよ 

#### DockerイメージをDockerHubから引っ張ってくるコマンド
``` Dockerfile
docker pull [イメージ名]
docker pull hello-world
```

* Dockerイメージ自体はRead-only
    * コンテナを実行するときに追加されるイメージレイヤーは読み書き可能となる
    * Pullしてきたイメージを起点として独自にアレンジしていける
        * 追加されるイメージレイヤーを書き換えても1つのアプリケーションのように振る舞うため

**✨DockerコンテナはDockerイメージを実行する**

![IMG_4465.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/2deded7b-8c4f-4944-b409-8648f9513235.jpeg)

### Dockerfile
**✨Dockerfileにイメージ構築に必要な全ての命令を書く**

* Dockerイメージは読み込み専用のイメージレイヤ郡で構成
* 各イメージレイヤがDockerfileの命令に相当する

[記述例]

``` Dockerfile
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
```

* [Docker BuildKit](https://qiita.com/tsgkdt/items/743a25d4a4d6ccbcf57c)を使う方法もあるよ！！

#### CMDとENTRYPOINTについて
* ENTRYPOINTは必ず実行するコマンド
* CMDは引数がなければ実行するコマンド

## Dockerネットワーク概要
* 標準ネットワークモデル
    * bridge
        *  デフォルト
        *  NAT＋dockerプロキシ
    * host
        * Linux上でサーバを立ち上げた時と同じ挙動
        * 細かい動作制限をかけたい場合に使用
        * ホストとネットワーク共通
    * none
        * 一切疎通しない
* 複数のブリッジ・ネットワークを定義できる
* 内部では、コンテナ名でIPアドレスを名前解決できる

## Dockerボリューム概要
* コンテナはボリュームと呼ばれる領域（ディレクトリ、ファイル）をマウントできる
    * それ以外からはコンテナ同士でアクセスできない
* 読み書きを頻繁に行うものはボリュームの中に入れるのが一般的
* 外付けハードディスクのような立ち位置
* 3分類
    * ホストをマウント
        * ホストの中の時刻とコンテナの中の時間が一致
    * 名前付き
    * 名前なし