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入門ハンズオン.pdf
Search
hoda
March 31, 2019
Programming
2.5k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Docker入門ハンズオン.pdf
hoda
March 31, 2019
More Decks by hoda
See All by hoda
Stable Diffusion楽しいぞい というお気持ちの共有
hodanov
0
270
なぜ私はVimを使うことになったのか
hodanov
2
660
ReactとPython/Djangoで何か作りたい
hodanov
1
720
Other Decks in Programming
See All in Programming
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
510
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
160
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.6k
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
8
2.7k
net-httpのHTTP/2対応について
naruse
0
470
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
120
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
180
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
610
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Making Projects Easy
brettharned
120
6.7k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Transcript
Docker入門ハンズオン 2019.3.31
Whois - Hoda - 2016/7 IT業界へ転職し、ITエンジニアとしてのキャリアをスタート ↓やってきたこと - Webサービスを支えるインフラの運用・保守 -
SSL/TLS証明書・AWS関連のオペレーター業務 - フロントサイドの改修・ Webページ制作・AWSクラウドサーバー構築 - PHP/WordPressベースのツール制作 - 運用フロー改善ツールの開発( Selenium、Python) - Python/DjangoベースのWebアプリ改修・開発支援 やっと開発系のお仕事に手を出せる状態になってきたところ。これから開発系の案件を全力で取りに 行ってさらなるスキルアップを目指します╭ ( ・ㅂ・)و ̑̑ グッ !"
スライドの見出しに がついているところは実際に 手を動かしてもらうところです
https://github.com/hodanov/docker-hands-on ローカルにCloneしておいてください
目次 - なぜDockerを使うのか - Dockerの基本概念 - Dockerの基本操作 - Dockerfileで開発環境を整える -
独自にカスタマイズしたPythonイメージの作成 - VOLUMEのマウント...ホストとコンテナ間のディレクトリ共有 - Dockerイメージの公開 - 運用管理向けのコマンド - Docker Composeでマルチコンテナを実行 - Python/Django + PostgreSQLの開発環境構築 - 永続化したいデータの扱い...VOLUMEを利用したDBのデータ保存 - 環境変数の設定
なぜDockerを使うのか
A. 環境構築のデファクトスタンダードになっている 参考URL: 2018 Docker Usage Report. 単位ホストあたりのコンテナ 型仮想環境の利用密度が急 上昇
ベアメタル環境およびVM中 心の環境からコンテナ型の 環境へ移行が進んでいる デファクトを選ぶのは大事 案件の獲得・組織におけるノウハウの集約
A. 管理ツールが充実している - Docker Desktop for Windows/Mac - ECS...Amazon Elastic
Container Service - EKS...Amazon Elastic Container Service for Kubernetes - GKE...Google Kubernetes Engine
A. とても使いやすくて便利 - 冪等性(べきとうせい)の確保 →どの環境(本番も)でも同じものを用意できる。環境依存がなくなる。 - アプリケーション構成のコード化・可視化 →GitHubでのソースコード管理・共有が可能 →Nginxなどのミドルウェアを含めたシステムの構成管理がしやすくなる -
ポータビリティ性の高さ →イメージで保存・再利用ができる →実行環境とアプリケーションをセットでビルドできる →しかもホスト環境を汚さない
このセミナーでは 最速でDockerを活用した環境構築のイメージを掴んでもらい 実務でのスムーズなキャッチアップ 開発に必要なテスト環境の構築ができるレベルを目指します
Dockerの基本概念
ホストOS型は仮想化ソフトを 使ってハードウェアレベルで仮想 化し、Guest OSを再現する。 コンテナ型は仮想化ソフトを使わ ずに、OSのリソースだけを隔離 し、仮想OS(コンテナ)を再現す る。 コンテナ型は高速に起動・終了 でき、必要なマシンリソースも少
なくて済む。 Dockerはコンテナ型の仮想化技術 Server Host OS 仮想化ソフトウェア Guest OS Guest OS App A App B App A App B Server Host OS kernel Container B Container A ホストOS型仮想化 VMware, VirtualBox コンテナ型仮想化 Docker, LXC
- Dockerコンテナ イメージを基に作成される。ファイルシステムやアプリケー ションが実行された状態。 Dockerのイメージとコンテナの関係性 - Dockerイメージ コンテナを作成するためのテンプレート。コンテナを構成する ファイルシステムや実行するアプリケーションの設定をまと めたもの。
Dockerの基本操作
バージョンの確認 # 定番 docker -v docker --version # もっと詳しく見たい時 docker
version
Dockerイメージとコンテナの基本操作 # イメージを探す...Docker Hubのリポジトリを検索 docker search python # イメージの取得 docker
image pull python:latest # イメージの取得(バージョンを指定したい時) docker image pull python:3.7 # イメージのリスト表示 docker image ls
# コンテナの実行 docker container run -it python:latest # -iはdocker起動後にコンテナ側の標準入力を繋ぎっぱなしにするオプション# -tは
擬似端末を有効にするオプション # -itでシェルに入ってコマンド実行などができるようになる。 # コンテナから抜ける Ctrl + P → Ctrl + Q or Ctrl + D Dockerイメージとコンテナの基本操作
# コンテナのリスト表示 docker container ls docker container ls -a #
コンテナの停止 docker container stop XXXX # コンテナの起動 docker container start XXXX XXXXは`CONTAINER ID`または`NAMES` Dockerイメージとコンテナの基本操作
Dockerイメージとコンテナの基本操作 # コンテナにコマンドを実行させる docker container exec -it XXXX ls -la
# コンテナへ入る docker container exec -it XXXX /bin/bash # コンテナの削除 docker container rm -f XXXX # -fは強制削除のオプション # コンテナが起動している状態でも削除を実行する XXXXは`CONTAINER ID`または`NAMES`
Dockerfileで環境を整える
下記3つのファイルを基にPythonのテスト環境を作りま す 01/ ├── Dockerfile ├── script.py └── requirements.txt -
Dockerfile...Dockerイメージを作成するためのテキストファイル - script.py...Pythonのスクリプト - requirements.txt...Pythonライブラリのリスト
Dockerfileの中身 イメージを作成するためのインストラクション(命令)が書かれている。他にもCOPY、 CMD、ENTRYPOINTなどのインストラクションがある。 FROM python:3.7 # FROM: DockerHubからイメージをpullする ENV PYTHONUNBUFFERED
1 # ENV: 環境変数を設定する RUN mkdir /code # RUN: ビルド時にコマンドを実行する WORKDIR /code # WORKDIR: 作業ディレクトリの指定 ADD . /code/ # ホスト側のファイルを指定の場所に追加 RUN pip install -r requirements.txt
script.pyとrequirements.txtの中身 import requests from pyquery import PyQuery from bs4 import
BeautifulSoup url = 'https://www.google.com/' r = requests.get(url) …...省略 requests==2.21 beautifulsoup4==4.7.1 pyquery==1.4.0 ↓script.py ↓requirements.txt
Dockerfileでビルドする # イメージのビルド # docker image build -t {IMAGE_NAME}:{TAG} {PATH}
# -tは、`name:tag`というフォーマットでタグ付けするオプション docker image build -t my_python:v1 . # コンテナの起動 # --nameでコンテナに名前付け # -dはコンテナをバックグラウンドで起動しっぱなしにするオプション docker container run -dt --name my_python my_python:v1 # コンテナへADDしたPythonスクリプトを実行 docker container exec -it my_python python script.py
ボリュームのマウント # ホストのディレクトリをボリュームとして、コンテナへマウントする docker container run -dt --name my_python -v
$(pwd):/code my_python:v1 ホスト側とコンテナ側のディレクトリを共有することで、 開発をスムーズに行える
運用管理向けのコマンド
コンテナの利用状況確認やお掃除 # コンテナの利用状況の取得 docker container stats # コンテナの掃除...Dockerの自動判断で、停止中のコンテナを吹き飛ばす docker container
prune # イメージの掃除...Dockerの自動判断で、未使用のイメージを吹き飛ばす docker image prune # 未使用のイメージ、ボリューム、コンテナなど全てお掃除 docker system prune
pruneは制限が強くていい感じにお掃除できない Spotifyのナイスガイが作成した、 Dockerのガベージコレクション(ゴミ拾い)をするスクリプトがある。 GitHubリポジトリ↓ - https://github.com/spotify/docker-gc 使い方など、参考URL↓ - https://hodalog.com/docker-garbage-collection/
お掃除系のコマンドは 注意して使うこと!
Docker Composeで マルチコンテナを実行
1つのコンテナに1つの役割 - “Each container should have only one concern.” “各コンテナは一つの関心ごとだけに専念すべきだ”
参考URL: Best practices for writing Dockerfiles ♀スケールイン・アウトや問題の切り分けが容易になる
システムは複数のアプリの組み合わせで動いている。 ↓下図のような構成だと、少なくとも4つのコンテナが必要。 しかしコンテナを1個ずつ`docker container run`するのは大変 DB (PostgreSQL, MySQL, etc...) Front-end
(React, Vue.js, etc…) Back-end API (Golang, Node.js, etc...) Middleware (Nginx, Apache, etc…)
そこでDocker Compose YMLの設定ファイルで複数のコンテナを一括管理できる
version: "3" ←YMLのバージョンを指定 services: db: container_name: django_db ←コンテナ名を指定 image: postgres:11.2
←元となるイメージを指定 web: container_name: django_web build: . ←Dockerfileを基にビルド volumes: ←ボリュームをマウント - .:/code 左側がホスト、右側がコンテナ tty: true ←擬似端末を割り当てる ports: ←ポートフォワード - 8000:8000 左側がホスト、右側がコンテナ depends_on: ←コンテナの依存関係を指定 - db この場合はdbのコンテナ起動後に webが起動する Python/Django + PostgreSQLの開発環境構築 02/ ├── Dockerfile ├── docker-compose.yml └── requirements.txt docker-compose.ymlを基に、 「db」と「web」コンテナを作成す る。
# YMLの記述にしたがってコンテナを起動 docker-compose up # デタッチドモードでコンテナを並べる docker-compose up -d #
コンテナを並べる際、dockerイメージを強制的にビルドする docker-compose up -d --build # django_webコンテナに、djangoプロジェクトを作成するコマンドを流す。 docker container exec -it django_web django-admin startproject docker_hands_on Python/Django + PostgreSQLの開発環境構築 ↑コンテナ名 ↑コンテナに実行させるコマンド
# djangoの簡易サーバーを起動 docker container exec -it django_web python docker_hands_on/manage.py runserver
0:8000 上記コマンドを実行した状態でブラウザから `localhost:8000` へアクセス # コンテナを落とす docker-compose down Python/Django + PostgreSQLの開発環境構築
永続化したいデータの 取り扱い
コンテナのデータは シャットダウンと共に消失する
03/ ├── Dockerfile ├── docker-compose.yml └── requirements.txt コンテナを吹き飛ばしても Volumeは消えない DBなどの重要なデータが揮発しないように
専用のデータボリュームを用意する # 下記コードで、データ保存用の VOLUMEがマウントされる …省略... db: …省略... volumes: - django_data_volume:/var/lib/postgresql/data ...省略... volumes: django_data_volume: Volumeを用意し、コンテナの /var/lib/postgresql/dataへマウント
# コンテナ群の起動 docker-compose up -d # ボリュームのリスト表示 docker volume ls
# コンテナ群の削除 docker-compose down # ボリュームのリスト表示...コンテナを削除しても、ボリュームは残り続ける docker volume ls ボリュームをマウントしてDBのデータを保存
環境変数の設定
MySQLやPostgresの初期設定は大変
04/ ├── code/ └── docker-compose.yml # 下記コードで、データ保存用の VOLUMEがマウントされる …省略... db:
…省略... Environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: go_dev MYSQL_USER: go_dev MYSQL_PASSWORD: go_dev ...省略... 環境変数を設定し、デプロイをスムーズに行う MySQLの環境変数 を設定
今後の学習 - Dockerfileを書いて作りたい環境を用意してみる - DockerHubにプッシュしてみる - イメージ容量をコンパクトに抑える(Alpineやレイヤー構造について理解) - Docker SwarmやKubernetesの扱い(冗長化・スケール方法など)
- Amazon ECS, EKS(クラウドを利用した本番環境の整備その1) - Google GKS(クラウドを利用した本番環境の整備その2)
予備時間・質疑タイム