ゆるふわなdockerの使い方
TRANSCRIPT
•今回のセッションはハンズオンではありません
•とはいえ手元に動く環境がある方がよいです
•適当な環境(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ってなに 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 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!”
イメージの問い合わせ
• $ 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(略)
使い方|よく使うコマンド 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
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
• 複数コンテナで構成されるサービスの管理ツール• 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
応用編|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
(略)
• 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/