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
70
実用Docker入門
社内勉強会用に作った資料です。
taiga533
December 05, 2019
Tweet
Share
More Decks by taiga533
See All by taiga533
ブラウザ拡張機能が ぱぱっと作れるいい時代になりました。
taiga533
1
800
DockerをいじれるWebGUIを作った話
taiga533
0
71
はじめてのVue.jsハンズオン
taiga533
0
44
Other Decks in Programming
See All in Programming
単体テストの始め方/作り方
toms74209200
0
510
F#で自在につくる静的ブログサイト - 関数型まつり2025
pizzacat83
0
310
統一感のある Go コードを生成 AI の力で手にいれる
otakakot
0
3k
GraphRAGの仕組みまるわかり
tosuri13
7
440
技術懸念に立ち向かい 法改正を穏便に乗り切った話
pop_cashew
0
1.5k
Passkeys for Java Developers
ynojima
3
870
Rails産でないDBを Railsに引っ越すHACK - Omotesando.rb #110
lnit
1
170
都市をデータで見るってこういうこと PLATEAU属性情報入門
nokonoko1203
1
540
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
2
210
FormFlow - Build Stunning Multistep Forms
yceruto
1
190
関数型まつり2025登壇資料「関数プログラミングと再帰」
taisontsukada
2
840
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
320
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
Typedesign – Prime Four
hannesfritz
42
2.7k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Embracing the Ebb and Flow
colly
86
4.7k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
Scaling GitHub
holman
459
140k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
16
940
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という定義ファイルに複数コンテナ運用に 必要な設定が書ける。
ご清聴ありがとうございました。 よろしければ感想を下記に入力してください。