Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker Hands On

Docker Hands On

2018-06-16に,CAMPHOR- HOUSEで行った「Docker入門ハンズオン」の資料です.

429b06f96d8c3db704d9fe6a69cfb677?s=128

Tomoya Tabuchi

June 16, 2018
Tweet

Transcript

  1. Docker 入門ハンズオン Tomoya Tabuchi <t@tomoyat1.com> June 16, 2018

  2. はじめに

  3. 自己紹介 • 田渕 智也 <t@tomoyat1.com> • 所属: 同志社大学 理工学部 B4

    • Twitter など: @tomoyat1 • CAMPHOR- 運営 • HOUSE には月曜日・土曜日によく出没します • Golang 書いたり,インフラの面倒見 (るのに失敗し) たり,院試の勉強したり…
  4. 今日のお話 • Docker の紹介 • 背景 • Docker の概要 •

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

  6. 背景: 運用の辛さ (みなさんもありませんか?) • 複数のアプリケーションを動かしたいとする • マシンを複数に分けると… • 資源もったいない •

    複数のマシンのメンテが辛い • 1 マシンに複数アプリケーションを混在させると… • アプリケーション A と B で異なるバージョンのライブラリ foo を要求する • A のバグで B の重要なファイルを破壊してしまった! -> 障害発生 • 環境構築が手動で辛い • OS インストールして,ライブラリインストールして…
  7. 背景: コンテナ仮想化 (OS レベル仮想化) • 隔離したいが,仮想マシンを含めマシンを分けるのは無駄が多い • プロセスが見える範囲を制約すれば,別マシンで動いているも同然 • 他のプロセスは見えない

    (存在しないように見える) • 指定された場所以外のファイルは見えない (同上) • ユーザやネットワークスタックも指定のもの以外は見えない (同上) • この隔離の単位を「コンテナ」という • この用語が登場したのは Docker の登場とほぼ同時 • 実は 80 年代からあった • しかし,普及していなかった
  8. コンテナ仮想化の図

  9. ハードウェア仮想化の図

  10. 背景: Infrastructure as Code • 環境構築を自動化するツールの流行 (2010 年代初頭) • Ansible

    (2012) • マシンが対象 • マシンを操作する手順を記述して初期化する • べき等性 • マシンの用途を変えるときは…?
  11. 背景: 組み合わせたら良くない? • コンテナ仮想化だけでは環境構築の問題が残る • Infrastructure as Code だけだとマシンが別なので無駄が多い •

    コンテナを Infrastructure as Code の手法で初期化し,実行すれば…
  12. Docker • 主に Linux で動くコンテナ仮想化基盤 • コンテナの初期化と実行を管理する • Docker イメージを元に

    • コンテナ内環境を初期化 • コンテナを起動する • Docker コンテナはコンテナ仮想化により • 1 つのマシンに同居して実行される • 互いに隔離される • 2013 年,経営が傾いていた dotCloud という PaaS の会社が社内で使っていたツール • オープンソース化し,大ヒットし,社名も Docker に変えた
  13. Docker の功績 (推しポイント) • 環境を含んだ実行ファイルの形式を定義したのが最大の功績 • 開発者は Docker イメージを作成 (Dockerfile

    の記述) • 運用者は Docker イメージを実行 (ビルド済みイメージを取得・実行) • 環境にもソースコードと実行ファイルの関係性を導入 • 実行可能なアプリケーションを配布するデファクトスタンダード化 • サーバで動かすソフトウェア以外にも応用例あり
  14. Docker イメージ (1) • コンテナの初期化方法・起動方法が定義されたデータ形式 • 環境を持った実行ファイル,という気持ち • 「イメージを実行する」: イメージを元に

    1 つのコンテナを初期化・起動する • 空のディレクトリにイメージの内容物を展開 • その中で実行ファイルを実行 • nginx:1.15.0-alpine のように名前とタグ (バージョン) で一意に特定
  15. Docker イメージ (2) • イメージは層状になっている • 最下層は空のフォルダ • Dockerfile に記述された手順に沿って層を重ね,作成される

    • Dockerfile の 1 行はイメージの 1 層になる • 多くの場合は,既存のイメージに自分の層を重ねることで作る • Docker レジストリと呼ばれる場所にイメージは公開され,共有される • プライベートなレジストリも可 • Docker Hub など
  16. Docker コンテナ • Docker における隔離の単位 (コンテナ仮想化による) • イメージが実行ファイルなら,コンテナはプロセス • 1

    コンテナにつき基本は 1 プロセス • Docker イメージにより初期化された環境を持つ • Docker イメージで指定された実行ファイルから内部にプロセスが起動される • イメージ実行時に指定することもできる
  17. Docker ネットワーク • コンテナの仮想 NIC がつながっているネットワーク • ネットワーク上のコンテナは,その名前が IP アドレスに名前解決される

    • 同一ネットワークにないコンテナは見えない • 作成・指定しなければ default ネットワークが使用される
  18. ハンズオン

  19. おしながき • Dockerfile の作成 • Dockerfile を使ったイメージを作成 • レジストリへのアップロード •

    Docker 化したアプリケーションをサーバーにデプロイ
  20. 今回の題材 • github.com/tomoyat1/yet-another-todo-app • 機能を省略した Todo アプリの API サーバー •

    Golang 製 • PostgreSQL にデータを保存 • デプロイするもの (全部 Docker で) • アプリケーションそのもの • PostgreSQL • Nginx
  21. Dockerfile の作成 • git clone https://github.com/tomoyat1/yet-another-todo-app • 中に入って,既存の Dockerfile の名前を変更

    • 新しく空の Dockerfile を作成 • 完成品が解説つきで Gist にあるので,見ながら Dockerfile を書いてみてくだ さい • 終わった方は SSH 鍵をいただきたいので声をかけてください • それも終わった方は Docker Hub (hub.docker.com) のアカウントを作ってください (な い人)
  22. Dockerfile の解説 • Gist を見ながら解説する • Dockerfile Reference に Dockerfile

    の全命令がまとめてある • 次はイメージの作成とアップロード
  23. イメージの作成 docker build -t <username>/yet-another-todo-app:latest ./ docker push <さっき-t で指定したタグ>

    • -t のところでタグを指定 (ここでのタグはイメージ名も含む) • <username> は Docker Hub のユーザー名 (持っている人) にしてください • Docker Hub じゃない場合は,URL の全部を指定する • 例: gcr.io/tomoyat1-183706 • 次はデプロイ
  24. サーバへの接続 • お伝えしたユーザ名・IP アドレスで各自 SSH 接続してください • まだ SSH 鍵を預かっていない方は今預かります

    • 先程の Gist にこの後実行するコマンドを.sh にまとめています • 余談: 今回の環境構築は GCP と Terraform で完全自動で行っています • 興味のある方は後でお話しましょう :)
  25. サーバに Docker をインストールする • docker ubuntu install で検索 • 公式ドキュメントに沿ってインストール

    • 注: パッケージ名は docker.io (変わったけどドキュメントに反映されてない) • usermod -a -G docker <ユーザ名> • sudo なしで docker コマンドを使うため • これをやったら一度 SSH を切ってつなぎ直す
  26. Docker ネットワークの作成 $ docker network create todo_network • コンテナが繋がるネットワークを作成 •

    コンテナ作成時にこれを指定
  27. 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: コンテナ内の環境変数の指定
  28. 確認 • docker ps で実行中のコンテナ一覧を表示 • docker logs pg で

    PostgreSQL のログを確認
  29. 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 • 環境変数がいっぱい
  30. 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 にフォワードされる
  31. 起動した? • ローカル環境で… $ ./test_client <IP address> create $ ./test_client

    <IP address> list • ちゃんと JSON が返ってきたら大成功
  32. Cleanup docker stop pg todo nginx docker rm pg todo

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

  34. docker-compose • 複数のコンテナをまとめて取り扱うツール • 今回なら todo・postgres・nginx で 1 まとめに •

    ネットワークやボリュームの作成もやってくれる • ソースのレポジトリにある docker-compose.yaml を参照 (前で実演)
  35. 継続的インテグレーション・継続的デリバリー (CI・CD) • テストの結果次第で,イメージをビルド (CI) • イメージがレジストリに上がったら自動でデプロイ (CD) • デプロイが楽になるとものを作る機運が高まる

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

    Kubernetes・Mesos・Docker Swarm…
  37. まとめ • Docker 登場の背景 • 運用のつらみ • Docker の概要 •

    イメージ: 環境を持った実行ファイル • コンテナ: 隔離の単位であり,実行の単位 • ネットワーク: コンテナがつながるネットワーク • ハンズオン • API サーバーは無事動きましたか?
  38. 最後に • Docker は現状,モダンな運用の基礎となる技術 • 今日ご紹介したもの以外に,まだまだ応用はあります • 皆さんの運用が楽になれば幸いです

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