Docker

Webエンジニアになろう講習会 第8回

自己紹介

renkonのプロフィール画像

renkon

dotfiles入門しました
インフラやってます

前回のおさらい

テスト

テスト

  • コードの品質・仕様書どおりの動作を保証
  • テストの分類
    • 正常系 / 準正常系 / 異常系
    • ブラックボックステスト / ホワイトボックステスト
    • Unit test / Integration test / End-to-End test

Mocking

  • 実際のサーバアプリケーション等の代わりをしてくれる
  • テスト形式に応じて必要な要素のみ実装する
    • 決まったレスポンスを返すだけ、など
    • 例えば、フロントエンドのテストのためにサーバー側の処理を全て書く必要はない

CI / CD

CI

  • Continuous Integration

    継続的インテグレーション

  • 自動で整合性や挙動をチェック
    • テスト
    • Linter / Formatter

CD

  • Continuous Deployment

    継続的デプロイ

  • 継続的に最新のソフトを提供
  • Continuous Delivery(継続的デリバリー)を指すことも

GitHub Actions

  • GitHub 公式の CI / CD 環境
  • 多様な OS・CPU Arch が利用可能
    • Ubuntu / macOS など
  • 公式の Action のほかにマーケットで公開されている Action も使用可能
  • 類似製品
    • GitLab CI/CD
    • Jenkins
    • CircleCI

目次

座学

  • Docker とはなにか
  • コンテナ概論
  • Docker Image について
  • Docker Volume について
  • Docker Network について

実習

  • Dockerfile の書き方
  • compose.yaml の書き方

目次

座学

  • Docker とはなにか
  • コンテナ概論
  • Docker Image について
  • Docker Volume について
  • Docker Network について

実習

  • Dockerfile の書き方
  • compose.yaml の書き方

Docker とは

  • コンテナ型の仮想環境を作成・配布・実行するツール
  • 言語やフレームワーク、アーキテクチャ、そして様々なツール間の連携といった複雑化する開発環境を簡略化し、開発体験を向上するために開発
  • 標準化された規格やソフトウェア群、それらを支えるためのサービス、ドキュメントやコミュニティを総称して Docker という

Docker とは

  • コンテナ型の仮想環境を作成・配布・実行するツール
  • 言語やフレームワーク、アーキテクチャ、そして様々なツール間の連携といった複雑化する開発環境を簡略化し、開発体験を向上するために開発
  • 標準化された規格やソフトウェア群、それらを支えるためのサービス、ドキュメントやコミュニティを総称して Docker という

環境とは

  • 開発物を動かすときの背景となるものの総称
    • 言語のコンパイラ・ランタイム
    • 環境変数
    • OS
    • ハードウェア
    • 依存関係
  • つまり、ソースコード以外の全て

仮想環境とは

  • それぞれのコンピューターから独立した仮想的な環境
  • 実現方法
    • ホスト型 ... VMware Player, VirtualBox など
    • ハイパーバイザー型 ... Hyper-V, Virtualization.framework など
    • コンテナ型 ... LXC/LXD, Docker, Podman など

Dockerを使う理由

全ての依存関係をパッケージ化し、コンテナとして動かす

パッケージの作成、配布、実行がDockerの役割

目次

座学

  • Docker とはなにか
  • コンテナ概論
  • Docker Image について
  • Docker Volume について
  • Docker Network について

実習

  • Dockerfile の書き方
  • compose.yaml の書き方

Docker とは

  • コンテナ型の仮想環境を作成・配布・実行するツール
  • 言語やフレームワーク、アーキテクチャ、そして様々なツール間の連携といった複雑化する開発環境を簡略化し、開発体験を向上するために開発
  • 標準化された規格やソフトウェア群、それらを支えるためのサービス、ドキュメントやコミュニティを総称して Docker という

仮想化技術

コンテナ型

  • ホストのカーネルを共有する
  • 起動が早く、実行時のオーバーヘッドが小さい
  • プロセスから見える資源を分離・制限する

仮想化技術

ハイパーバイザー型

  • OS のフルコピーを一つのハードウェア上で動かす
  • 容量が大きい (GB 単位)

プロセス

プロセス

プロセス

プロセス

