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
380
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
370
meltdown.pdf
tomoyat1
0
41
Other Decks in Programming
See All in Programming
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
7
2.5k
Domain-Driven Transformation
hschwentner
2
1.9k
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
640
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
2
300
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
270
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.7k
Lottieアニメーションをカスタマイズしてみた
tahia910
0
120
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
230
Writing documentation can be fun with plugin system
okuramasafumi
0
120
負債になりにくいCSSをデザイナとつくるには?
fsubal
9
2.3k
ファインディの テックブログ爆誕までの軌跡
starfish719
2
1.1k
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
890
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
Building an army of robots
kneath
302
45k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
KATA
mclloyd
29
14k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Writing Fast Ruby
sferik
628
61k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
Building Applications with DynamoDB
mza
93
6.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 は現状,モダンな運用の基礎となる技術 • 今日ご紹介したもの以外に,まだまだ応用はあります • 皆さんの運用が楽になれば幸いです
ご清聴ありがとうございました • ご質問・疑問・発展的な話題などなんでもお気軽にどうぞ • 今後のイベントのテーマの要望等,もしあればどうぞ