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

ゆるふわなDockerの使い方

 ゆるふわなDockerの使い方

2017年2月の研究室Docker布教のときの資料です。

metaVariable

March 02, 2017
Tweet

More Decks by metaVariable

Other Decks in Technology

Transcript

  1. • 今回のセッションはハンズオンではありません • とはいえ手元に動く環境がある方がよいです • 適当な環境(VMなど)にdocker engineを 導入しておくと捗ると思います • Install

    Docker Engine • https://docs.docker.com/engine/installation/ • mac) https://docs.docker.com/docker-for-mac/ • win) https://docs.docker.com/docker-for-windows/ おすすめ 2
  2. はじめに|前回の論文輪講(引用) 7 Case Perf. Category Docker KVM A, B CPU

    Good Bad* C Memory Bandwidth (sequential) Good Good D Memory Bandwidth (Random) Good Good E Network Bandwidth Acceptable* Acceptable* F Network Latency Bad Bad G Block I/O (Sequential) Good Good G Block I/O (RandomAccess) Good (Volume Option) Bad Comparing to native performance … equal = Good a little worse = Acceptable worse = Bad * = depends case or tuning
  3. 1. Dockerのいいところを知る  基本的な概念のゆるふわ理解 2. Dockerの基本的な使い方を知る  代表的なコマンドの使い方  Dockerイメージを触ってみる

     Dockerfileからイメージをビルドしてみる 3. Dockerのサービスのデプロイ方法を知る  docker-composeを使ってみる はじめに|今日の目標 8
  4. 概要|Dockerってなに 11 http://www.bigdatatraining.in/docker-training-gurgaon/ コンテナ型仮想化を実現するプラットフォーム 開発したアプリを 依存ライブラリを含めた コンテナイメージを DockerHubで公開 コンテナイメージは実行環境を 含むため、ダウンロードして

    すぐに実行可能 クラウドにある別のLinuxOS でも、すぐに実行可能 コンテナ型仮想化により、コンテナ内部のアプリは • ホストOSの既存のライブラリに依存しない • ホストOSの種類に依存しない
  5. 仮想マシン(e.g. KVM)とコンテナ型仮想化(e.g. Docker) 概要|コンテナ型仮想化とは 13 Container-based Virtualization Hardware Host Operating

    System Docker Engine App Bins/Libs App Bins/Libs Hardware Host Operating System Hypervisor-based Virtualization App Guest OS Bins/Libs App Guest OS Bins/Libs Hypervisor VM1 VM2 Container 1 Container 2 • ホストOS上でカーネルを共有して動作する • 依存するバイナリ/ライブラリはコンテナごとに隔離される • ホストOSからは各コンテナはそれぞれプロセスとして見える → アプリケーションに必要な実行環境をプロセスレベルで仮想化する
  6. Docker • コンテナ型仮想化を実現するプラットフォーム(OSSによる開発) • コンテナイメージに積層型ファイルシステムを採用 (AUFS) • DockerHub等のレジストリサービスでイメージを共有可能 • コンテナ管理の様々なコンポーネント充実

    • Docker Engine … コンテナ管理のコアな機能 • Docker Compose … 複数コンテナの連携 • Docker Machine … 仮想マシン管理 • Docker Swarm … クラスタ上のコンテナ管理 … 概要| Docker 14 Hardware Host Operating System Docker Engine App Bins/Libs App Bins/Libs
  7. AUFS (Advanced multi layered unification filesystem) [12] • 積層型のファイルシステム •

    ファイルシステムの内容の差分を層として記録する • 層毎にハッシュ値が割り振られて管理されている • Dockerではコンテナイメージの管理に採用 • コンテナ間で同じ層は再利用される(容量削減) • 差分管理により、コンテナイメージの操作を巻き戻すことが可能 概要| AUFS 15 [12] Advanced multi layered unification filesystem. http://aufs.sourceforge.net, 2014.
  8. • 公式が親切なので参考にして下さい • [検索] [ docker install ] • Linux環境を想定します

    • dockerの実行には root権限が必要なので注意 • 仮想マシン上をおすすめ • win, macならこの辺でも… • Docker for mac • Docker for Windows 使い方|インストール 18
  9. • $ docker run hello-world • Hello-Worldコンテナを実行するコマンド 使い方|Hello World !

    19 -bash-4.2$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 78445dd45222: Pull complete Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. …
  10. • $ docker run hello-world • Hello-Worldイメージからコンテナを実行するコマンド 使い方|Hello World !

    20 docker run hello-world Docker client Docker daemon Docker Hub イメージの確認 hello-worldイメージ コンテナの作成 hello-worldイメージ “Hello from Docker!” イメージの問い合わせ
  11. • $ docker images • Dockerがローカルに持つイメージを一覧表示 • $ docker ps

    [-a] • Dockerのコンテナを一覧表示 -a : 停止中のコンテナも含め表示 -q : コンテナのIDだけを表示 -l : 直近で表示したコンテナのIDを表示 使い方|docker images / ps 22 -bash-4.2$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 48b5124b2768 3 weeks ago 1.84 kB … -bash-4.2$ docker ps –a CONTAINER ID IMAGE COMMAND CREATED STATUS … 73ee37498516 hello-world "/hello" 2 seconds ago Exited (0) 1 seconds ago …
  12. • ユースケース 1. DockerHubから公式イメージを取得して 2. コンテナの中で任意の作業を行い 3. DockerHubの自分のリポジトリに登録したい 使い方|イメージの変更と登録 23

    コマンド やりたいこと docker pull DockerHubからイメージを取得(省略可) docker run –it 取得したイメージからコンテナを起動 (任意の作業) コンテナの中で任意の作業 (ソフトウェアのインストールなど) docker commit コンテナをイメージとして出力 docker push 出力したイメージをDockerHubに登録
  13. • $ docker run –it [image:tag] [command] 使い方|docker run -it

    24 run -it : コンテナ内の標準入力と接続する([command]を実行する) [image] : DockerHub等に登録されたイメージ名を指定 [tag] : イメージに紐付いたタグ(バージョン)を指定(省略時はlatest) # ubuntu:latestのイメージを指定してコンテナでbashを実行 -bash-4.2$ docker run -it ubuntu:latest bash root@c5a53f74e366:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var # ubuntuのバージョン確認 root@c5a53f74e366:/# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS“ # exitで終了、またはCtrl+P, Ctrl+Q を入力してコンテナを抜ける root@c5a53f74e366:/# exit
  14. • $ docker commit [container_id] [image_name:tag] • 指定したIDのコンテナを 指定したイメージ名:タグとしてイメージ化する 使い方|docker

    commit 25 # 終了(または離脱)したコンテナのIDを確認 -bash-4.2$ docker ps –a CONTAINER ID IMAGE COMMAND CREATED STATUS … c5a53f74e366 ubuntu "bash" 21 minutes ago Up 21 minutes … # コンテナをイメージとして出力 -bash-4.2$ docker commit c5a53f74e366 ubuntu:test sha256:8d009929cb0ea45e8ccf4bf3933148837788f56ee4a49eaf89dd449ece85b0ee # コミットしたイメージを確認 -bash-4.2$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE meta1127/ubuntu test 8d009929cb0e 2 minutes ago 128.2 MB # Dockerイメージはdocker push でDockerHub等に登録可能 -bash-4.2$ docker push meta1127/ubuntu:test (略)
  15. 使い方|よく使うコマンド 27 コマンド名 概要 docker pull イメージの取得(from DockerHub等) docker push

    イメージの登録(to DockerHub等) docker run コンテナの実行 docker stop コンテナの停止 docker images, ps イメージの一覧表示、コンテナの一覧表示 docker rmi, rm イメージの削除、コンテナの削除 docker exec 実行中のコンテナでコマンドの実行 docker attach 実行中のコンテナにアタッチ docker commit コンテナのイメージ出力 docker tags イメージのタグ付け docker inspect 詳細情報の表示 docker history コンテナのコマンド履歴表示 docker logs コンテナの標準出力を表示
  16. • docker stop [ container_id ] • 実行中のコンテナを停止する • docker

    rm [ container_id ] • コンテナを削除する • -f : 実行中のコンテナの場合でも削除する • docker rmi [ image_id ]:[ tag ] • イメージを削除する • -f : 生成されたコンテナがある場合でも削除する 使い方|コンテナ/イメージの削除 28
  17. • docker exec -it [ container_id ] [ command ]

    • 実行中のコンテナでコマンドを実行する • コンテナ内で新しいbin/bashプロセスが起動する • docker attach [ container_id ] • 実行中のコンテナで すでに起動しているPID=1のプロセスの 標準入出力(STDIN/STDOUT)に接続(attach)する 使い方|コンテナ内のコマンド実行 29
  18. Dockerfile| e.g. Megadock 32 FROM debian:jessie MAINTAINER metaVariable <[email protected]> RUN

    apt-get update RUN apt-get install -y --no-install-recommends ¥ fftw3-dev ¥ wget ¥ make ¥ g++ # make megadock RUN wget -P /tmp http://www.bi.cs.titech.ac.jp/megadock/archives/megadock-4.0.2.tgz && ¥ tar xvf /tmp/megadock-4.0.2.tgz -C /opt && ¥ rm /tmp/megadock-4.0.2.tgz COPY Makefile /opt/megadock-4.0.2/Makefile WORKDIR /opt/megadock-4.0.2 RUN make 開始するイメージを選択 Dockerfile作成者情報 Dockerfile コマンドの実行 ホストからコンテナ内にファイルをコピー 作業ディレクトリ場所の設定
  19. Dockerfile| docker build 33 # Dockerfileと同じ場所でイメージをビルド -bash-4.2$ docker build .

    -t megadock:cpu Sending build context to Docker daemon 2.56 kB Step 1 : FROM debian:jessie ---> e5599115b6a6 Step 2 : MAINTAINER metaVariable <[email protected]> ---> Running in 469442cfae07 ---> 7bf00fae3f9f Removing intermediate container 469442cfae07 Step 3 : RUN apt-get update ---> Running in f1ef8452dafd (略) Removing intermediate container 0d14d93a4e50 Successfully built 74310eeb8f66 # 作成されたイメージを確認 -bash-4.2$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE megadock cpu 74310eeb8f66 26 seconds ago 332.3 MB # 作成されたイメージでコンテナを実行 -bash-4.2$ docker run -it megadock:cpu ./megadock -R 1gcq_r.pdb -L 1gcq_r.pdb • docker build [ path ] -t [ image : tag ] • Dockerfileからイメージを作成する • -t : 作成されたイメージへのタグ付け
  20. Dockerfile|よく使うコマンド 34 コマンド名 概要 FROM ベースイメージの指定 MAINTAINER Dockerfileの作成者情報 RUN コマンド実行

    ENV 環境変数の設定 COPY ファイルのコピー ADD ファイル/ディレクトリの追加 CMD デーモン実行 ENTRYPOINT デーモン実行 WORKDIR 作業ディレクトリの指定 USER ユーザ指定、切り替え EXPOSE ポートの解放 VOLUME ボリュームのマウント ONBUILD ビルド完了後に実行される命令 LABEL ラベルの設定
  21. Dockerfile| e.g. Megadock 35 FROM debian:jessie MAINTAINER metaVariable <[email protected]> RUN

    apt-get update RUN apt-get install -y --no-install-recommends ¥ fftw3-dev ¥ wget ¥ make ¥ g++ # make megadock RUN wget -P /tmp http://www.bi.cs.titech.ac.jp/megadock/archives/megadock-4.0.2.tgz && ¥ tar xvf /tmp/megadock-4.0.2.tgz -C /opt && ¥ rm /tmp/megadock-4.0.2.tgz COPY Makefile /opt/megadock-4.0.2/Makefile WORKDIR /opt/megadock-4.0.2 RUN make 開始するイメージを選択 Dockerfile作成者情報 Dockerfile コマンドの実行 ホストからコンテナ内にファイルをコピー 作業ディレクトリ場所の設定
  22. 応用編| よく使うコマンド 38 コマンド名 概要 docker-compose up コンテナの稼働(build, create, start,

    attach) docker-compose down コンテナの停止と削除 docker-compose ps 実行中のコンテナの一覧表示 docker-compose scale コンテナの数を変更 docker-compose restart コンテナの再起動 docker-compose help コマンドを忘れたときにうつやつ ※ docker-composeはdocker-engineとは別途入れる必要があります docker-compose自体をdockerイメージで提供する方法があるので、 個人的にはそちらをおすすめします https://docs.docker.com/compose/install/#install-as-a-container
  23. • Gitlabをdockerでデプロイしてみる • https://github.com/sameersbn/docker-gitlab • コンテナの構成 • Gitlab • Redis

    • Postgres 応用編|GitLabをデプロイ 39 # gitlabのgithubリポジトリからdocker-compose.ymlを入手 -bash-4.2$ wget https://github.com/sameersbn/docker-gitlab/blob/master/docker-compose.yml # コンテナ群を起動する -bash-4.2$ docker-compose up -d … # webブラウザとかcurlでアクセスする -bash-4.2$ curl http://localhost:10080 # 満足したらコンテナを終了する -bash-4.2$ docker-compose down
  24. 応用編|docker-compose 朗読会 41 version: '2' services: redis: restart: always image:

    sameersbn/redis:latest command: - --loglevel warning volumes: - /srv/docker/gitlab/redis:/var/lib/redis:Z postgresql: restart: always image: sameersbn/postgresql:9.6-2 volumes: - /srv/docker/gitlab/postgresql:/var/lib/postgresql:Z environment: - DB_USER=gitlab - DB_PASS=password - DB_NAME=gitlabhq_production - DB_EXTENSION=pg_trgm gitlab: restart: always image: sameersbn/gitlab:8.16.3 depends_on: - redis - postgresql ports: - "10080:80" - "10022:22" volumes: - /srv/docker/gitlab/gitlab:/home/git/data:Z environment: - DEBUG=false - DB_ADAPTER=postgresql - DB_HOST=postgresql - DB_PORT=5432 - DB_USER=gitlab - DB_PASS=password - DB_NAME=gitlabhq_production (略)
  25. 参考書 • プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化 • http://amzn.asia/f4uQr9N (研究室に1冊あります) スライド • Docker入門-基礎編

    いまから始めるDocker管理【2nd Edition】 • http://www.slideshare.net/zembutsu/introduction-to-docker-management-and- operations-2nd • クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座 • http://www.slideshare.net/zembutsu/devsumi-2016-docker-introduction • Dockerを支える技術 • http://www.slideshare.net/enakai/docker-34668707 補足|参考書、スライド等 45
  26. Linux Container • Concept of Linux container based on Linux

    namespace. • No visibility or access to objects outside the container • Containers can be viewed as another level of access control in addition to the user and group permission system. namespace [17] • namespace can isolates and virtualizes system resources of a collection of processes. • namespace allows creating separate instances of global namespaces. • Processes running inside the container • They are sharing the host OS kernel. • They have its own root directory and mount table. • They appear to be running on a normal Linux system. • namespaces feature, originally motivated by difficulties in dealing with high performance computing clusters [17]. 補足| Linux Container (namespace) 46 [17] E. W. Biederman. “Multiple instances of the global Linux namespaces.”, In Proceedings of the 2006 Ottawa Linux Symposium, 2006. Figure: https://access.redhat.com/documentation/en/red-hat-enterprise-linux-atomic-host/7/paged/overview-of-containers-in-red-hat-systems/