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入門
Search
taiga533
December 05, 2019
Programming
0
68
実用Docker入門
社内勉強会用に作った資料です。
taiga533
December 05, 2019
Tweet
Share
More Decks by taiga533
See All by taiga533
ブラウザ拡張機能が ぱぱっと作れるいい時代になりました。
taiga533
1
740
DockerをいじれるWebGUIを作った話
taiga533
0
67
はじめてのVue.jsハンズオン
taiga533
0
38
Other Decks in Programming
See All in Programming
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.8k
初めてDefinitelyTypedにPRを出した話
syumai
0
420
Quine, Polyglot, 良いコード
qnighy
4
650
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.2k
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
120
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
900
Jakarta EE meets AI
ivargrimstad
0
260
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2k
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
130
Arm移行タイムアタック
qnighy
0
340
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
940
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Six Lessons from altMBA
skipperchong
27
3.5k
Into the Great Unknown - MozCon
thekraken
32
1.5k
Building Adaptive Systems
keathley
38
2.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Gamification - CAS2011
davidbonilla
80
5k
Become a Pro
speakerdeck
PRO
25
5k
A designer walks into a library…
pauljervisheath
204
24k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Documentation Writing (for coders)
carmenintech
65
4.4k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
380
Transcript
実用Docker入門 K’AWAILLY カワイリー・ジャパン
今日話すこと • Docker(コンテナ技術)を学ぶ必要性 • Dockerの仕組み(ざっくり) • Dockerの基礎知識 • Dockerを運用するうえで重要そうなこと •
良いDockerfileの書き方 • 最後に
Docker(コンテナ技術)を学ぶ 必要性
最近の技術トレンドに求められているコト CI/CD マイクロサービス クラウド DevOps 必要 動作環境の統一 拡張性 アプリ環境の携帯性 デプロイ高速化
IaC
Docker(コンテナ技術)はうまく使えば それらの要求を満たせる
みんながDockerを使えるとどんなメリットが? - アプリ構成の見える化 - デプロイが楽に - 新人の環境構築を高速化 - 本番環境・開発環境の差異を減らす
Dockerの仕組み(ざっくり)
Dockerはコンテナ型仮想化 ハードウェア OS&カーネル コンテナ管理プロセス (Docker daemon) コンテナ (仮想環境) コンテナ操作プロセス (Docker
client) UNIX Socket プロセス コンテナ操作コマンド
仮想化ソフト・仮想ハードウェアが介在しない + ハードウェア・OSのシュミレーションが不要 オーバーヘッドが少ない コンテナ型仮想化のメリット
あれ、 仮想化してないよね?
実はLinuxのnamespaceという機能で ホストとコンテナを隔離している。
namespaceを使った隔離のイメージ 参考:https://gihyo.jp/admin/serial/01/linux_containers/0002 hogehoge.txt index.html kawasaki.txt namespaceAの プロセス namespaceBの プロセス /var/www/html
/var/www/html
Dockerの基礎知識(ざっくり)
Dockerはコンテナの中でアプリを動かす
コンテナを作成&起動はdocker runコマンド 参考:https://docs.docker.com/engine/reference/commandline/run/ -p ホスト側:コンテナ側 で、指定したポートを繋げる
コンテナを作成&起動はdocker runコマンド 参考:https://docs.docker.com/engine/reference/commandline/run/ --name [コンテナ名] で、コンテナに名前をつける
コンテナを作成&起動はdocker runコマンド 参考:https://docs.docker.com/engine/reference/commandline/run/ 最後にコンテナを作成する元の イメージを決める。 [イメージ名:イメージタグ] と指定できる。必須
やった!仮想化って簡単!
いやいや、イメージって何よ イメージ=仮想環境のISOイメージ的なもの コンテナ=イメージを元に作られた動作する仮想環境のこと コンテナ イメージ 参考:https://docs.docker.com/engine/docker-overview/#images
参考:https://docs.docker.com/engine/reference/commandline/run/ httpd:2.4.41-alpineというイメージを使っている。 イメージが自PCに無いとリモートレジストリから勝手に取ってくる。
リモートレジストリ is 何 自PC外にあるイメージが置いてあるところ。 公開・非公開のレジストリがある。 Node.jsコンテナ作りたい けど、イメージがローカル に無い・・・ ローカル 参考:https://docs.docker.com/engine/docker-overview/#docker-registries
リモートレジストリ is 何 必要なイメージがローカルにない時は、 リモートレジストリから取得できる Dockerhubにあった! 使おう!! 参考:https://docs.docker.com/engine/docker-overview/#docker-registries Dockerhub
イメージは自分でも作成できる イメージはDockerfileを通して作成することができる。 イメージを 作成する手順 Dockerfile 出力 イメージを作るコマンド イメージ完成 読込
イメージを作る時はdocker buildコマンド イメージに名前をつけるときに書く。 [イメージ名]:[タグ名]としてタグ付けできる。 タグを指定しない場合は暗黙的にlatestタグのイ メージを作成・置き換えする。 参考:https://docs.docker.com/engine/reference/commandline/build/
イメージを作る時はdocker buildコマンド ビルドコンテキストを指定する。必須 指定したディレクトリにDockerfileを置く必要があ る。 ここで指定したディレクトリ以下のファイルがビル ド時に読み込まれる。 参考:https://docs.docker.com/engine/reference/commandline/build/
docker buildに必要なDockerfileの書き方 イメージを作成する元になる イメージを指定する。 参考:https://docs.docker.com/engine/reference/builder/
docker buildに必要なDockerfileの書き方 イメージの環境変数を 設定する。 参考:https://docs.docker.com/engine/reference/builder/
docker buildに必要なDockerfileの書き方 イメージ作成に必要な コマンドの実行 参考:https://docs.docker.com/engine/reference/builder/
docker buildに必要なDockerfileの書き方 コンテナ起動時に 実行するプロセスの指定 参考:https://docs.docker.com/engine/reference/builder/
docker runコマンドでも 起動時に実行するプロセスを指定できる 最後の引数に、コンテナ起動と同時に 実行するプロセスを指定できる。
コンテナは停止しても残ってる コンテナを停止しても、コンテナ自体は残り続ける。 が、コンテナを削除するとコンテナ内の情報は全て消えてしまう。 コンテナの一覧を取得するコマンド -aで停止中のコンテナも表示
停止したコンテナを再起動するとき -a で標準出力+標準エラー出力を割り当てる -i で標準入力を割り当てる
停止したコンテナを再起動するとき コンテナID or コンテナ名を割り当てる
Dockerを運用するうえで重要 そうなこと
Dockerコンテナは基本ステートレスにする いつ壊れてもいいように状態を持たないようにする。 ユーザーテーブル id name password 1 takashi ae04b12df1ec コンテナを消すと・・・
Dockerコンテナは基本ステートレスにする いつ壊れてもいいように状態を持たないようにする。 ユーザーテーブル id name password 1 takashi ae04b12df1ec コンテナ内のデータも消える
永続データが必要なら docker run時にホスト側のボリュームをコンテナにマウント して永続化しよう。 ホスト環境 ユーザーテーブル id name password 1
takashi ae04b12df1ec 共有
docker runでホスト側ディレクトリのマウント -v [ホスト側Dir]:[コンテナ側Dir] でホスト側とコンテナ側でディレクトリの共有 が可能。 参考:https://docs.docker.com/engine/reference/commandline/run/
1つのコンテナで担うのは1つの役割 役割ごとにコンテナを分けると、 スケールイン・アウトも柔軟にできる。 java appコンテナ DBコンテナ httpコンテナ
1つのコンテナで担うのは1つの役割 このコンテナは • DBサーバ • httpサーバ • java appアプリサーバ という複数の役割を持つ。
だめなパターン
1つのコンテナで担うのは1つの役割 tomcatのバージョンが上がり、 コンテナの再起動が必要 MySQLやhttpdも再起動する ことに だめなパターン
1つのコンテナで担うのは1つの役割 役割ごとにコンテナを分けると、 バージョンアップの影響がほかのコンテナに 及ばない。 java appコンテナ DBコンテナ httpコンテナ
アプリ実行に必要なファイルは全てイメージに入れる コンテナ内ファイルシステム • main.class • index.jsp • ... アプリの実行を外部環境に依存させないことで、 アプリ環境の携帯性を上げる。
アプリの設定変更を柔軟に行えるようにする 例えば・・・ コンテナ内ファイルシステム hogehoge.properties ホスト環境 hogehoge.properties
軽量なDockerイメージを作る Dockerイメージを取得するのにか かる時間 アプリを起動するのに かかる時間 デプロイするのに かかる時間 Dockerイメージを軽量化して、 なるべくデプロイにかかる時間 を減らそう
メインプロセスはコンテナ起動時に実行する DockerfileのCMD命令にはコンテナで実行する メインプロセスをフォアグラウンドで動作するように指定す る。 コンテナ起動! tomcatも起動!
メインプロセスはコンテナ起動時に実行する コンテナも死亡! tomcat死亡! メインプロセスの停止=コンテナの停止となるので、 アプリ自体の死活監視が楽になる。
良いDockerfileの書き方 ビルド高速化編
ビルドコンテキストを減らす ここでビルドコンテキストを指定している。 ここで指定したディレクトリ以下のファイルがビル ド時に読み込まれる。 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles
不要なファイルをビルドコンテキストに含めない ビルドコンテキストを狭めて ビルド時に読み込むファイルを減らす ビルドコンテキスト 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles
不要なファイルをビルドコンテキストに含めない(だ めなパターン) ビルドコンテキストを狭めて ビルド時に読み込むファイルを減らす ビルドコンテキスト 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles
ビルドコンテキストを減らすと 不要なファイルをビルドコンテキストに含めなければ ビルドは早くなる。 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles
ビルドキャッシュを使いこなす Docker buildで一度ビルドした内容はキャッシュされる。 このキャッシュをうまく使うことでビルドの高速化を図る。 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles
COPY命令の位置に気をつける キャッシュが効きにくい処理は下に持っていく 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles キャッシュ有効 キャッシュ無効 COPY命令はコピー元ディレクトリ以下に変更があると、 以降の命令のキャッシュを破棄する
COPY命令の位置に気をつける(だめな例) 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles キャッシュ有効 キャッシュ無効 コピー元ディレクトリ以下に変更があった場合
良いDockerfileの書き方 イメージ軽量化編
不要なファイルをイメージに残さない 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles • パッケージマネージャのダウンロードキャッシュ • 必須でない依存関係にあるパッケージ • ビルドのときだけ必要なツール
パッケージマネージャのキャッシュを削除 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles とりあえずキャッシュクリア
必要な依存関係にあるパッケージのみインストール 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles debian系はapt-get installでこのオプションをつけ る。 redhat系は不要。
マルチステージングビルドを使う 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles docker buildを複数の段階に分けることができるヤツ。 最後にビルドされたステージがイメージとして吐き出される。
マルチステージングビルドでできること 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles Dockerfile ビルドステージ 完成ステージ ビルド ビルド成 果物
マルチステージングビルドでできること 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles Dockerfile ビルドステージ 完成ステージ ビルド ビルド成 果物 COPY 命令
--from=ビルドステージ ビルド成 果物
マルチステージングビルドでできること 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles Dockerfile ビルドステージ 完成ステージ ビルド ビルド成 果物 ビルド成 果物
イメージとして吐き 出される
FROM命令で軽量イメージを読み込む 203MB 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles
FROM命令で軽量イメージを読み込む 5MB alpine-linux 組み込みで使われるLinux。 かな~~~~~~~~り軽い。 参考:https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles
軽いイメージには裏がある • alpine-linuxはglibc(GNU標準Cライブラリ)が入ってない • glibcをコールするアプリは落ちる可能性あり • ビルド時に静的リンクを指定するといい
最後に
複数コンテナの運用について • コンテナ間通信 • 複数コンテナの並列起動・停止 • コンテナ間の依存関係に基づいた設定 docker単体でやるのは面倒くさい
面倒くさい理由 • コンテナ間通信 • 複数コンテナの並列起動・停止 • コンテナ間の依存関係に基づいた設定 docker network設定しないと、 ホスト名でほかコンテナに
アクセスできない 参考:https://docs.docker.com/network/bridge/
面倒くさい理由 • コンテナ間通信 • 複数コンテナの並列起動・停止・更新 • コンテナ間の依存関係に基づいた設定 イメージの更新があったらコンテナ作り直したり ・・・ スクリプト書くの地味に大変
面倒くさい理由 • コンテナ間通信 • 複数コンテナの並列起動・停止・更新 • コンテナ間の依存関係に基づいた設定 Redisコンテナ起動 appコンテナ起動 管理辛い
そこでdocker-composeを使う docker-composeは複数コンテナの運用を楽にするアプリ。 docker-compose.ymlという定義ファイルに複数コンテナ運用に 必要な設定が書ける。
ご清聴ありがとうございました。 よろしければ感想を下記に入力してください。