Slide 1

Slide 1 text

Docker 入門ハンズオン Tomoya Tabuchi June 16, 2018

Slide 2

Slide 2 text

はじめに

Slide 3

Slide 3 text

自己紹介 • 田渕 智也 • 所属: 同志社大学 理工学部 B4 • Twitter など: @tomoyat1 • CAMPHOR- 運営 • HOUSE には月曜日・土曜日によく出没します • Golang 書いたり,インフラの面倒見 (るのに失敗し) たり,院試の勉強したり…

Slide 4

Slide 4 text

今日のお話 • Docker の紹介 • 背景 • Docker の概要 • ハンズオン • Dockerfile の作成 • Dockerfile を使ったイメージを作成 • レジストリへのアップロード • Docker 化したアプリケーションをサーバーにデプロイ • 発展

Slide 5

Slide 5 text

Docker の概要

Slide 6

Slide 6 text

背景: 運用の辛さ (みなさんもありませんか?) • 複数のアプリケーションを動かしたいとする • マシンを複数に分けると… • 資源もったいない • 複数のマシンのメンテが辛い • 1 マシンに複数アプリケーションを混在させると… • アプリケーション A と B で異なるバージョンのライブラリ foo を要求する • A のバグで B の重要なファイルを破壊してしまった! -> 障害発生 • 環境構築が手動で辛い • OS インストールして,ライブラリインストールして…

Slide 7

Slide 7 text

背景: コンテナ仮想化 (OS レベル仮想化) • 隔離したいが,仮想マシンを含めマシンを分けるのは無駄が多い • プロセスが見える範囲を制約すれば,別マシンで動いているも同然 • 他のプロセスは見えない (存在しないように見える) • 指定された場所以外のファイルは見えない (同上) • ユーザやネットワークスタックも指定のもの以外は見えない (同上) • この隔離の単位を「コンテナ」という • この用語が登場したのは Docker の登場とほぼ同時 • 実は 80 年代からあった • しかし,普及していなかった

Slide 8

Slide 8 text

コンテナ仮想化の図

Slide 9

Slide 9 text

ハードウェア仮想化の図

Slide 10

Slide 10 text

背景: Infrastructure as Code • 環境構築を自動化するツールの流行 (2010 年代初頭) • Ansible (2012) • マシンが対象 • マシンを操作する手順を記述して初期化する • べき等性 • マシンの用途を変えるときは…?

Slide 11

Slide 11 text

背景: 組み合わせたら良くない? • コンテナ仮想化だけでは環境構築の問題が残る • Infrastructure as Code だけだとマシンが別なので無駄が多い • コンテナを Infrastructure as Code の手法で初期化し,実行すれば…

Slide 12

Slide 12 text

Docker • 主に Linux で動くコンテナ仮想化基盤 • コンテナの初期化と実行を管理する • Docker イメージを元に • コンテナ内環境を初期化 • コンテナを起動する • Docker コンテナはコンテナ仮想化により • 1 つのマシンに同居して実行される • 互いに隔離される • 2013 年,経営が傾いていた dotCloud という PaaS の会社が社内で使っていたツール • オープンソース化し,大ヒットし,社名も Docker に変えた

Slide 13

Slide 13 text

Docker の功績 (推しポイント) • 環境を含んだ実行ファイルの形式を定義したのが最大の功績 • 開発者は Docker イメージを作成 (Dockerfile の記述) • 運用者は Docker イメージを実行 (ビルド済みイメージを取得・実行) • 環境にもソースコードと実行ファイルの関係性を導入 • 実行可能なアプリケーションを配布するデファクトスタンダード化 • サーバで動かすソフトウェア以外にも応用例あり

Slide 14

Slide 14 text

Docker イメージ (1) • コンテナの初期化方法・起動方法が定義されたデータ形式 • 環境を持った実行ファイル,という気持ち • 「イメージを実行する」: イメージを元に 1 つのコンテナを初期化・起動する • 空のディレクトリにイメージの内容物を展開 • その中で実行ファイルを実行 • nginx:1.15.0-alpine のように名前とタグ (バージョン) で一意に特定

Slide 15

Slide 15 text

Docker イメージ (2) • イメージは層状になっている • 最下層は空のフォルダ • Dockerfile に記述された手順に沿って層を重ね,作成される • Dockerfile の 1 行はイメージの 1 層になる • 多くの場合は,既存のイメージに自分の層を重ねることで作る • Docker レジストリと呼ばれる場所にイメージは公開され,共有される • プライベートなレジストリも可 • Docker Hub など

Slide 16

Slide 16 text

Docker コンテナ • Docker における隔離の単位 (コンテナ仮想化による) • イメージが実行ファイルなら,コンテナはプロセス • 1 コンテナにつき基本は 1 プロセス • Docker イメージにより初期化された環境を持つ • Docker イメージで指定された実行ファイルから内部にプロセスが起動される • イメージ実行時に指定することもできる

Slide 17

Slide 17 text

Docker ネットワーク • コンテナの仮想 NIC がつながっているネットワーク • ネットワーク上のコンテナは,その名前が IP アドレスに名前解決される • 同一ネットワークにないコンテナは見えない • 作成・指定しなければ default ネットワークが使用される

Slide 18

Slide 18 text

ハンズオン

Slide 19

Slide 19 text

おしながき • Dockerfile の作成 • Dockerfile を使ったイメージを作成 • レジストリへのアップロード • Docker 化したアプリケーションをサーバーにデプロイ

Slide 20

Slide 20 text

今回の題材 • github.com/tomoyat1/yet-another-todo-app • 機能を省略した Todo アプリの API サーバー • Golang 製 • PostgreSQL にデータを保存 • デプロイするもの (全部 Docker で) • アプリケーションそのもの • PostgreSQL • Nginx

