$30 off During Our Annual Pro Sale. View Details »

Docker入門ハンズオン.pdf

hoda
March 31, 2019

 Docker入門ハンズオン.pdf

hoda

March 31, 2019
Tweet

More Decks by hoda

Other Decks in Programming

Transcript

  1. Docker入門ハンズオン
    2019.3.31

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. なぜDockerを使うのか

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. Dockerの基本概念

    View Slide

  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

    View Slide

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

    View Slide

  14. Dockerの基本操作

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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`

    View Slide

  20. Dockerfileで環境を整える

    View Slide

  21. 下記3つのファイルを基にPythonのテスト環境を作りま

    01/
    ├── Dockerfile
    ├── script.py
    └── requirements.txt
    - Dockerfile...Dockerイメージを作成するためのテキストファイル
    - script.py...Pythonのスクリプト
    - requirements.txt...Pythonライブラリのリスト

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  26. 運用管理向けのコマンド

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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…)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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の開発環境構築

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  41. 環境変数の設定

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  45. 予備時間・質疑タイム

    View Slide