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

Docker2020

Cybozu
August 19, 2020

 Docker2020

Cybozu

August 19, 2020
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

  1. VMとコンテナの違い ▌VM: ・イメージサイズが⼤きい。 ・起動が遅い。 ・ホストと異なるOSの利⽤が可能。 ▌コンテナ: ・イメージサイズが⽐較的⼩さい。 ・起動が速い。 ・ホストとカーネルを共有。 Hardware

    Hypervisor VM VM OS プロセス プロセス OS プロセス プロセス ファイル ファイル Hardware Linux コンテナ コンテナ ファイル プロセス ファイル プロセス 9
  2. MacやWindows上のDockerは︖ ▌軽量なLinux VM上でDockerを動かして いる l Docker Desktop for Mac /

    Windows l Docker toolbox (legacy) ▌注意点 l Mac版はホストとコンテナ間で共有す るファイルのアクセスが遅い l コンテナ向けの実⾏ファイルはLinux ⽤にビルドする必要がある Docker Desktop for Mac のアーキテクチャ macOS Linux VM hyperkit macの プロセス Docker Container Runtime Docker CLI コンテナ コンテナ コンテナ 11
  3. Dockerの構成 Host Computer Container Image Dockerfile Docker コンテナランタイム コンテナ レジストリ

    コンテナ コンテナ コンテナ Container Image コンテナ イメージ docker build docker run docker push docker pull 12
  4. Dockerの構成要素 ▌Dockerfile l コンテナイメージの作成⼿順を記述したファイル ▌コンテナイメージ l コンテナの実⾏に必要なファイルなどをまとめたアーカイブファイル ▌コンテナ l 実際に実⾏されているコンテナ

    ▌Dockerコンテナランタイム l コンテナを実⾏するソフトウェア ▌コンテナレジストリ l コンテナイメージを共有するためのサービス (Docker Hubなど) 13
  5. 準備: Dockerのセットアップ ▌Docker Desktop for Macを使いたい⼈ l 下記を参考にDockerをインストール l https://docs.docker.com/docker-for-mac/install/

    ▌Linux上でDockerを使いたい⼈ l 下記を参考にVirtualBoxとVagrantをインストール l https://www.virtualbox.org/wiki/Downloads l https://www.vagrantup.com/ 16
  6. よく使うDockerコマンド ▌ run : コンテナの実⾏ ▌ stop : コンテナの停⽌ ▌

    rm : コンテナの削除 ▌ ps : コンテナの確認 ▌ inspect : コンテナの詳細情報の取得 ▌ exec : コンテナ上でコマンドの実⾏ ▌ logs : コンテナのログを確認 ▌ build : コンテナイメージのビルド ▌ images : コンテナイメージの確認 ▌ rmi : コンテナイメージの削除 ▌ container prune : 停⽌コンテナの削除 ▌ image prune : 未使⽤イメージの削除 詳しくは docker <COMMAND> --help 19
  7. コンテナの起動 21 # コンテナの起動 # -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
  8. コンテナに⼊ってみる 22 # 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
  9. コンテナの後⽚付け ▌docker ps -a を実⾏してみよう ▌不要になったコンテナは docker rm コマンド または

    docker container prune コマンドで削除しよう ▌docker run の --rm オプションを活⽤しよう 24
  10. Dockerfileの書き⽅ 26 FROM quay.io/cybozu/ubuntu:18.04 # ベースとなるコンテナイメージの指定 # docker build時に実⾏される処理 COPY

    ./myapp /work/myapp # ホストからコンテナへのファイルコピー WORKDIR /work/myapp # ワークディレクトリの指定 RUN make && make install # 任意のコマンドの実⾏ # docker run時に実⾏されるコマンドや環境変数を指定 ENV PATH /usr/local/bin CMD [“myapp”, “--opt=hoge”]
  11. ⼩さなコンテナイメージをベースにする イメージ名 サイズ 特徴 scratch 0B • からっぽのイメージ。libcもshellも⼊ってない。 • OS依存の脆弱性も含まないためセキュア。

    busybox 1.2MB • Linuxのユーティリティをシングルバイナリで提供。 • シングル実⾏バイナリのベースとして使われる。 Alpine Linux 5.6MB • 軽量なLinuxディストリビューション。 • ハマりどころが多い。(Necoでは利⽤禁⽌) distroless 16.9MB 〜 • 各種⾔語⽤の実⾏に必要なランタイムだけを持つ。 • Java, Python, Node.js⽤など⾔語ごとのイメージ。 cybozu/ubuntu 103MB • Necoチームが管理しているベースイメージ。 • 適切な脆弱性対応を実施している。 31
  12. レイヤーをできるだけ少なくする FROM ubuntu:18.04 RUN apt-get update RUN apt-get install -y

    ¥ curl automake ¥ build-essential RUN rm –rf /var/lib/apt-lists/* ◦良い例 FROM ubuntu:18.04 RUN apt-get update && ¥ apt-get install -y ¥ curl automake ¥ build-essential && ¥ rm –rf /var/lib/apt-lists/* ✖悪い例 33
  13. キャッシュを意識してレイヤーを分割する例 FROM ubuntu:18.04 COPY myapp ./ RUN apt-get update &&¥

    apt-get install -y ¥ build-essential && ¥ rm –rf /var/lib/apt-lists/* && ¥ make ◦良い例 FROM ubuntu:18.04 RUN apt-get update &&¥ apt-get install -y ¥ build-essential && ¥ rm –rf /var/lib/apt-lists/* COPY myapp ./ RUN make ✖悪い例 35
  14. multi-stage buildの例 37 # Stage1: ビルド⽤コンテナ FROM quay.io/cybozu/golang:1.12-bionic AS build

    COPY ./src /work/src WORKDIR /work/src RUN go install ./... # 実⾏ファイルのビルド # Stage2: 実⾏⽤コンテナ FROM quay.io/cybozu/ubuntu:18.04 COPY --from=build /go/bin / # 実⾏ファイルを Stage1 からコピーする ENTRYPOINT [“/myapp”]
  15. コンテナイメージをビルドして動かしてみる 45 # Dockerfileのあるディレクトリに移動してビルド docker build -t helloworld:v1 . #

    Lintツールでチェックしてみる docker run --rm -i hadolint/hadolint /bin/hadolint - < Dockerfile # 確認 docker images docker history helloworld:v1 # 起動してみる docker run --r -d --name helloworld -p 3000:3000 helloworld:v1 curl localhost:3000
  16. Volumeの使い⽅ 52 # 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
  17. ひとつのコンテナにはひとつの役割 ▌コンテナは役割ごとに分割する。 ▌なぜ︖ l コンテナイメージが再利⽤しやすく なる l スケールさせやすくなる l メンテナンスしやすくなる

    コンテナ App サーバ 全⽂検索 エンジン データ ベース わるい例 コンテナ App サーバ コンテナ 全⽂検索 エンジン コンテナ データ ベース よい例 53
  18. docker-compose.ymlの記述例 55 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 # 利⽤するVolumeの⼀覧を記述 volumes: etcd-data:
  19. シグナルを処理しよう ▌docker stop を実⾏するとコンテナに SIGTERM シグナルが⾶ んでくる。 ▌シグナルを受け取ったらアプリケーションを正しく終了させる。 l Graceful

    Shutdown 機能として、ライブラリやWebサー バーが提供していることもある。 l Node.js などではシグナルの扱いに注意 (参考: PID 1問題) 57
  20. 参考情報 ▌ 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