Slide 1

Slide 1 text

Docker入門ハンズオン 2019.3.31

Slide 2

Slide 2 text

Whois - Hoda - 2016/7 IT業界へ転職し、ITエンジニアとしてのキャリアをスタート ↓やってきたこと - Webサービスを支えるインフラの運用・保守 - SSL/TLS証明書・AWS関連のオペレーター業務 - フロントサイドの改修・ Webページ制作・AWSクラウドサーバー構築 - PHP/WordPressベースのツール制作 - 運用フロー改善ツールの開発( Selenium、Python) - Python/DjangoベースのWebアプリ改修・開発支援 やっと開発系のお仕事に手を出せる状態になってきたところ。これから開発系の案件を全力で取りに 行ってさらなるスキルアップを目指します╭ ( ・ㅂ・)و ̑̑ グッ !"

Slide 3

Slide 3 text

スライドの見出しに がついているところは実際に 手を動かしてもらうところです

Slide 4

Slide 4 text

https://github.com/hodanov/docker-hands-on ローカルにCloneしておいてください

Slide 5

Slide 5 text

目次 - なぜDockerを使うのか - Dockerの基本概念 - Dockerの基本操作 - Dockerfileで開発環境を整える - 独自にカスタマイズしたPythonイメージの作成 - VOLUMEのマウント...ホストとコンテナ間のディレクトリ共有 - Dockerイメージの公開 - 運用管理向けのコマンド - Docker Composeでマルチコンテナを実行 - Python/Django + PostgreSQLの開発環境構築 - 永続化したいデータの扱い...VOLUMEを利用したDBのデータ保存 - 環境変数の設定

Slide 6

Slide 6 text

なぜDockerを使うのか

Slide 7

Slide 7 text

A. 環境構築のデファクトスタンダードになっている 参考URL: 2018 Docker Usage Report. 単位ホストあたりのコンテナ 型仮想環境の利用密度が急 上昇 ベアメタル環境およびVM中 心の環境からコンテナ型の 環境へ移行が進んでいる デファクトを選ぶのは大事 案件の獲得・組織におけるノウハウの集約

Slide 8

Slide 8 text

A. 管理ツールが充実している - Docker Desktop for Windows/Mac - ECS...Amazon Elastic Container Service - EKS...Amazon Elastic Container Service for Kubernetes - GKE...Google Kubernetes Engine

Slide 9

Slide 9 text

A. とても使いやすくて便利 - 冪等性(べきとうせい)の確保 →どの環境(本番も)でも同じものを用意できる。環境依存がなくなる。 - アプリケーション構成のコード化・可視化 →GitHubでのソースコード管理・共有が可能 →Nginxなどのミドルウェアを含めたシステムの構成管理がしやすくなる - ポータビリティ性の高さ →イメージで保存・再利用ができる →実行環境とアプリケーションをセットでビルドできる →しかもホスト環境を汚さない

Slide 10

Slide 10 text

このセミナーでは 最速でDockerを活用した環境構築のイメージを掴んでもらい 実務でのスムーズなキャッチアップ 開発に必要なテスト環境の構築ができるレベルを目指します

Slide 11

Slide 11 text

Dockerの基本概念

Slide 12

Slide 12 text

ホスト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

Slide 13

Slide 13 text

- Dockerコンテナ イメージを基に作成される。ファイルシステムやアプリケー ションが実行された状態。 Dockerのイメージとコンテナの関係性 - Dockerイメージ コンテナを作成するためのテンプレート。コンテナを構成する ファイルシステムや実行するアプリケーションの設定をまと めたもの。

Slide 14

Slide 14 text

Dockerの基本操作

Slide 15

Slide 15 text

バージョンの確認 # 定番 docker -v docker --version # もっと詳しく見たい時 docker version

Slide 16

Slide 16 text

Dockerイメージとコンテナの基本操作 # イメージを探す...Docker Hubのリポジトリを検索 docker search python # イメージの取得 docker image pull python:latest # イメージの取得(バージョンを指定したい時) docker image pull python:3.7 # イメージのリスト表示 docker image ls

Slide 17

Slide 17 text

# コンテナの実行 docker container run -it python:latest # -iはdocker起動後にコンテナ側の標準入力を繋ぎっぱなしにするオプション# -tは 擬似端末を有効にするオプション # -itでシェルに入ってコマンド実行などができるようになる。 # コンテナから抜ける Ctrl + P → Ctrl + Q or Ctrl + D Dockerイメージとコンテナの基本操作