Slide 21

Slide 21 text

Dockerfile の作成 • git clone https://github.com/tomoyat1/yet-another-todo-app • 中に入って,既存の Dockerfile の名前を変更 • 新しく空の Dockerfile を作成 • 完成品が解説つきで Gist にあるので,見ながら Dockerfile を書いてみてくだ さい • 終わった方は SSH 鍵をいただきたいので声をかけてください • それも終わった方は Docker Hub (hub.docker.com) のアカウントを作ってください (な い人)

Slide 22

Slide 22 text

Dockerfile の解説 • Gist を見ながら解説する • Dockerfile Reference に Dockerfile の全命令がまとめてある • 次はイメージの作成とアップロード

Slide 23

Slide 23 text

イメージの作成 docker build -t /yet-another-todo-app:latest ./ docker push <さっき-t で指定したタグ> • -t のところでタグを指定 (ここでのタグはイメージ名も含む) • は Docker Hub のユーザー名 (持っている人) にしてください • Docker Hub じゃない場合は,URL の全部を指定する • 例: gcr.io/tomoyat1-183706 • 次はデプロイ

Slide 24

Slide 24 text

サーバへの接続 • お伝えしたユーザ名・IP アドレスで各自 SSH 接続してください • まだ SSH 鍵を預かっていない方は今預かります • 先程の Gist にこの後実行するコマンドを.sh にまとめています • 余談: 今回の環境構築は GCP と Terraform で完全自動で行っています • 興味のある方は後でお話しましょう :)

Slide 25

Slide 25 text

サーバに Docker をインストールする • docker ubuntu install で検索 • 公式ドキュメントに沿ってインストール • 注: パッケージ名は docker.io (変わったけどドキュメントに反映されてない) • usermod -a -G docker <ユーザ名> • sudo なしで docker コマンドを使うため • これをやったら一度 SSH を切ってつなぎ直す

Slide 26

Slide 26 text

Docker ネットワークの作成 $ docker network create todo_network • コンテナが繋がるネットワークを作成 • コンテナ作成時にこれを指定

Slide 27

Slide 27 text

PostgreSQL の起動 (1) $ mkdir $HOME/postgres-data $ docker run -d \ -e POSTGRES_PASSWORD=passwd \ -v ${PWD}/sql:/docker-entrypoint-initdb.d \ -v $HOME/postgres-data:/var/lib/postgresql/data \ --name pg \ --network todo_network \ postgres:10.4 • -v: ボリューム.ホストのディレクトリをコンテナ内にマウント • DB の初期化に使うファイル • DB のデータファイルそのもの • -e: コンテナ内の環境変数の指定

Slide 28

Slide 28 text

確認 • docker ps で実行中のコンテナ一覧を表示 • docker logs pg で PostgreSQL のログを確認

Slide 29

Slide 29 text

todo の起動 $ docker run -d \ -e TODO_DB_USER=postgres \ -e TODO_DB_PASSWD=passwd \ -e TODO_DB_HOST=pg \ -e TODO_DB_PORT=5432 \ -e TODO_DB_NAME=todo \ --name todo \ --network todo_network \ tomoyat1/yet-another-todo-app:latest • 環境変数がいっぱい

Slide 30

Slide 30 text

Nginx の起動 $ docker run -d \ -v $HOME/default.conf:/etc/nginx/conf.d/default.conf \ -p 80:80 \ --name nginx \ --network todo_network \ nginx:latest • -p: コンテナのポートとホストのポートを対応付け • ホストの:80 への接続が,コンテナの:80 にフォワードされる

Slide 31

Slide 31 text

起動した? • ローカル環境で… $ ./test_client create $ ./test_client list • ちゃんと JSON が返ってきたら大成功

Slide 32

Slide 32 text

Cleanup docker stop pg todo nginx docker rm pg todo nginx • コンテナの停止と削除 • PostgreSQL のデータはボリュームに入れたから消えない :) • docker コマンドについては docker help の出力を見るとよさそう

Slide 33

Slide 33 text

発展

Slide 34

Slide 34 text

docker-compose • 複数のコンテナをまとめて取り扱うツール • 今回なら todo・postgres・nginx で 1 まとめに • ネットワークやボリュームの作成もやってくれる • ソースのレポジトリにある docker-compose.yaml を参照 (前で実演)

Slide 35

Slide 35 text

継続的インテグレーション・継続的デリバリー (CI・CD) • テストの結果次第で,イメージをビルド (CI) • イメージがレジストリに上がったら自動でデプロイ (CD) • デプロイが楽になるとものを作る機運が高まる

Slide 36

Slide 36 text

オーケストレーション • 複数のマシンでコンテナを動かす • どのコンテナをどのマシンで動かすか • コンテナの数を増減させる • コンテナが異常終了したら再度立ち上げる • Kubernetes・Mesos・Docker Swarm…

Slide 37

Slide 37 text

まとめ • Docker 登場の背景 • 運用のつらみ • Docker の概要 • イメージ: 環境を持った実行ファイル • コンテナ: 隔離の単位であり,実行の単位 • ネットワーク: コンテナがつながるネットワーク • ハンズオン • API サーバーは無事動きましたか?

Slide 38

Slide 38 text

最後に • Docker は現状,モダンな運用の基礎となる技術 • 今日ご紹介したもの以外に,まだまだ応用はあります • 皆さんの運用が楽になれば幸いです

Slide 39

Slide 39 text

ご清聴ありがとうございました • ご質問・疑問・発展的な話題などなんでもお気軽にどうぞ • 今後のイベントのテーマの要望等,もしあればどうぞ