Slide 1

Slide 1 text

ゆるふわなDockerの使い方 ~なんとなく使い方を知る~ 2017年 2月 9日(木) 青山 健人 / @meta1127 東京工業大学 情報理工学院 情報工学系 知能情報コース 秋山研究室

Slide 2

Slide 2 text

• 今回のセッションはハンズオンではありません • とはいえ手元に動く環境がある方がよいです • 適当な環境(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

Slide 3

Slide 3 text

はじめに|コンテナ型仮想化の波 3 ※ Tsubame3.0でDockerが動く…とは違う(はず) https://twitter.com/ProfMatsuoka/status/828100145640148992

Slide 4

Slide 4 text

はじめに|HPC向けコンテナ実装 4 • Dockerイメージとの互換性あり • 非rootのUIDのみで動作(セキュリティ向上) • 分散ファイルシステムを考慮した高速なイメージ読み込み • 2015年頃から実際にNERSCで利用されている

Slide 5

Slide 5 text

はじめに|コンテナ仮想化のビッグウェーブ 5 http://www.datacenterdynamics.com/content-tracks/servers-storage/docker-adoption-doubles-in-a-year/95703.fullarticle Source: Thinkstock / Docker

Slide 6

Slide 6 text

はじめに|前回の論文輪講 6 https://speakerdeck.com/metavariable/an-updated-performance-comparison-of-virtual- machines-and-linux-containers-1 この前に仮想マシンとコンテナ型仮想化の性能の話をしました (詳細はスライドURL参照)

Slide 7

Slide 7 text

はじめに|前回の論文輪講(引用) 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

Slide 8

Slide 8 text

1. Dockerのいいところを知る  基本的な概念のゆるふわ理解 2. Dockerの基本的な使い方を知る  代表的なコマンドの使い方  Dockerイメージを触ってみる  Dockerfileからイメージをビルドしてみる 3. Dockerのサービスのデプロイ方法を知る  docker-composeを使ってみる はじめに|今日の目標 8

Slide 9

Slide 9 text

Dockerとは 基本的な概念のゆるふわ理解 9

Slide 10

Slide 10 text

概要|Dockerってなに 10 http://www.bigdatatraining.in/docker-training-gurgaon/ コンテナ型仮想化を実現するプラットフォーム

Slide 11

Slide 11 text

概要|Dockerってなに 11 http://www.bigdatatraining.in/docker-training-gurgaon/ コンテナ型仮想化を実現するプラットフォーム 開発したアプリを 依存ライブラリを含めた コンテナイメージを DockerHubで公開 コンテナイメージは実行環境を 含むため、ダウンロードして すぐに実行可能 クラウドにある別のLinuxOS でも、すぐに実行可能 コンテナ型仮想化により、コンテナ内部のアプリは • ホストOSの既存のライブラリに依存しない • ホストOSの種類に依存しない

Slide 12

Slide 12 text

ex: Docker Engineがある環境ならば 約23秒くらいでMegadockの実行環境が手に入る! 概要|動作例 12 イメージを指定 ローカルにイメージがないため 自動的に実行環境をダウンロード (レイヤ毎に並列処理)

Slide 13

Slide 13 text

仮想マシン(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からは各コンテナはそれぞれプロセスとして見える → アプリケーションに必要な実行環境をプロセスレベルで仮想化する

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

• Dockerはコンテナ型仮想化を管理するプラットフォーム • アプリの実行環境をコンテナにまとめて共有可能 • コンテナイメージからビルドなしにアプリを実行可能 • 再現性◎ 可搬性◎ 可用性◎ • オープンソースで開発、配布 • https://github.com/docker/docker 概要|Dockerのまとめ 16

Slide 17

Slide 17 text

Dockerの使い方を学ぶ HelloWorld 基本的なコマンド ユースケース 17

Slide 18

Slide 18 text

• 公式が親切なので参考にして下さい • [検索] [ docker install ] • Linux環境を想定します • dockerの実行には root権限が必要なので注意 • 仮想マシン上をおすすめ • win, macならこの辺でも… • Docker for mac • Docker for Windows 使い方|インストール 18

Slide 19

Slide 19 text

• $ 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. …

Slide 20

Slide 20 text

• $ 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!” イメージの問い合わせ

Slide 21

Slide 21 text

使い方|イメージとコンテナ 21 pullすると イメージが落ちてくる runすると コンテナができる

Slide 22

Slide 22 text

• $ 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 …

Slide 23

Slide 23 text

• ユースケース 1. DockerHubから公式イメージを取得して 2. コンテナの中で任意の作業を行い 3. DockerHubの自分のリポジトリに登録したい 使い方|イメージの変更と登録 23 コマンド やりたいこと docker pull DockerHubからイメージを取得(省略可) docker run –it 取得したイメージからコンテナを起動 (任意の作業) コンテナの中で任意の作業 (ソフトウェアのインストールなど) docker commit コンテナをイメージとして出力 docker push 出力したイメージをDockerHubに登録

Slide 24

Slide 24 text

• $ 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

Slide 25

Slide 25 text

• $ 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 (略)

Slide 26

Slide 26 text

補足|タグ 26 タグを指定してイメージの任意のバージョンをダウンロードできる (gitのtagとほぼ同じ感じ)

Slide 27

Slide 27 text

使い方|よく使うコマンド 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 コンテナの標準出力を表示

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

• docker exec -it [ container_id ] [ command ] • 実行中のコンテナでコマンドを実行する • コンテナ内で新しいbin/bashプロセスが起動する • docker attach [ container_id ] • 実行中のコンテナで すでに起動しているPID=1のプロセスの 標準入出力(STDIN/STDOUT)に接続(attach)する 使い方|コンテナ内のコマンド実行 29

Slide 30

Slide 30 text

Dockerfile Infrastructure as a code 30

Slide 31

Slide 31 text

Dockerfile • Dockerイメージの構成手順が記述されたファイル • docker buildでDockerイメージを自動作成可能 • アプリの実行環境構築の手順をコードで管理できる • このイメージファイルからはじめて、このコマンドを実行して… Dockerfile|概要 31 Dockerfile Docker image Docker container docker build docker run docker commit

Slide 32

Slide 32 text

Dockerfile| e.g. Megadock 32 FROM debian:jessie MAINTAINER metaVariable 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 コマンドの実行 ホストからコンテナ内にファイルをコピー 作業ディレクトリ場所の設定

Slide 33

Slide 33 text

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 ---> 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 : 作成されたイメージへのタグ付け

Slide 34

Slide 34 text

Dockerfile|よく使うコマンド 34 コマンド名 概要 FROM ベースイメージの指定 MAINTAINER Dockerfileの作成者情報 RUN コマンド実行 ENV 環境変数の設定 COPY ファイルのコピー ADD ファイル/ディレクトリの追加 CMD デーモン実行 ENTRYPOINT デーモン実行 WORKDIR 作業ディレクトリの指定 USER ユーザ指定、切り替え EXPOSE ポートの解放 VOLUME ボリュームのマウント ONBUILD ビルド完了後に実行される命令 LABEL ラベルの設定

Slide 35

Slide 35 text

Dockerfile| e.g. Megadock 35 FROM debian:jessie MAINTAINER metaVariable 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 コマンドの実行 ホストからコンテナ内にファイルをコピー 作業ディレクトリ場所の設定

Slide 36

Slide 36 text

docker-compose 36

Slide 37

Slide 37 text

docker-compose • 複数コンテナで構成されるサービスの管理ツール • docker-compose.yml に従って複数コンテナを起動 • コンテナ間の連携を効率的に作業可能 応用編| Docker-composeとは 37 https://www.penflip.com/akira.ohio/appcatalyst-hands-on-lab-jp/blob/master/docker-compose.txt

Slide 38

Slide 38 text

応用編| よく使うコマンド 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

Slide 39

Slide 39 text

• 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

Slide 40

Slide 40 text

応用編|GitLabをデプロイ 40 (実際には初回は管理者のパスワード変更から)

Slide 41

Slide 41 text

応用編|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 (略)

Slide 42

Slide 42 text

幻の応用編2 docker-swarm 42

Slide 43

Slide 43 text

• ちからつきました • 複数ノード上の複数のコンテナで • ネットワークを作ったり • 負荷分散したり • 簡単にサービスのスケーリングができたりする docker swarm 43

Slide 44

Slide 44 text

• Dockerは便利なので覚えて損はない(たぶん) • Dockerfileでビルドやdocker-composeでデプロイが できるだけで、色々サービスで遊べる • 開発したアプリケーションの配布にも便利 • HPC業界でも注目されている • TSUBAME3.0にコンテナ仮想化技術の採用が 示唆されている まとめ 44

Slide 45

Slide 45 text

参考書 • プログラマのための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

Slide 46

Slide 46 text

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/