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
670
ReactとPython/Djangoで何か作りたい
hodanov
1
730
Other Decks in Programming
See All in Programming
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
850
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.5k
共通化で考えるべきは、実装より公開する型だった
codeegg
0
240
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
100
Foundation Models frameworkで画像分析
ryodeveloper
1
120
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
330
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
450
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
180
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
From π to Pie charts
rasagy
0
240
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Building AI with AI
inesmontani
PRO
1
1.1k
The Invisible Side of Design
smashingmag
301
52k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
720
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)
予備時間・質疑タイム