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
Docker入門
Search
masibw
November 10, 2021
Programming
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Docker入門
サークル内講習で使用したスライドです.厳密性は求めないでください...
masibw
November 10, 2021
More Decks by masibw
See All by masibw
REST API#とは
masibw
1
1.4k
Other Decks in Programming
See All in Programming
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
480
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5k
Heart of Swift Concurrency
koher
0
1.2k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
490
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.4k
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
350
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.8k
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
720
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
16k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
190
phperだってパンチカードでコーディングしたい
o0h
PRO
0
230
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Deep Space Network (abreviated)
tonyrice
0
360
How to make the Groovebox
asonas
2
2.5k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
390
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
290
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
450
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Transcript
Docker入門
目次 1. Dockerとは a. imageについて b. Dockerfileについて c. コマンド説明 2.
Docker Composeとは a. docker-compose.ymlについて b. コマンド説明 3. 実プロダクトでの使用例 a. AWS ECS b. kubernetes 2
Dockerって何? コンテナ型仮想環境を扱うためのツール 3 大雑把に言うと環境構築を楽にするために使う
Dockerがないと 4 今度Javaで開発するから環境用意しておいてね! おけ!!!まかせろ!!!
Dockerがないと 5 Java12でしょ Java8を用意しました Javascriptを用意しました 最新のJava17を使いましょう
Dockerがないと 6 Java12でしょ Java8を用意しました Javascriptを用意しました 最新のJava17を使いましょう カオス
言語の環境構築だけでも大変.. 7
実際には言語以外にも • ライブラリ・フレームワークのバージョン • 環境変数 • 周辺ツール(formatter, linter) • 実行方法
etc… 統一したいものが多い!! 8
Dockerがあると 9 次の開発で使うdocker環境用意してあります! あざます!何もしなくてヨシ!
もうちょっと具体的に 多くの場合 開発環境へは「Dockerfile」 本番環境へは「ビルドされた実行ファイルを含むDockerイメージ」 を共有する 10
コンテナとイメージ 11 イメージ コンテナA コンテナB イメージを元にコンテナが作られる それぞれのコンテナは 互いに影響しないし,独立している Dockerfile Dockerfileを元にイメージが作られる
もうちょっと具体的に 多くの場合 開発環境へは「Dockerfile」 本番環境へは「ビルドされた実行ファイルを含むDockerイメージ」 を共有する 12
GoのDockerfile例 実務ではCOPYでAPI keyやパスワードな どの秘匿情報をコピーしないように気をつ けてくださいね! 秘匿情報はAWS secrets managerや環 境変数を用いて設定するのが良さそう go.modを先にコピーしてgo
mod downloadを実行しているのは2回目以 降のビルドを速くするため. 実行内容が 変わらないところはキャッシュしてくれる. 改善余地: マルチステージビルド 13 # ベースイメージとして golangの1.17.2がインストールされたもの を使う FROM golang:1.17.2 # 現在の作業ディレクトリを /workdirに変更する WORKDIR /workdir # ホストからgo.modをコピーする COPY go.mod . RUN go mod download # ホストからコマンド実行したディレクトリの中身をすべてコピーす る COPY . . # ビルドする RUN go build -o docker-train . ENTRYPOINT ["/workdir/docker-train" ] Dockerfile
Dockerfileを貰ったらどうすれば良い? docker build -t イメージ名 . 14 docker run イメージ名
ビルドしてイメージを作る 作ったイメージを実行する(=コンテナを作成する) runはオプションが多いけど重要なので,一度は見てほしい : https://docs.docker.jp/engine/reference/commandline/run.html
コンテナとイメージ 15 イメージ コンテナA コンテナB イメージを元にコンテナが作られる それぞれのコンテナは 互いに影響しないし,独立している Dockerfile Dockerfileを元にイメージが作られる
何を共有するか(再掲) 開発環境へは「Dockerfile」 を共有する -> それぞれが変更したソースコードを用いてビルドしたいから 本番環境へは「ビルドされた実行ファイルを含むDockerイメージ」を共有する -> 安定しており,再現性のあるものを使いたいから -> イメージを渡せばサーバーを立ててくれるものがある(AWS
ECSなど) 16
やってみよう 17 > git clone
[email protected]
:masibw/docker-train.git > cd docker-train/docker-train 練習用リポジトリをクローンしてdocker-trainディレクトリに移動
やってみよう 18 > docker build -t docker-train . > docker
run --rm docker-train Dockerfileからdocker-trainという名前のイメージを作成 docker-trainというイメージを指定してコンテナを作成(実行)する. --rm はコンテナ終了時に自動 で削除する Hello docker! と表示されれば成功!
でも,複数のコンテナ管理大変じゃな い? 19
作ってみる構成 Docker-compose 20 docker-compose.ymlを用いて複数のコンテナを一元管理できる Nginx App MySQL
実際に作ってみる構成 Docker-compose 21 docker-compose.ymlを用いて複数のコンテナを一元管理できる Nginx App MySQL リクエスト レスポンス ブラウザ
docker-compose例 全体像 versionはcomposeの書き方の version servicesにコンテナごとの設定を書 いていく volumesにはこのプロジェクトで使用 するvolumeを書く. コンテナが停止 しても削除されない.
networksにはこのプロジェクトで使 用するdockerネットワークの設定を 書く.同じネットワークに所属するコ ンテナ同士はapp:8080 のようにして 通信できる 22 version: "3" services: nginx: # Nginxについての設定を書く app: # Appについての設定を書く db: # DBについての設定を書く # コンテナが終了してもDBデータを永続化する volumes: db-data: # コンテナが属するネットワークを作成する networks: train-network: driver: bridge docker-compose.yml
既に存在するイメージを用いる場 合はimageで指定する (image名:バージョン) docker-compose例 Nginx 23 nginx: # 公式イメージを用いる image:
nginx:1.21.3 restart: always # ポートフォワーディングの設定.ホストの 80/tcpとコンテナの 80/tcpを結びつけ る ports: - "80:80" volumes: # Nginxの設定ファイルを上書きする (:roは読み取り専用 ) - ./build/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro networks: - train-network docker-compose.yml
補足:ポート番号とは 同じマシンで通信するプログラムを識別するために使われるもの 24 マシン HTTP tcp/80番 別マシン 別マシン メール tcp/143番
既に存在するイメージを用いる場 合はimageで指定する (image名:バージョン) docker-compose例 Nginx 25 nginx: # 公式イメージを用いる image:
nginx:1.21.3 restart: always # ポートフォワーディングの設定.ホストの 80/tcpとコンテナの 80/tcpを結びつけ る ports: - "80:80" volumes: # Nginxの設定ファイルを上書きする (:roは読み取り専用 ) - ./build/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro networks: - train-network docker-compose.yml
補足:volumeマウントとは コンテナ内のディレクトリ/ファイルを別の場所と共有すること(ざっくり) ├── build │ ├── mysql │ │ └──
initdb.d │ │ └── schema.sql │ └── nginx │ └── default.conf ├── (省略) . `-- default.conf ホストPC コンテナ内
既に存在するイメージを用いる場 合はimageで指定する (image名:バージョン) docker-compose例 Nginx 27 nginx: # 公式イメージを用いる image:
nginx:1.21.3 restart: always # ポートフォワーディングの設定.ホストの 80/tcpとコンテナの 80/tcpを結びつけ る ports: - "80:80" volumes: # Nginxの設定ファイルを上書きする (:roは読み取り専用 ) - ./build/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro networks: - train-network docker-compose.yml
用意したdockerfileを用いる場合 はbuildの中に書く depends_onで起動順を指定でき るが,コンテナ内のアプリが待ち受 けているかは別なので,エラーハ ンドリングは必要.(dockerizeや db.Ping()を用いて待機するなど ) env_fileを指定すると環境変数に 渡してくれる.
docker-compose例 App 28 app: build: context: . dockerfile: ./build/app/Dockerfile # このコンテナがdbコンテナより後に起動するよう に指定する.コンテナ内のアプリ (DB)が起動しているか は別問題なので注意 depends_on: - db env_file: - .env networks: - train-network docker-compose.yml
MySQLは /docker-entrypoint-initdb.dにsql ファイルなどを渡すと初期データと して投入してくれる. また,rootやユーザのパスワード は環境変数で指定できる. そういった説明は公式ページに書 いてあるので,イメージを使用する 前に確認すると良い https://hub.docker.com/_/mysql
docker-compose例 DB 29 db: image: mysql:8.0 command: mysqld volumes: # 初期データを投入する - ./build/mysql/initdb.d:/docker-entrypoint-initdb.d # DBのデータを永続化する - db-data:/var/lib/mysql # ファイルで環境変数を指定する. env_file: - .env networks: - train-network docker-compose.yml
キー=値 の形で書けば良い. docker-compose例 .env 30 MYSQL_ROOT_PASSWORD=pass MYSQL_USER=app MYSQL_PASSWORD=user-pass MYSQL_DATABASE=compose_train DB_HOSTNAME=db
DB_PORT=3306 .env
.dockerignoreというファイルを書く ことで,ビルド時に無視するファイ ルを指定できる. セキュリティ的に保護したいファイ ルや,容量が大きいが使わない ファイルなどを無視できます. docker-compose例 .dockerignore 31 build/
.env .dockerignore
やってみよう 32 > cd ../compose-train > docker compose up -d
--build 先程cloneした練習用リポジトリを開き,compose-trainディレクトリへ移動 docker-compose.ymlに書かれている内容に従ってコンテナを作成
やってみよう 33 ブラウザを開き localhost と入力し,データが表示されれば OK!
今後の足がかり 34 個人開発レベルや開発環境では便利だが,実務では少し足らない • 負荷に応じた制御(オートスケーリングなど) • ホスト(docker自体が動くサーバー)が複数あって,それを跨ぐ通信をどう管理する? • コンテナが正常に動いていることを確認したい など...
-> AWS ECS や kubernetesなどが使用される
参考資料 • 数時間で完全理解!わりとゴツいKubernetesハンズオン!! ◦ https://qiita.com/Kta-M/items/ce475c0063d3d3f36d5d#kubernetes%E3%81%A3%E3%81 %A6%E4%BD%95%E3%81%8C%E3%81%86%E3%82%8C%E3%81%97%E3%81%84%E3%81 %AE • docker-docs-ja ◦
https://docs.docker.jp/index.html • 今回用いたリポジトリ ◦ https://github.com/masibw/docker-train 35