ゆるふわなdockerの使い方

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

Upload: kento-aoyama

Post on 11-Apr-2017

9 views

Category:

Technology


0 download

TRANSCRIPT

ゆるふわなDockerの使い方~なんとなく使い方を知る~

2017年 2月 9日(木)

青山健人/@meta1127

東京工業大学 情報理工学院 情報工学系知能情報コース 秋山研究室

•今回のセッションはハンズオンではありません

•とはいえ手元に動く環境がある方がよいです

•適当な環境(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

はじめに|コンテナ型仮想化の波 3

※ Tsubame3.0でDockerが動く…とは違う(はず)

https://twitter.com/ProfMatsuoka/status/828100145640148992

はじめに|HPC向けコンテナ実装 4

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

はじめに|コンテナ仮想化のビッグウェーブ 5

http://www.datacenterdynamics.com/content-tracks/servers-storage/docker-adoption-doubles-in-a-year/95703.fullarticle

Source: Thinkstock / Docker

はじめに|前回の論文輪講 6

https://speakerdeck.com/metavariable/an-updated-performance-comparison-of-virtual-

machines-and-linux-containers-1

この前に仮想マシンとコンテナ型仮想化の性能の話をしました(詳細はスライドURL参照)

はじめに|前回の論文輪講(引用) 7

Case Perf. Category Docker KVM

A, B CPU Good Bad*

CMemory Bandwidth

(sequential)Good Good

DMemory 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

1. Dockerのいいところを知る 基本的な概念のゆるふわ理解

2. Dockerの基本的な使い方を知る 代表的なコマンドの使い方

Dockerイメージを触ってみる

Dockerfileからイメージをビルドしてみる

3. Dockerのサービスのデプロイ方法を知る docker-composeを使ってみる

はじめに|今日の目標 8

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

9

概要|Dockerってなに 10

http://www.bigdatatraining.in/docker-training-gurgaon/

コンテナ型仮想化を実現するプラットフォーム

概要|Dockerってなに 11

http://www.bigdatatraining.in/docker-training-gurgaon/

コンテナ型仮想化を実現するプラットフォーム

開発したアプリを依存ライブラリを含めたコンテナイメージをDockerHubで公開

コンテナイメージは実行環境を含むため、ダウンロードしてすぐに実行可能

クラウドにある別のLinuxOS

でも、すぐに実行可能

コンテナ型仮想化により、コンテナ内部のアプリは• ホストOSの既存のライブラリに依存しない• ホストOSの種類に依存しない

ex: Docker Engineがある環境ならば約23秒くらいでMegadockの実行環境が手に入る!

概要|動作例 12

イメージを指定

ローカルにイメージがないため自動的に実行環境をダウンロード(レイヤ毎に並列処理)

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

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

AUFS (Advanced multi layered unification filesystem) [12]

• 積層型のファイルシステム• ファイルシステムの内容の差分を層として記録する

• 層毎にハッシュ値が割り振られて管理されている

• Dockerではコンテナイメージの管理に採用• コンテナ間で同じ層は再利用される(容量削減)

• 差分管理により、コンテナイメージの操作を巻き戻すことが可能

概要|AUFS 15

[12] Advanced multi layered unification filesystem. http://aufs.sourceforge.net, 2014.

• Dockerはコンテナ型仮想化を管理するプラットフォーム

• アプリの実行環境をコンテナにまとめて共有可能• コンテナイメージからビルドなしにアプリを実行可能

• 再現性◎可搬性◎ 可用性◎

• オープンソースで開発、配布• https://github.com/docker/docker

概要|Dockerのまとめ 16

Dockerの使い方を学ぶHelloWorld

基本的なコマンド

ユースケース

17

•公式が親切なので参考にして下さい• [検索] [ docker install ]

• Linux環境を想定します• dockerの実行には

root権限が必要なので注意

• 仮想マシン上をおすすめ

• win, macならこの辺でも…

• Docker for mac

• Docker for Windows

使い方|インストール 18

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

• $ docker run hello-world• Hello-Worldイメージからコンテナを実行するコマンド

使い方|Hello World ! 20

docker run hello-worldDocker client

Docker daemon

Docker Hub

イメージの確認

hello-worldイメージ

コンテナの作成

hello-worldイメージ

“Hello from Docker!”

イメージの問い合わせ

使い方|イメージとコンテナ 21

pullするとイメージが落ちてくる

runするとコンテナができる

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

•ユースケース1. DockerHubから公式イメージを取得して

2. コンテナの中で任意の作業を行い

3. DockerHubの自分のリポジトリに登録したい

使い方|イメージの変更と登録 23

コマンド やりたいこと

docker pull DockerHubからイメージを取得(省略可)

docker run –it 取得したイメージからコンテナを起動

(任意の作業)コンテナの中で任意の作業(ソフトウェアのインストールなど)

docker commit コンテナをイメージとして出力

docker push 出力したイメージをDockerHubに登録

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

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

補足|タグ 26

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

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

• docker stop [ container_id ]• 実行中のコンテナを停止する

• docker rm [ container_id ]• コンテナを削除する

• -f : 実行中のコンテナの場合でも削除する

• docker rmi [ image_id ]:[ tag ]• イメージを削除する

• -f : 生成されたコンテナがある場合でも削除する

使い方|コンテナ/イメージの削除 28

• docker exec -it [ container_id ] [ command ]• 実行中のコンテナでコマンドを実行する

• コンテナ内で新しいbin/bashプロセスが起動する

• docker attach [ container_id ]• 実行中のコンテナですでに起動しているPID=1のプロセスの標準入出力(STDIN/STDOUT)に接続(attach)する

使い方|コンテナ内のコマンド実行 29

DockerfileInfrastructure as a code

30

Dockerfile• Dockerイメージの構成手順が記述されたファイル

• docker buildでDockerイメージを自動作成可能

• アプリの実行環境構築の手順をコードで管理できる• このイメージファイルからはじめて、このコマンドを実行して…

Dockerfile|概要 31

Dockerfile

Docker image

Docker container

docker build

docker run docker commit

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

コマンドの実行

ホストからコンテナ内にファイルをコピー

作業ディレクトリ場所の設定

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

Dockerfile|よく使うコマンド 34

コマンド名 概要

FROM ベースイメージの指定

MAINTAINER Dockerfileの作成者情報

RUN コマンド実行

ENV 環境変数の設定

COPY ファイルのコピー

ADD ファイル/ディレクトリの追加

CMD デーモン実行

ENTRYPOINT デーモン実行

WORKDIR 作業ディレクトリの指定

USER ユーザ指定、切り替え

EXPOSE ポートの解放

VOLUME ボリュームのマウント

ONBUILD ビルド完了後に実行される命令

LABEL ラベルの設定

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

コマンドの実行

ホストからコンテナ内にファイルをコピー

作業ディレクトリ場所の設定

docker-compose

36

docker-compose

• 複数コンテナで構成されるサービスの管理ツール• docker-compose.ymlに従って複数コンテナを起動

• コンテナ間の連携を効率的に作業可能

応用編|Docker-composeとは 37

https://www.penflip.com/akira.ohio/appcatalyst-hands-on-lab-jp/blob/master/docker-compose.txt

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

• 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

応用編|GitLabをデプロイ 40

(実際には初回は管理者のパスワード変更から)

応用編|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

(略)

幻の応用編2docker-swarm

42

•ちからつきました

•複数ノード上の複数のコンテナで• ネットワークを作ったり

• 負荷分散したり

• 簡単にサービスのスケーリングができたりする

docker swarm 43

• Dockerは便利なので覚えて損はない(たぶん)• Dockerfileでビルドやdocker-composeでデプロイができるだけで、色々サービスで遊べる

• 開発したアプリケーションの配布にも便利

• HPC業界でも注目されている• TSUBAME3.0にコンテナ仮想化技術の採用が示唆されている

まとめ 44

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

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 controlin 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/