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

Docker Hands On

Docker Hands On

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

Tomoya Tabuchi

June 16, 2018
Tweet

More Decks by Tomoya Tabuchi

Other Decks in Programming

Transcript

  1. 自己紹介 • 田渕 智也 <[email protected]> • 所属: 同志社大学 理工学部 B4

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

    ハンズオン • Dockerfile の作成 • Dockerfile を使ったイメージを作成 • レジストリへのアップロード • Docker 化したアプリケーションをサーバーにデプロイ • 発展
  3. 背景: 運用の辛さ (みなさんもありませんか?) • 複数のアプリケーションを動かしたいとする • マシンを複数に分けると… • 資源もったいない •

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

    (存在しないように見える) • 指定された場所以外のファイルは見えない (同上) • ユーザやネットワークスタックも指定のもの以外は見えない (同上) • この隔離の単位を「コンテナ」という • この用語が登場したのは Docker の登場とほぼ同時 • 実は 80 年代からあった • しかし,普及していなかった
  5. 背景: Infrastructure as Code • 環境構築を自動化するツールの流行 (2010 年代初頭) • Ansible

    (2012) • マシンが対象 • マシンを操作する手順を記述して初期化する • べき等性 • マシンの用途を変えるときは…?
  6. Docker • 主に Linux で動くコンテナ仮想化基盤 • コンテナの初期化と実行を管理する • Docker イメージを元に

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

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

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

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

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

    • 同一ネットワークにないコンテナは見えない • 作成・指定しなければ default ネットワークが使用される
  12. 今回の題材 • github.com/tomoyat1/yet-another-todo-app • 機能を省略した Todo アプリの API サーバー •

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

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

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

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

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

    • 注: パッケージ名は docker.io (変わったけどドキュメントに反映されてない) • usermod -a -G docker <ユーザ名> • sudo なしで docker コマンドを使うため • これをやったら一度 SSH を切ってつなぎ直す
  18. 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: コンテナ内の環境変数の指定
  19. 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 • 環境変数がいっぱい
  20. 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 にフォワードされる
  21. 起動した? • ローカル環境で… $ ./test_client <IP address> create $ ./test_client

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

    nginx • コンテナの停止と削除 • PostgreSQL のデータはボリュームに入れたから消えない :) • docker コマンドについては docker help の出力を見るとよさそう
  23. docker-compose • 複数のコンテナをまとめて取り扱うツール • 今回なら todo・postgres・nginx で 1 まとめに •

    ネットワークやボリュームの作成もやってくれる • ソースのレポジトリにある docker-compose.yaml を参照 (前で実演)
  24. まとめ • Docker 登場の背景 • 運用のつらみ • Docker の概要 •

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