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

2019-10 Docker

Cybozu
June 24, 2019

2019-10 Docker

Cybozu

June 24, 2019
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

  1. サイボウズでのコンテナ事情 ▌開発 ⚫ いくつかの開発チームでは開発環境としてDockerを利用 ▌テスト ⚫ CircleCIやJenkinsの実行環境としてDockerを利用 → 詳しくは開運研修「CI/CD」で ▌運用

    ⚫ YakumoやNecoでは、ほとんどのソフトウェアをKubernetes 上でコンテナとして動作させている → 詳しくは開運研修「Kubernetesを使った開発入門」で 5
  2. コンテナ利用のメリット ▌Batteries included, but removable ▌Build once, Run anywhere ▌アプリケーションの動作環境を丸ごとパッケージにまとめて、ひと

    つのファイルとして扱うことができる。 ▌開発・テスト・本番でソフトウェアの実行環境のギャップを小さく することができる。「手元で動いたのに!?」が減らせる。 ▌VMと比較して軽量であるため扱いやすく、リソースの利用効率も 高くなる。 7
  3. VMとコンテナの違い Hardware Hypervisor VM VM OS プロセス プロセス OS プロセス

    プロセス Hardware Linux コンテナ コンテナ ファイル プロセス ファイル プロセス VM: ・仮想的なサーバを用意し、その上にOSを セットアップ。 ・イメージサイズが大きい。 ・起動が遅い(OSの起動時間)。 ・ホストと異なるOSを動かすことができる。 コンテナ: ・Linuxカーネルの機能を利用してプロセス を隔離。 ・イメージサイズが比較的小さい。 ・起動が速い(通常のプロセスと同等)。 ・ホストとカーネルを共有。 ファイル ファイル 9
  4. コンテナを実現するための技術要素 ▌Linux namespace ⚫ プロセスに対して、PID空間、ネットワーク空間、ユーザー空間、 ホスト名などのリソースを分離することができる。 ▌cgroups ⚫ CPUやメモリなどのリソースを制限・隔離することができる。 ⚫

    開運研修「LinuxサーバのCPUやメモリリソースの管理につい て」で詳しく解説。 ▌Linux capability ⚫ 特権ポートへのアクセスやiptablesへのアクセス権などの権限を 制御することができる。 10
  5. Host Computer Dockerの構成 Container Image Dockerfile Docker Container Runtime Container

    Registry Container Container Container Container Image Container Image docker build docker run docker push docker pull 11
  6. Dockerの構成要素 ▌ Dockerfile ⚫ Container Imageの作成手順を記述したファイル ▌ Container Image ⚫

    コンテナの実行に必要なファイルなどをまとめたアーカイブファイル ▌ Container ⚫ 実際に実行されているコンテナ ▌ Docker Container Runtime ⚫ コンテナを実行するソフトウェア ▌ Container Registry ⚫ Container Imageを共有するためのサービス ⚫ Docker Hub, Quay.io, GCR(Google Container Registry)など 12
  7. MacやWindows上のDockerは? ▌軽量なLinux VM上でDockerを動かしている ⚫ Docker Desktop for Mac / Windows

    ⚫ Docker toolbox (legacy) ▌注意点 ⚫ Mac版はホストとコンテナ間で共有する ファイルのアクセスが遅い ⚫ Docker DesktopはWindows Home Editionで動かない (WSL2対応で改善) ⚫ コンテナ向けの実行ファイルはLinux用に ビルドする必要がある macOS Linux VM hyperkit macの プロセス Docker Container Runtime Docker CLI コンテナ コンテナ コンテナ Docker Desktop for Mac のアーキテクチャ 13
  8. 準備 ▌Dockerのセットアップ ⚫ Docker Desktop for Macを使いたい人 ⚫ https://docs.docker.com/docker-for-mac/install/ ⚫

    VMを立ててやってみたい人 ⚫ https://www.virtualbox.org/wiki/Downloads ⚫ https://www.vagrantup.com/ ▌サンプルファイルの取得 ⚫ git clone https://github.com/zoetrope/training- docker.git 16
  9. よく使うDockerコマンド ▌ run : コンテナの実行 ▌ stop : コンテナの停止 ▌

    rm : コンテナの削除 ▌ ps : コンテナの確認 ▌ container prune : 停止しているコンテナの削除 ▌ inspect : コンテナの詳細情報の取得 ▌ exec : コンテナ上でコマンドの実行 ▌ logs : コンテナのログを確認 ▌ build : コンテナイメージのビルド ▌ images : コンテナイメージの確認 ▌ rmi : コンテナイメージの削除 ▌ image prune : 未使用コンテナイメージの削除 詳しくは docker <COMMAND> --help 18
  10. コンテナの起動 # コンテナの起動 # -d: バックグラウンドで起動 # --name: コンテナに名前をつける(省略した場合は自動で名前がつく) #

    -p 8080:80: コンテナの80番ポートをホストの8080番ポートにバインド docker run -d --name mynginx -p 8080:80 nginx:latest # 起動しているコンテナの確認 # コンテナの停止・削除 docker ps docker stop mynginx curl localhost:8080 docker rm mynginx docker logs mynginx 20
  11. コンテナに入ってみる # ubuntu-debugコンテナ上でbashを実行する # -i: STDINをオープンし続ける -t: 擬似端末を割り当てる # --rm:

    コンテナ終了時にコンテナを自動削除 docker run -it --rm quay.io/cybozu/ubuntu-debug:18.04 /bin/bash # いろんなコマンドを叩いて、コンテナ内のプロセスやファイルシステム、 # ネットワークの状態などを確認してみる ls hostname ip a ps aux 21
  12. Dockerfileの書き方 FROM quay.io/cybozu/ubuntu:18.04 COPY ./myapp /work/myapp WORKDIR /work/myapp RUN make

    && make install ENV PATH /usr/local/bin CMD [“myapp”, “--opt=hoge”] ベースとなるコンテナイメージを指定 docker build時に実行する操作を記述する COPY: ホストからコンテナにファイルを コピー WORKDIR: ワーキングディレクトリの指定 RUN: 任意のコマンドの実行 docker run時に実行されるコマンドや 環境変数などを指定 24
  13. コンテナイメージ レイヤーを意識する FROM quay.io/cybozu/ubuntu:18.04 RUN hostname > hostname.txt RUN date

    > date.txt RUN cat hostname.txt date.txt > id.txt RUN rm hostname.txt date.txt ubuntuイメージのファイル hostname.txtの追加 date.txtの追加 id.txtの追加 hostname.txtとdate.txtの削除 RUNやCOPYを実行するたびに、read-onlyなレイヤーが 積み重なっていく。 不要な中間ファイルをレイヤーに含めると、コンテナイメージ のサイズが無駄に大きくなってしまう。 30
  14. multi-stage build ▌ ひとつのDockerfileを複数のス テージに分けて記述することがで きる。 ▌ ビルド用コンテナで生成したファ イルを実行用コンテナにコピー。 ▌

    最終ステージのみがイメージとし て保存される。 ▌ ビルドに必要なツールや中間ファ イルなどが実行用コンテナに含ま れないため、イメージサイズを小 さくできる! # Stage1: build from source FROM quay.io/cybozu/golang:1.12-bionic AS build COPY ./src /work/src WORKDIR /work/src RUN go install ./... # Stage2: setup runtime container FROM quay.io/cybozu/ubuntu:18.04 COPY --from=build /go/bin / ENTRYPOINT [“/myapp”] 32
  15. 小さなコンテナイメージをベースにする イメージ名 サイズ 特徴 scratch 0B • からっぽのイメージ。libcもshellも入ってない。 • Go言語などでシングル実行可能なバイナリを作れば、イメージサイズは

    非常に小さくなり、OS依存の脆弱性も含まないためセキュア。 busybox 1.2MB • Linuxのユーティリティをシングルバイナリで提供。 • scratch同様、シングル実行バイナリのベースとして使われる。 Alpine Linux 5.6MB • 軽量なLinuxディストリビューション。 • ハマりどころも多いので利用には注意が必要。(Necoでは利用禁止) distroless 16.9MB~ • 実行に必要なものだけを持つイメージ。multi-stage buildと組み合わせて 使いやすい。 • Java, Python, Node.js用などランタイムごとにイメージが用意されてい る。 cybozu/ubuntu 103MB • Necoチームが管理しているベースイメージ。 33
  16. コンテナイメージをビルドして動かしてみる # Dockerfileのあるディレクトリに移動してビルド docker build -t hello:v1 . # Lintツールでチェックしてみる

    docker run --rm -i hadolint/hadolint /bin/hadolint - < Dockerfile # 確認 docker images docker history hello:v1 # 起動してみる docker run --r -d --name hello -p 3000:3000 hello:v1 curl localhost:3000 42
  17. Volumeの使い方 # volumeを作成する docker volume create vol1 docker volume ls

    # volumeをマウントしてコンテナを起動 docker run -it --name ubuntu -v vol1:/mnt/data quay.io/cybozu/ubutun:18.04 bash > touch /mnt/data/hoge.txt # コンテナを削除、もう一度コンテナを立ち上げ直してファイルの存在を確認 docker rm ubuntu docker run -it --name ubuntu -v vol1:/mnt/data quay.io/cybozu/ubutun:18.04 bash > ls /mnt/data 47
  18. ひとつのコンテナにはひとつの役割 コンテナ App サーバ 全文検索 エンジン データ ベース コンテナ App

    サーバ コンテナ 全文検索 エンジン コンテナ データ ベース ▌コンテナは役割ごとに分割する。 ▌なぜ? ⚫ コンテナイメージが再利用しやすく なる ⚫ スケールさせやすくなる ⚫ メンテナンスしやすくなる ⚫ エラー時の復旧 ⚫ バージョンアップ わるい例 よい例 48
  19. docker-compose ▌docker-composeを利用すると、 複数のコンテナの起動を管理で きる。 ▌起動・停止 ⚫ docker-compose up ⚫ docker-compose

    down ▌03_application/compose参照 49 version: '3' services: etcd: container_name: etcd image: quay.io/cybozu/etcd:3.3 ports: - 2379 volumes: - etcd-data:/var/lib/etcd todo: container_name: todo image: todo:v1 ports: - 9000:9000 volumes: etcd-data:
  20. シグナルを処理しよう ▌docker stop コマンドを実行した場合や、Kubernetes がコン テナを終了させるときに、コンテナに SIGTERM シグナルが飛 んでくる。 ▌シグナルを処理して、アプリケーションを正しく終了させる。

    ⚫ Graceful Shutdown: 新規のリクエストは受け付けず、現 在処理中のリクエストを正常に処理してから、プログラム を終了させる。 ⚫ ライブラリやWebサーバーの機能として提供されているこ とも多い。 51
  21. コンテナアプリケーションを安全に動かす ▌最新のDockerを利用する ▌docker.socketファイルの扱いに注意 ⚫ docker.socketへのアクセスは root 権限に等しい ▌rootユーザーやprivilegedで実行しない ⚫ --cap-drop=allを指定して、

    必要なcapabilityを個別に指定する ▌ホストへのアクセスは最小限に ▌秘密情報をコンテナイメージに含めない ▌コンテナイメージの脆弱性チェック ⚫ Quay.ioの脆弱性チェック機能 → 55
  22. 体系立てられたDockerコマンド ▌dockerコマンドが複雑になりすぎたので再編成 ⚫ docker container ⚫ docker ps -> docker

    container ls ⚫ docker run -> docker container run ⚫ docker image ⚫ docker images -> docker image ls ⚫ docker rmi -> docker image rm ⚫ docker build -> docker image build ▌でも短い方が便利なので使い続けてしまう・・・ 62
  23. 参考情報 ▌ Docker: Up & Running, 2nd Edition ▌ 分散システムデザインパターン

    ▌ Software Design 2019年6月号 「IT業界ビギナーのためのDocker+k8s入門講座」 ▌ Dockerfileを改善するためのBest Practice 2019年版 ▌ Dockerfileを書くためのベストプラクティス解説編 ▌ Base Image Journey 2018 ▌ Best practices for building containers ▌ Best Practices for Operating Containers ▌ The Twelve-Factor App ▌ コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう 65