Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
技術書LT #11 実践 Docker - ソフトウェアエンジニアの「Docker よくわか...
Search
yamamoto-yuta
July 05, 2023
Technology
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
技術書LT #11 実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本
yamamoto-yuta
July 05, 2023
More Decks by yamamoto-yuta
See All by yamamoto-yuta
プロダクトデザイナーに学ぶ、『見る気が起きる』ダッシュボードの作り方 / Creating Engaging Dashboards: Lessons from Product Designers
yamamotoyuta
3
1k
「必要とされるデータ基盤」であり続けるためにやってきたこと / What We've Done to Make a Needed Data Analytics Platforms Grow
yamamotoyuta
0
640
他チームへ越境したら、生データ提供ソリューションのクエリ費用95%削減へ繋がった話 / Cross-Team Impact: 95% Off Raw Data Query Costs
yamamotoyuta
0
920
プロダクト観点で考えるデータ基盤の育成戦略 / Growth Strategy of Data Analytics Platforms from a Product Perspective
yamamotoyuta
1
2.4k
ヤプリのデータカタログ整備 1年間の歩み / Progress of Building a Data Catalog at Yappli
yamamotoyuta
4
4.4k
私のdbt布教用資料 〜TROCCOUG Ver.〜 / My Guide to Evangelizing dbt - TROCCOUG Ver.
yamamotoyuta
1
3.5k
データカタログの最初の一歩 〜データ組織向けに dbt docs を整備している話〜 / Maintaining dbt docs for data organizations
yamamotoyuta
2
3.9k
次の10年を戦える分析用データ基盤構築の第一歩 - dbtによる基盤刷新とクエリ費用90%削減への取り組み -
yamamotoyuta
1
2.1k
Other Decks in Technology
See All in Technology
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
740
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
160
CLIライブラリ開発を支える技術
htnabe
0
110
HHKBエバンジェリストになる方法
941
0
100
人間はどの意思決定を手放せるのか
kawasima
14
6.8k
絵ではじめるKubernetesセキュリティ
aoi1
3
560
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
240
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
160
Deploying a Full-Stack Bun-Native Framework on Cloudflare Workers
7nohe
0
170
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
27
21k
ユーザー価値を届け続けるためにウォンテッドリーが大切にしている文化
kotaminato
0
160
Featured
See All Featured
Code Review Best Practice
trishagee
74
20k
Between Models and Reality
mayunak
4
460
For a Future-Friendly Web
brad_frost
183
10k
Practical Orchestrator
shlominoach
192
12k
Odyssey Design
rkendrick25
PRO
2
810
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
Why Our Code Smells
bkeepers
PRO
340
58k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The Cost Of JavaScript in 2023
addyosmani
55
10k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
We Are The Robots
honzajavorek
0
370
Transcript
技術書LT #11 実践 Docker ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本 2022-11-22 山本雄太
Webで無料で読めます https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59
• 「Docker よくわからない」を終わりにする本 • 感想: 今まで何となくの理解でやってた部分がちゃんと説明されていてスッキリした ◦ Docker って仮想 OS
的…ではない? ◦ docker run と docker exec て何が違うの? ◦ docker exec -it <container> bash の bash の部分って何? ◦ etc… どんな本?
どんな内容? 概念理解 基礎 実践
• Docker触ったことない人 ◦ この本の内容一通りやれば、理解も実際に手を動かす部分もバッチリになれる • とりあえず動かしながらDockerを始めた人 ◦ (山本はこのパターン) ◦ 本の前1/4の内容は、手を動かしながら始めるとすっ飛ばしがちな内容が多い(と感じた)
どんな人に(特に)オススメ?
「本の前1/4」て具体的にどの辺? 概念理解 基礎 実践
1. Docker Desktop って何? 2. Docker コンテナは仮想 OS っぽいけど仮想 OS
ではない 3. コンテナ起動時に実行する命令の指定方法 4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い 5. Docker Hub のレイヤー情報の見方 ここからは山本が個人的に勉強になった点を抜粋して紹介します
1. Docker Desktop って何?
• Windows や Mac で Docker を使うためのデスクトップアプリ • Docker を動かすための一式が入っている
◦ Linux カーネル, Docker Engine, Docker Compose, Kubenetes, etc… → だから Linux 以外の OS でも Docker が使えるようになる 1. Docker Desktop って何? 図の引用: 1部: Docker とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わ りにする本 図の引用: 1部: 仮想化とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わ りにする本
2. Docker コンテナは 仮想 OS っぽいけど仮想 OS ではない
• 実体は Linux の Namespace (名前空間)という機構で分離された1プロセス • 名前空間とは… ◦ Linux
カーネル内のグローバルなリソースを管理する機構 ◦ プロセスIDやファイルシステムのマウントポイント等を管理 ◦ これにより、ホスト-ゲスト間、ゲスト間の環境分離が可能に • 「Linux の Namespace 自体はもう 20 年近く存在する技術であり、それをコンテナ やイメージというものを用いて扱いやすくした技術が Docker」らしい 2. Docker コンテナは仮想 OS っぽいけど仮想 OS ではない この PID 2 を kill しても... この PID 2 には 影響なし 元の図: Linuxカーネル4.1の名前空間(ドラフト)
• なので、実際にはホストマシン上の Linux カーネルを利用している ◦ Intel Mac だと動くのに M1 Mac
だと動かない事象が発生するのはこれが原因 2. Docker コンテナは仮想 OS っぽいけど仮想 OS ではない カーネルが違う 元の図: 1部: 仮想化とは|実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本
3. コンテナ起動時に実行する命令の 指定方法
• イメージにはコンテナ起動時にどんなコマンドを実行するか定義されている ◦ 例)Nginx イメージの場合: CMD ["nginx" "-g" "daemon off;"]
• 起動時に実行するコマンドは自分で指定できる ◦ Dockerfile の CMD 命令 ◦ docker exec [option] <container> command(←コレ) ◦ docker-compose.yml の command: • 指定した場合、次の優先度でコマンドは上書きされる ◦ docker-compose.yml の command: = docker exec の command > Dockerfile の CMD 命令 > イメージで指定されたコマンド 3. コンテナ起動時に実行する命令の指定方法
3. コンテナ起動時に実行する命令の指定方法 $ docker container run \ --name nginx1 \
--rm \ --detach \ nginx:1.21 $ docker container run \ --name nginx2 \ --rm \ --interactive \ --tty \ nginx:1.21 \ bash そのままコンテナを起動した場合 起動時に bash を 実行するよう指定した場合 # ps x PID TTY STAT TIME COMMAND 1 ? Ss 0:00 nginx: master process nginx -g daemon off; 36 pts/0 Ss 0:00 bash 387 pts/0 R+ 0:00 ps x # ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 346 pts/0 00:00:00 ps コンテナ内で ps を実行した結果 コンテナ内で ps を実行した結果 PID 1 はイメージで指定されたコマンド( Nginx の起動コマンド)に なっている PID 1 は指定したコマンドに なっている
3. コンテナ起動時に実行する命令の指定方法 $ docker container run \ --name ubuntu1 \
--rm \ --interactive \ --tty \ my-ubuntu CMD $ docker container run \ --name ubuntu1 \ --rm \ --interactive \ --tty \ my-ubuntu \ echo "exec" exec $ docker-compose up [+] Running 2/0 ⠿ Network tech-book-lt_default Created 0.0s ⠿ Container tech-book-lt-sample-1 Created 0.0s Attaching to tech-book-lt-sample-1 tech-book-lt-sample-1 | compose tech-book-lt-sample-1 exited with code 0 CMD 命令の通り “CMD” と出る (イメージ指定の命令は上書きされる ) 指定通り “exec” と出る ( CMD 命令は上書きされる) 指定通り “compose” と出る ( CMD 命令は上書きされる) FROM ubuntu:20.04 CMD ["echo", "CMD"] Dockerfile version: '3' services: sample: image: my-ubuntu tty: true command: echo "compose" docker-compose.yml 起動時に echo “CMD” を実行 起動時に echo “compose” を実行 そのままコンテナを起動した場合 docker exec で指定した場合 docker-compose.yml で指定した場合 起動時に echo “exec” を実行 Ubuntu イメージのレイヤー 起動時に bash を実行
4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い
4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い 効果
ホストマシンとの関係 volume マウント Docker が管理する領域をコンテナ内の指定ディレクトリ に割り当てる ホストマシンからはアクセスできない =ファイルを削除したりしてもホストマシンには影響が出ない bind マウント ホストマシンの指定ディレクトリ をコンテナ内の指定ディレ クトリに割り当てる ホストマシンからアクセスできる =ファイルを削除するとホストマシンからも消える Dockerfile の COPY 命令 指定ファイルをイメージビルド時にコピー する コンテナを起動するとファイルが存在 →変更の反映にはイメージの再ビルドが必要
4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い dir-C/
内のファイルを削除すると volume-A からも削除される ↓ ホストマシンには影響なし dir-D/ 内のファイルを削除すると、 dir-B/ からも削除される ↓ ホストマシンに影響あり
4. volume マウント、 bind マウント、 Dockerfile の COPY 命令の違い COPY
命令 bind マウント COPY bind マウント イメージビルド時に COPY コンテナ起動時に bind マウント 元の図: https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/3-5-bind-mount
5. Docker Hub のレイヤー情報の見方 (例: rails:5.0.1 イメージの場合)
5. Docker Hub のレイヤー情報の見方(例: rails:5.0.1 イメージの場合) Rails イメージの Tag ページにあるレイヤー情報
22 レイヤー Rails のリポジトリにある Dockerfile 4 レイヤー なぜ違う? 元の図: https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/2-8-dockerfile
5. Docker Hub のレイヤー情報の見方(例: rails:5.0.1 イメージの場合) ruby:2.3 のレイヤー ( 18
レイヤー) Rails の Dockerfile ( 4 レイヤー) 元の図: https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae3 6c33424b59/viewer/2-8-dockerfile
ご清聴ありがとうございました!