コンテナとは

  • 特別な状態で実行されるプロセス群
  • Linuxカーネルの一部であるnamespacesやcgroupsなどを用いて実現される
  • namespaces
    • PID・ファイルシステム・ネットワーク・ホスト名・UID/GIDなどの分離
  • cgroups
    • CPU・メモリ・I/O・プロセス数など、使用できる資源を制限する

コンテナとは

Dockerでは?

Docker について

  • Linux の機能をベースにしている
    • macOS や Windows のネイティブでは動かない
    • 仮想マシンを立てて動かしている
  • Docker (dockerd) が仲介
    • コンテナの起動や操作

パッケージ化した利点

  • ホストの環境が異なっても簡単にアプリケーションを動かせる
  • 「ある環境をちょっと変更したもの」を簡単に作れる
    • ある Dockerfile を参考に Dockerfile が書ける
  • 必要な環境をコードとして残せる
    • Dockerfile というファイルに手順を記述する
  • 環境を手軽に共有できる
    • Docker Hub のようなイメージレジストリが利用できる

目次

座学

  • Docker とはなにか
  • コンテナ概論
  • Docker Image について
  • Docker Volume について
  • Docker Network について

実習

  • Dockerfile の書き方
  • compose.yaml の書き方

Docker Image とは

  • コンテナの雛形 (動かす前の初期状態を規定するもの)
  • 複数の イメージ / レイヤー の積み重ね
  • layers
    • マウントする root filesystem に加えられた変更のまとまり
  • metadata
    • ビルド手順・環境変数・タイムスタンプ…

Docker Image とは

Docker Image とは

レイヤー構造になっている利点

  • 変更されていないレイヤーを再利用できる
    • ビルドキャッシュを利用できる
    • 複数のイメージ間で同じレイヤーを共有できる
    • 配布時に必要なレイヤーだけ取得できる

Docker における コンテナ とは

コンテナの利用方法

  1. イメージ を用意
    • Dockerfile からビルドする
    • レジストリから pull する
  2. 読み込む環境変数・設定ファイル等を指定する
  3. イメージ から コンテナ を作成・起動

イメージとコンテナの関係はクラスとインスタンスみたいなもの

目次

座学

  • Docker とはなにか
  • コンテナ概論
  • Docker Image について
  • Docker Volume について
  • Docker Network について

実習

  • Dockerfile の書き方
  • compose.yaml の書き方

Volume とは

Docker コンテナ内のデータを永続化する手段

  • Container の書き込み可能なレイヤーとは別にデータを保存する
  • Container を削除しても、Volume は削除されずに残る
  • サーバーアプリケーションに対する DB と似た関係性
  • Volume の他にも Bind Mount, tmpfs Mount などがある

Volume とは

Volume とは

目次

座学

  • Docker とはなにか
  • コンテナ概論
  • Docker Image について
  • Docker Volume について
  • Docker Network について

実習

  • Dockerfile の書き方
  • compose.yaml の書き方

Network とは

  • コンテナ同士や、コンテナとホスト・外部ネットワークをつなぐ仕組み
  • 代表的なネットワークモデルは以下の 3 つ
    • bridge: 仮想ネットワークでコンテナ間を接続。ホストとコンテナのポートをマッピングする。
    • host: ホストのネットワークを共有。ポートマッピングは使用しない
    • none: 疎通しない

Network とは

参考資料

まとめ

Docker とは

  • コンテナ型の仮想環境を作成・実行するツール
  • 言語やフレームワーク、アーキテクチャ、そして様々なツール間の連携といった複雑化する開発環境を簡略化し、開発体験を向上するために開発
  • 標準化された規格やソフトウェア群、それらを支えるためのサービス、ドキュメントやコミュニティを総称して Docker という

仮想化技術

コンテナ型

  • 軽量で起動が早い
  • namespaces, cgroups で資源を隔離

ハイパーバイザー型

  • OSのフルコピーを動かす
  • 容量が大きく起動が遅い

コンテナ

Docker Image とは

Docker における コンテナ とは

Volume とは

Network とは

目次

座学

  • Docker とはなにか
  • コンテナ概論
  • Docker Image について
  • Docker Volume について
  • Docker Network について

実習

  • Dockerfile の書き方
  • compose.yaml の書き方