Slide 18

Slide 18 text

# コンテナのリスト表示 docker container ls docker container ls -a # コンテナの停止 docker container stop XXXX # コンテナの起動 docker container start XXXX XXXXは`CONTAINER ID`または`NAMES` Dockerイメージとコンテナの基本操作

Slide 19

Slide 19 text

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`

Slide 20

Slide 20 text

Dockerfileで環境を整える

Slide 21

Slide 21 text

下記3つのファイルを基にPythonのテスト環境を作りま す 01/ ├── Dockerfile ├── script.py └── requirements.txt - Dockerfile...Dockerイメージを作成するためのテキストファイル - script.py...Pythonのスクリプト - requirements.txt...Pythonライブラリのリスト

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

ボリュームのマウント # ホストのディレクトリをボリュームとして、コンテナへマウントする docker container run -dt --name my_python -v $(pwd):/code my_python:v1 ホスト側とコンテナ側のディレクトリを共有することで、 開発をスムーズに行える

Slide 26

Slide 26 text

運用管理向けのコマンド

Slide 27

Slide 27 text

コンテナの利用状況確認やお掃除 # コンテナの利用状況の取得 docker container stats # コンテナの掃除...Dockerの自動判断で、停止中のコンテナを吹き飛ばす docker container prune # イメージの掃除...Dockerの自動判断で、未使用のイメージを吹き飛ばす docker image prune # 未使用のイメージ、ボリューム、コンテナなど全てお掃除 docker system prune

Slide 28

Slide 28 text

pruneは制限が強くていい感じにお掃除できない Spotifyのナイスガイが作成した、 Dockerのガベージコレクション(ゴミ拾い)をするスクリプトがある。 GitHubリポジトリ↓ - https://github.com/spotify/docker-gc 使い方など、参考URL↓ - https://hodalog.com/docker-garbage-collection/

Slide 29

Slide 29 text

お掃除系のコマンドは 注意して使うこと!

Slide 30

Slide 30 text

Docker Composeで マルチコンテナを実行

Slide 31

Slide 31 text

1つのコンテナに1つの役割 - “Each container should have only one concern.” “各コンテナは一つの関心ごとだけに専念すべきだ” 参考URL: Best practices for writing Dockerfiles  ♀スケールイン・アウトや問題の切り分けが容易になる

Slide 32

Slide 32 text

システムは複数のアプリの組み合わせで動いている。 ↓下図のような構成だと、少なくとも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…)

Slide 33

Slide 33 text

そこでDocker Compose YMLの設定ファイルで複数のコンテナを一括管理できる

Slide 34

Slide 34 text

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」コンテナを作成す る。

Slide 35

Slide 35 text

# 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の開発環境構築 ↑コンテナ名 ↑コンテナに実行させるコマンド

Slide 36

Slide 36 text

# djangoの簡易サーバーを起動 docker container exec -it django_web python docker_hands_on/manage.py runserver 0:8000 上記コマンドを実行した状態でブラウザから `localhost:8000` へアクセス # コンテナを落とす docker-compose down Python/Django + PostgreSQLの開発環境構築

Slide 37

Slide 37 text

永続化したいデータの 取り扱い

Slide 38

Slide 38 text

コンテナのデータは シャットダウンと共に消失する

Slide 39

Slide 39 text

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へマウント

Slide 40

Slide 40 text

# コンテナ群の起動 docker-compose up -d # ボリュームのリスト表示 docker volume ls # コンテナ群の削除 docker-compose down # ボリュームのリスト表示...コンテナを削除しても、ボリュームは残り続ける docker volume ls ボリュームをマウントしてDBのデータを保存

Slide 41

Slide 41 text

環境変数の設定

Slide 42

Slide 42 text

MySQLやPostgresの初期設定は大変

Slide 43

Slide 43 text

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の環境変数 を設定

Slide 44

Slide 44 text

今後の学習 - Dockerfileを書いて作りたい環境を用意してみる - DockerHubにプッシュしてみる - イメージ容量をコンパクトに抑える(Alpineやレイヤー構造について理解) - Docker SwarmやKubernetesの扱い(冗長化・スケール方法など) - Amazon ECS, EKS(クラウドを利用した本番環境の整備その1) - Google GKS(クラウドを利用した本番環境の整備その2)

Slide 45

Slide 45 text

予備時間・質疑タイム