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
370
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
360
meltdown.pdf
tomoyat1
0
41
Other Decks in Programming
See All in Programming
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
530
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
7
1.5k
週次リリースを実現するための グローバルアプリ開発
tera_ny
1
110
AWSのLambdaで PHPを動かす選択肢
rinchoku
2
300
Kaigi on Railsに初参加したら、その日にLT登壇が決定した件について
tama50505
0
110
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
200
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
260
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
150
php-conference-japan-2024
tasuku43
0
360
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
110
CloudflareStack でRAGに入門
asahiiwm
0
100
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
44
13k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Gamification - CAS2011
davidbonilla
80
5.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
YesSQL, Process and Tooling at Scale
rocio
170
14k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
The Cost Of JavaScript in 2023
addyosmani
46
7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Docker and Python
trallard
42
3.2k
Optimizing for Happiness
mojombo
376
70k
Faster Mobile Websites
deanohume
305
30k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
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 は現状,モダンな運用の基礎となる技術 • 今日ご紹介したもの以外に,まだまだ応用はあります • 皆さんの運用が楽になれば幸いです
ご清聴ありがとうございました • ご質問・疑問・発展的な話題などなんでもお気軽にどうぞ • 今後のイベントのテーマの要望等,もしあればどうぞ