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
77
実用Docker入門
社内勉強会用に作った資料です。
taiga533
December 05, 2019
Tweet
Share
More Decks by taiga533
See All by taiga533
ブラウザ拡張機能が ぱぱっと作れるいい時代になりました。
taiga533
1
840
DockerをいじれるWebGUIを作った話
taiga533
0
75
はじめてのVue.jsハンズオン
taiga533
0
46
Other Decks in Programming
See All in Programming
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
3
420
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
540
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
470
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
620
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
170
Fundamentals of Software Engineering In the Age of AI
therealdanvega
2
290
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
370
Claude Code Skill入門
mayahoney
0
430
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
110
Geminiをパートナーに神社DXシステムを個人開発した話(いなめぐDX 開発振り返り)
fujiba
0
100
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
230
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
1k
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
93
Odyssey Design
rkendrick25
PRO
2
560
The agentic SEO stack - context over prompts
schlessera
0
710
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
120
Tell your own story through comics
letsgokoyo
1
870
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
360
Building AI with AI
inesmontani
PRO
1
820
BBQ
matthewcrist
89
10k
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という定義ファイルに複数コンテナ運用に 必要な設定が書ける。
ご清聴ありがとうございました。 よろしければ感想を下記に入力してください。