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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
730
Other Decks in Programming
See All in Programming
A2UI という光を覗いてみる
satohjohn
1
150
Inside Stream API
skrb
1
770
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
210
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
190
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.7k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
280
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.8k
New "Type" system on PicoRuby
pocke
1
1k
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
920
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
140
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
190
Build your cross-platform service in a week with App Engine
jlugia
234
18k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
240
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
240
Product Roadmaps are Hard
iamctodd
PRO
55
12k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
140
Chasing Engaging Ingredients in Design
codingconduct
0
230
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Technical Leadership for Architectural Decision Making
baasie
3
420
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)
予備時間・質疑タイム