Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker入門ハンズオン.pdf

6f114f6f8a30c4a5bde5f6c91d5c2935?s=47 hoda
March 31, 2019

 Docker入門ハンズオン.pdf

6f114f6f8a30c4a5bde5f6c91d5c2935?s=128

hoda

March 31, 2019
Tweet

Transcript

  1. Docker入門ハンズオン 2019.3.31

  2. Whois - Hoda - 2016/7 IT業界へ転職し、ITエンジニアとしてのキャリアをスタート ↓やってきたこと - Webサービスを支えるインフラの運用・保守 -

    SSL/TLS証明書・AWS関連のオペレーター業務 - フロントサイドの改修・ Webページ制作・AWSクラウドサーバー構築 - PHP/WordPressベースのツール制作 - 運用フロー改善ツールの開発( Selenium、Python) - Python/DjangoベースのWebアプリ改修・開発支援 やっと開発系のお仕事に手を出せる状態になってきたところ。これから開発系の案件を全力で取りに 行ってさらなるスキルアップを目指します╭ ( ・ㅂ・)و ̑̑ グッ !"
  3. スライドの見出しに がついているところは実際に 手を動かしてもらうところです

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

  5. 目次 - なぜDockerを使うのか - Dockerの基本概念 - Dockerの基本操作 - Dockerfileで開発環境を整える -

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

  7. A. 環境構築のデファクトスタンダードになっている 参考URL: 2018 Docker Usage Report. 単位ホストあたりのコンテナ 型仮想環境の利用密度が急 上昇

    ベアメタル環境およびVM中 心の環境からコンテナ型の 環境へ移行が進んでいる デファクトを選ぶのは大事 案件の獲得・組織におけるノウハウの集約
  8. A. 管理ツールが充実している - Docker Desktop for Windows/Mac - ECS...Amazon Elastic

    Container Service - EKS...Amazon Elastic Container Service for Kubernetes - GKE...Google Kubernetes Engine
  9. A. とても使いやすくて便利 - 冪等性(べきとうせい)の確保 →どの環境(本番も)でも同じものを用意できる。環境依存がなくなる。 - アプリケーション構成のコード化・可視化 →GitHubでのソースコード管理・共有が可能 →Nginxなどのミドルウェアを含めたシステムの構成管理がしやすくなる -

    ポータビリティ性の高さ →イメージで保存・再利用ができる →実行環境とアプリケーションをセットでビルドできる →しかもホスト環境を汚さない
  10. このセミナーでは 最速でDockerを活用した環境構築のイメージを掴んでもらい 実務でのスムーズなキャッチアップ 開発に必要なテスト環境の構築ができるレベルを目指します

  11. Dockerの基本概念

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

  14. Dockerの基本操作

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

    version
  16. Dockerイメージとコンテナの基本操作 # イメージを探す...Docker Hubのリポジトリを検索 docker search python # イメージの取得 docker

    image pull python:latest # イメージの取得(バージョンを指定したい時) docker image pull python:3.7 # イメージのリスト表示 docker image ls
  17. # コンテナの実行 docker container run -it python:latest # -iはdocker起動後にコンテナ側の標準入力を繋ぎっぱなしにするオプション# -tは

    擬似端末を有効にするオプション # -itでシェルに入ってコマンド実行などができるようになる。 # コンテナから抜ける Ctrl + P → Ctrl + Q or Ctrl + D Dockerイメージとコンテナの基本操作
  18. # コンテナのリスト表示 docker container ls docker container ls -a #

    コンテナの停止 docker container stop XXXX # コンテナの起動 docker container start XXXX XXXXは`CONTAINER ID`または`NAMES` Dockerイメージとコンテナの基本操作
  19. 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`
  20. Dockerfileで環境を整える

  21. 下記3つのファイルを基にPythonのテスト環境を作りま す 01/ ├── Dockerfile ├── script.py └── requirements.txt -

    Dockerfile...Dockerイメージを作成するためのテキストファイル - script.py...Pythonのスクリプト - requirements.txt...Pythonライブラリのリスト
  22. 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
  23. 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
  24. 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
  25. ボリュームのマウント # ホストのディレクトリをボリュームとして、コンテナへマウントする docker container run -dt --name my_python -v

    $(pwd):/code my_python:v1 ホスト側とコンテナ側のディレクトリを共有することで、 開発をスムーズに行える
  26. 運用管理向けのコマンド

  27. コンテナの利用状況確認やお掃除 # コンテナの利用状況の取得 docker container stats # コンテナの掃除...Dockerの自動判断で、停止中のコンテナを吹き飛ばす docker container

    prune # イメージの掃除...Dockerの自動判断で、未使用のイメージを吹き飛ばす docker image prune # 未使用のイメージ、ボリューム、コンテナなど全てお掃除 docker system prune
  28. pruneは制限が強くていい感じにお掃除できない Spotifyのナイスガイが作成した、 Dockerのガベージコレクション(ゴミ拾い)をするスクリプトがある。 GitHubリポジトリ↓ - https://github.com/spotify/docker-gc 使い方など、参考URL↓ - https://hodalog.com/docker-garbage-collection/

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

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

  31. 1つのコンテナに1つの役割 - “Each container should have only one concern.” “各コンテナは一つの関心ごとだけに専念すべきだ”

    参考URL: Best practices for writing Dockerfiles  ♀スケールイン・アウトや問題の切り分けが容易になる
  32. システムは複数のアプリの組み合わせで動いている。 ↓下図のような構成だと、少なくとも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…)
  33. そこでDocker Compose YMLの設定ファイルで複数のコンテナを一括管理できる

  34. 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」コンテナを作成す る。
  35. # 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の開発環境構築 ↑コンテナ名 ↑コンテナに実行させるコマンド
  36. # djangoの簡易サーバーを起動 docker container exec -it django_web python docker_hands_on/manage.py runserver

    0:8000 上記コマンドを実行した状態でブラウザから `localhost:8000` へアクセス # コンテナを落とす docker-compose down Python/Django + PostgreSQLの開発環境構築
  37. 永続化したいデータの 取り扱い

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

  39. 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へマウント
  40. # コンテナ群の起動 docker-compose up -d # ボリュームのリスト表示 docker volume ls

    # コンテナ群の削除 docker-compose down # ボリュームのリスト表示...コンテナを削除しても、ボリュームは残り続ける docker volume ls ボリュームをマウントしてDBのデータを保存
  41. 環境変数の設定

  42. MySQLやPostgresの初期設定は大変

  43. 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の環境変数 を設定
  44. 今後の学習 - Dockerfileを書いて作りたい環境を用意してみる - DockerHubにプッシュしてみる - イメージ容量をコンパクトに抑える(Alpineやレイヤー構造について理解) - Docker SwarmやKubernetesの扱い(冗長化・スケール方法など)

    - Amazon ECS, EKS(クラウドを利用した本番環境の整備その1) - Google GKS(クラウドを利用した本番環境の整備その2)
  45. 予備時間・質疑タイム