Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Docker Hands On
Search
Tomoya Tabuchi
June 16, 2018
Programming
1
360
Docker Hands On
2018-06-16に,CAMPHOR- HOUSEで行った「Docker入門ハンズオン」の資料です.
Tomoya Tabuchi
June 16, 2018
Tweet
Share
More Decks by Tomoya Tabuchi
See All by Tomoya Tabuchi
KubernetesとDeclarative Configuration
tomoyat1
0
340
meltdown.pdf
tomoyat1
0
41
Other Decks in Programming
See All in Programming
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.2k
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
120
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
860
EventSourcingの理想と現実
wenas
6
2.3k
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
330
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
350
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
1.9k
Enabling DevOps and Team Topologies Through Architecture: Architecting for Fast Flow
cer
PRO
0
320
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
Outline View in SwiftUI
1024jp
1
330
Featured
See All Featured
Side Projects
sachag
452
42k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Rails Girls Zürich Keynote
gr2m
94
13k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Thoughts on Productivity
jonyablonski
67
4.3k
Code Reviewing Like a Champion
maltzj
520
39k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Bash Introduction
62gerente
608
210k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Transcript
Docker 入門ハンズオン Tomoya Tabuchi <
[email protected]
> June 16, 2018
はじめに
自己紹介 • 田渕 智也 <
[email protected]
> • 所属: 同志社大学 理工学部 B4
• Twitter など: @tomoyat1 • CAMPHOR- 運営 • HOUSE には月曜日・土曜日によく出没します • Golang 書いたり,インフラの面倒見 (るのに失敗し) たり,院試の勉強したり…
今日のお話 • Docker の紹介 • 背景 • Docker の概要 •
ハンズオン • Dockerfile の作成 • Dockerfile を使ったイメージを作成 • レジストリへのアップロード • Docker 化したアプリケーションをサーバーにデプロイ • 発展
Docker の概要
背景: 運用の辛さ (みなさんもありませんか?) • 複数のアプリケーションを動かしたいとする • マシンを複数に分けると… • 資源もったいない •
複数のマシンのメンテが辛い • 1 マシンに複数アプリケーションを混在させると… • アプリケーション A と B で異なるバージョンのライブラリ foo を要求する • A のバグで B の重要なファイルを破壊してしまった! -> 障害発生 • 環境構築が手動で辛い • OS インストールして,ライブラリインストールして…
背景: コンテナ仮想化 (OS レベル仮想化) • 隔離したいが,仮想マシンを含めマシンを分けるのは無駄が多い • プロセスが見える範囲を制約すれば,別マシンで動いているも同然 • 他のプロセスは見えない
(存在しないように見える) • 指定された場所以外のファイルは見えない (同上) • ユーザやネットワークスタックも指定のもの以外は見えない (同上) • この隔離の単位を「コンテナ」という • この用語が登場したのは Docker の登場とほぼ同時 • 実は 80 年代からあった • しかし,普及していなかった
コンテナ仮想化の図
ハードウェア仮想化の図
背景: Infrastructure as Code • 環境構築を自動化するツールの流行 (2010 年代初頭) • Ansible
(2012) • マシンが対象 • マシンを操作する手順を記述して初期化する • べき等性 • マシンの用途を変えるときは…?
背景: 組み合わせたら良くない? • コンテナ仮想化だけでは環境構築の問題が残る • Infrastructure as Code だけだとマシンが別なので無駄が多い •
コンテナを Infrastructure as Code の手法で初期化し,実行すれば…
Docker • 主に Linux で動くコンテナ仮想化基盤 • コンテナの初期化と実行を管理する • Docker イメージを元に
• コンテナ内環境を初期化 • コンテナを起動する • Docker コンテナはコンテナ仮想化により • 1 つのマシンに同居して実行される • 互いに隔離される • 2013 年,経営が傾いていた dotCloud という PaaS の会社が社内で使っていたツール • オープンソース化し,大ヒットし,社名も Docker に変えた
Docker の功績 (推しポイント) • 環境を含んだ実行ファイルの形式を定義したのが最大の功績 • 開発者は Docker イメージを作成 (Dockerfile
の記述) • 運用者は Docker イメージを実行 (ビルド済みイメージを取得・実行) • 環境にもソースコードと実行ファイルの関係性を導入 • 実行可能なアプリケーションを配布するデファクトスタンダード化 • サーバで動かすソフトウェア以外にも応用例あり
Docker イメージ (1) • コンテナの初期化方法・起動方法が定義されたデータ形式 • 環境を持った実行ファイル,という気持ち • 「イメージを実行する」: イメージを元に
1 つのコンテナを初期化・起動する • 空のディレクトリにイメージの内容物を展開 • その中で実行ファイルを実行 • nginx:1.15.0-alpine のように名前とタグ (バージョン) で一意に特定
Docker イメージ (2) • イメージは層状になっている • 最下層は空のフォルダ • Dockerfile に記述された手順に沿って層を重ね,作成される
• Dockerfile の 1 行はイメージの 1 層になる • 多くの場合は,既存のイメージに自分の層を重ねることで作る • Docker レジストリと呼ばれる場所にイメージは公開され,共有される • プライベートなレジストリも可 • Docker Hub など
Docker コンテナ • Docker における隔離の単位 (コンテナ仮想化による) • イメージが実行ファイルなら,コンテナはプロセス • 1
コンテナにつき基本は 1 プロセス • Docker イメージにより初期化された環境を持つ • Docker イメージで指定された実行ファイルから内部にプロセスが起動される • イメージ実行時に指定することもできる
Docker ネットワーク • コンテナの仮想 NIC がつながっているネットワーク • ネットワーク上のコンテナは,その名前が IP アドレスに名前解決される
• 同一ネットワークにないコンテナは見えない • 作成・指定しなければ default ネットワークが使用される
ハンズオン
おしながき • Dockerfile の作成 • Dockerfile を使ったイメージを作成 • レジストリへのアップロード •
Docker 化したアプリケーションをサーバーにデプロイ
今回の題材 • github.com/tomoyat1/yet-another-todo-app • 機能を省略した Todo アプリの API サーバー •
Golang 製 • PostgreSQL にデータを保存 • デプロイするもの (全部 Docker で) • アプリケーションそのもの • PostgreSQL • Nginx
Dockerfile の作成 • git clone https://github.com/tomoyat1/yet-another-todo-app • 中に入って,既存の Dockerfile の名前を変更
• 新しく空の Dockerfile を作成 • 完成品が解説つきで Gist にあるので,見ながら Dockerfile を書いてみてくだ さい • 終わった方は SSH 鍵をいただきたいので声をかけてください • それも終わった方は Docker Hub (hub.docker.com) のアカウントを作ってください (な い人)
Dockerfile の解説 • Gist を見ながら解説する • Dockerfile Reference に Dockerfile
の全命令がまとめてある • 次はイメージの作成とアップロード
イメージの作成 docker build -t <username>/yet-another-todo-app:latest ./ docker push <さっき-t で指定したタグ>
• -t のところでタグを指定 (ここでのタグはイメージ名も含む) • <username> は Docker Hub のユーザー名 (持っている人) にしてください • Docker Hub じゃない場合は,URL の全部を指定する • 例: gcr.io/tomoyat1-183706 • 次はデプロイ
サーバへの接続 • お伝えしたユーザ名・IP アドレスで各自 SSH 接続してください • まだ SSH 鍵を預かっていない方は今預かります
• 先程の Gist にこの後実行するコマンドを.sh にまとめています • 余談: 今回の環境構築は GCP と Terraform で完全自動で行っています • 興味のある方は後でお話しましょう :)
サーバに Docker をインストールする • docker ubuntu install で検索 • 公式ドキュメントに沿ってインストール
• 注: パッケージ名は docker.io (変わったけどドキュメントに反映されてない) • usermod -a -G docker <ユーザ名> • sudo なしで docker コマンドを使うため • これをやったら一度 SSH を切ってつなぎ直す
Docker ネットワークの作成 $ docker network create todo_network • コンテナが繋がるネットワークを作成 •
コンテナ作成時にこれを指定
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: コンテナ内の環境変数の指定
確認 • docker ps で実行中のコンテナ一覧を表示 • docker logs pg で
PostgreSQL のログを確認
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 • 環境変数がいっぱい
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 にフォワードされる
起動した? • ローカル環境で… $ ./test_client <IP address> create $ ./test_client
<IP address> list • ちゃんと JSON が返ってきたら大成功
Cleanup docker stop pg todo nginx docker rm pg todo
nginx • コンテナの停止と削除 • PostgreSQL のデータはボリュームに入れたから消えない :) • docker コマンドについては docker help の出力を見るとよさそう
発展
docker-compose • 複数のコンテナをまとめて取り扱うツール • 今回なら todo・postgres・nginx で 1 まとめに •
ネットワークやボリュームの作成もやってくれる • ソースのレポジトリにある docker-compose.yaml を参照 (前で実演)
継続的インテグレーション・継続的デリバリー (CI・CD) • テストの結果次第で,イメージをビルド (CI) • イメージがレジストリに上がったら自動でデプロイ (CD) • デプロイが楽になるとものを作る機運が高まる
オーケストレーション • 複数のマシンでコンテナを動かす • どのコンテナをどのマシンで動かすか • コンテナの数を増減させる • コンテナが異常終了したら再度立ち上げる •
Kubernetes・Mesos・Docker Swarm…
まとめ • Docker 登場の背景 • 運用のつらみ • Docker の概要 •
イメージ: 環境を持った実行ファイル • コンテナ: 隔離の単位であり,実行の単位 • ネットワーク: コンテナがつながるネットワーク • ハンズオン • API サーバーは無事動きましたか?
最後に • Docker は現状,モダンな運用の基礎となる技術 • 今日ご紹介したもの以外に,まだまだ応用はあります • 皆さんの運用が楽になれば幸いです
ご清聴ありがとうございました • ご質問・疑問・発展的な話題などなんでもお気軽にどうぞ • 今後のイベントのテーマの要望等,もしあればどうぞ