dockerで遊んでみよっかー yapc::asia tokyo 2014

128
Docker で遊んでみよっかー YAPC::Asia Tokyo 2014 Masahiro Nagano / @kazeburo

Upload: masahiro-nagano

Post on 15-Jan-2015

22.177 views

Category:

Internet


7 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker で遊んでみよっかーYAPC::Asia Tokyo 2014

Masahiro Nagano / @kazeburo

Page 2: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Me• 長野雅広 Masahiro Nagano

• @kazeburo

• Operations Engineer / Site Reliability

• LINE Corp.

• YAPC::Asia 2013 Tokyo ベストトーク賞3位

• ISUCON3 優勝

Page 3: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

ISUCON4

Page 4: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

ISUCON4かかってこいや!!1

Page 5: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

調子乗りました(_ _)

Page 6: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

本題

Page 7: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

その前に

Page 8: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

質問

Page 9: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

(1) Dockerを使った事がある方?

• Yes

• No

Page 10: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

(2) Dockerをどのplatform上で使っていますか?

• MacOS X (boot2docker,仮想マシン含む)

• Linux

• Windows

Page 11: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker で遊んでみよっかー

Page 12: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

「遊ぶ」というタイトルにした理由• Dockerはまだ若い技術。しかし、大きな可能性がある技術であり、数えきれないほどの周辺ツールがリリースされている

• つまり、ベストプラクティスが定まっていない• 新しい技術に対して「使う」「使わない」の2つのスタンスしかないことはない

• 手元で「遊んでみる」ことから始めよう

Page 13: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

真剣に「遊ぶ」

• 基礎を身につける• 実践的なノウハウを貯める

Page 14: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

今日の内容• Docker の基本

• Docker!leとDockerイメージのビルド

• DockerでPerlを使う

• Dockerで自動化

• DockerでWebアプリケーション

Page 15: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker の基本

Page 16: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker とは• Docker (旧dotcloud) 社が開発したコンテナ管理ツール

Page 17: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker とは• Docker (旧dotcloud) 社が開発したコンテナ管理ツール

Page 18: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker とは

Page 19: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker とは• アプリケーションの開発・配布・実行のためのオープンなプラットフォーム

• Dockerを使ってパッケージング(Dockerized)されたアプリケーションはポータビリティが高く、Mac

OS Xの開発環境、Linux上のQA環境、オンプレミス・クラウド上の本番環境など、(Dockerがサポートされている環境なら)どこでも実行が可能

Page 20: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker プラットフォームDocker Hub

Docker!le DockerEngine

アプリケーションの共有と配布

アプリケーションのパッケージング

アプリケーションの実行

コンテナ技術

開発環境 クラウド オンプレミス

Page 21: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

コンテナ とは• アプリケーションを実行する環境をHostOS

から隔離させ、それぞれに異なるリソースを提供する。その隔離されたプロセスの組を「コンテナ」という

• アプリケーション毎に隔離された実行環境を用意する手段としてはVM(仮想マシン)もある

Page 22: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Server

Host OS

Hypervisor

VM

Guest OS

Apps

VM

Bin/Libs

VM

Guest OS

Apps

Bin/Libs

VM

Guest OS

Apps

Bin/Libs

Server

Host OS

Docker Engine

Container

Apps

Bin/Libs

Container

Apps

Bin/Libs

Container

Apps

Bin/Libs

VMとコンテナ

Container

同じ独立性を確保しながら、より少ないリソースで動作する

kernelは共有

Page 23: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

コンテナの動作

Server

Host OS

Docker Engine

ContainerPr

oces

sContainer

Proc

ess

proc

ess A

proc

ess B

proc

ess C

Docker EngineがHost OSから各リソースを隔離する

Proc

ess

Page 24: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

コンテナの動作隔離されるリソース

• ファイルシステム• ネットワーク・ホスト名• プロセステーブル• ユーザ権限• CPU・メモリなどのリソース制御

* Linux Kernelの機能を利用

Page 25: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker のインストール(Mac OS Xの場合)

Page 26: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker のインストール

1) boot2dockerを導入し、Mac上のdocker

コマンドからAPIを経由して操作

2) Vagrantで任意のLinuxディストリビューションを入れる

Linux Kernel が必要なので、Virtulbox, VMware

などで仮想マシンを起動する必要がある

Page 27: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

boot2docker• Dockerの起動に特化した軽量Linuxディストリビューション

Page 28: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

boot2docker

Container

Proc

ess

Container

Proc

ess

Proc

ess

Mac OS X

DockerCommand VirtualBox

boot2docker (linux)

Docker DaemonTCP 2375

APIを使ってDockerを制御

Mac用DockerはAPIを呼ぶように作られている

Page 29: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant• 仮想環境構築ツール。Vagrant!leと言われる設定ファイルを使うことで、自動的に仮想環境の構築ができる

Page 30: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

boot2docker vs. Vagrantpros cons

boot2docker・インストールが楽・Mac上からDockerを透過的に扱える

・ファイル共有に難あり

Vagrant・ファイル共有がしやすく

柔軟に設定可能・Guest OSの機能を活用

・Guest OSにログインする必要あり

* 迷いにくい Vagrant を使っていきます

Page 31: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Install VirtualBox & Vagrant

このあたりからダウンロードしてください

Page 32: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

VagrantでDocker 手作業編

$ mkdir vagrant-docker$ cd vagrant-docker$ vagrant init chef/centos-6.5$ vagrant up$ vagrant ssh

Mac OS X

Page 33: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

VagrantでDocker 手作業編

$ sudo yum install -y http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm$ sudo yum install -y docker-io$ sudo service docker start$ sudo /sbin/chkconfig docker on$ sudo usermod -a -G docker vagrant# ログインしなおして

$ docker -vDocker version 1.1.2, build d84a070/1.1.2

Guest OS

Page 34: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

VagrantでDocker 自動化編$ cat Vagrantfile$script = <<EOFyum install -y http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmyum install -y docker-io/sbin/chkconfig docker onusermod -a -G docker vagrantEOFVagrant.configure(2) do |config| config.vm.box = "chef/centos-6.5" config.vm.provision "shell", inline: $scriptend$ vagrant up

Mac OS X

初回起動時に自動で実行

Page 35: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“Hello World”

$ docker run ubuntu:14.04 echo Hello WorldUnable to find image 'ubuntu:14.04' locallyPulling repository ubuntuc4ff7513909d: Download complete 511136ea3c5a: Download complete ...cc58e55aa5a5: Download complete Hello World$

Guest OS起動するベースDockerイメージ

Page 36: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

bash で入ってみる$ docker run -i -t ubuntu:14.04 bashroot@0840910014be:/# cat /etc/lsb-release | grep DESCRIPTIONDISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"root@0840910014be:/# exit$

Guest OSstdinの維持とttyの割り当て

Page 37: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

コンテナのライフタイム

• OSではなくプロセス

• プロセスの終了でコンテナが終了する• ファイルシステムへの変更も破棄される

time

`echo Hello World`コンテナ起動プロセス終了コンテナも終了

“揮発性のあるコンテナ”

Page 38: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

揮発性の確認$ docker run -i -t ubuntu:14.04 bashroot@0840910014be:/# echo “hello world” > /tmp/fooroot@0840910014be:/# exitexit$ docker run -i -t ubuntu:14.04 bashroot@0840910014be:/# ls -l /tmp/fools: cannot access /tmp/foo: No such file or directory

Guest OS

time`bash`

ファイルシステム破棄echo > /tmp

`bash`

新しいコンテナ!

Page 39: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker の特徴まとめ

• コンテナ技術を活用したアプリケーションの配布・実行のプラットフォーム

• 揮発性のあるコンテナ• Docker!leと階層化イメージ

次の話題

Page 40: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

今日の内容• Docker の基本

• Docker!leとDockerイメージのビルド

• DockerでPerlを使う

• Dockerで自動化

• DockerでWebアプリケーション

Page 41: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker!leとDockerイメージのビルド

Page 42: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker!le とは• Dockerでコンテナを起動する際のイメージを作る手続きを記したファイル

Page 43: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker!le

FROM centos:centos6MAINTAINER Masahiro Nagano <[email protected]>

RUN yum install -y http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmRUN yum install -y sl

CMD sl

Docker!le元となるイメージ

build時に実行するコマンド

docker run時に実行するコマンド

Page 44: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Dockerイメージの作成 #0

$ lsDockerfile Vagrantfile$ vagrant ssh

Mac OS X

$ cd /vagrant$ lsDockerfile Vagrantfile$ docker build -t localdev/sl .

Guest OS

自動でGuestOSにマウントされる

イメージに付けるTag名

Page 45: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Dockerイメージの作成 #1

Page 46: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Dockerイメージの作成 #2

Page 47: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker build ログ$ docker build -t localdev/sl .Step 0 : FROM centos:centos6 Step 1 : MAINTAINER Masahiro Nagano <[email protected]>Step 2 : RUN yum install -y http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm ---> Running in 2207ff8a8f8c...Step 3 : RUN yum install -y sl...Step 4 : CMD sl ---> Running in 65df9252f6ff ---> a8d304eb9f7cRemoving intermediate container 65df9252f6ffSuccessfully built a8d304eb9f7c$

Guest OS

Page 48: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker build とイメージの作成

FROM centos:centos6

MAINTAINER Masahiro Nagano

<[email protected]>

RUN yum install -y epel-

release-6-8.noarch.rpm

RUN yum install -y sl

CMD sl

Docker!le

centos6

ファイルシステムの変更点差分イメージを重ねて行く

Dockerはaufs、device-mapper、brtfsなどを使い、差分ファイルシステムを実現している

Page 49: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker build とイメージの作成

FROM centos:centos6

MAINTAINER Masahiro Nagano

<[email protected]>

RUN yum install -y epel-

release-6-8.noarch.rpm

RUN yum install -y sl

CMD sl

Docker!le

centos6

epel

ファイルシステムの変更点差分イメージを重ねて行く

Dockerはaufs、device-mapper、brtfsなどを使い、差分ファイルシステムを実現している

Page 50: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker build とイメージの作成

FROM centos:centos6

MAINTAINER Masahiro Nagano

<[email protected]>

RUN yum install -y epel-

release-6-8.noarch.rpm

RUN yum install -y sl

CMD sl

Docker!le

centos6

epel

sl

ファイルシステムの変更点差分イメージを重ねて行く

Dockerはaufs、device-mapper、brtfsなどを使い、差分ファイルシステムを実現している

Page 51: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker build とイメージの作成

FROM centos:centos6

MAINTAINER Masahiro Nagano

<[email protected]>

RUN yum install -y epel-

release-6-8.noarch.rpm

RUN yum install -y sl

CMD sl

Docker!le

centos6

epel

sl

ファイルシステムの変更点差分イメージを重ねて行く

CMD

Dockerはaufs、device-mapper、brtfsなどを使い、差分ファイルシステムを実現している

Page 52: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

差分イメージの枝構造FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y sl

CMD sl

centos6base

epel

sl

CMD

Page 53: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

差分イメージの枝構造FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y sl

CMD sl

FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y fortune

CMD fortune

centos6base

epel

sl

CMD

Page 54: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

差分イメージの枝構造FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y sl

CMD sl

FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y fortune

CMD fortune

centos6base

epel

sl

CMD

Page 55: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

差分イメージの枝構造FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y sl

CMD sl

FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y fortune

CMD fortune

centos6base

epel

sl

Docker!leに変更を加えるとそこから枝が分かれる。

幹は共有する

CMD

Page 56: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

差分イメージの枝構造FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y sl

CMD sl

FROM centos:centos6

RUN yum install -y epel.rpm

RUN yum install -y fortune

CMD fortune

centos6base

epel

sl fortune

Docker!leに変更を加えるとそこから枝が分かれる。

幹は共有する

CMD CMD

Page 57: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

差分イメージの利点• イメージをネットワーク転送する際に差分のみの転送することで、通信にかかる時間を減らす

• ビルド時に変更点がない箇所の再ビルドを行わずに済み、効率がよい

docker build --no-cache で強制再ビルドできる

Page 58: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker!leのよく使うコマンド

Page 59: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“FROM”ベースDockerイメージの指定

FROM <name>:<tag>Docker!le

ベースとなるDockerイメージ名tagを省略すると、latestを使用

Page 60: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“RUN”コマンドの実行

RUN command args argsRUN [“command”,”args”,”args”]

Docker!le

上は [“bash”, ”-c”, “command args args”]

RUN curl -L http://cpanmin.us/ | perl - -n App::cpanminusDocker!le

Page 61: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“COPY”HostOSからコンテナへのファイルコピー

COPY src destDocker!le

Page 62: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“COPY”HostOSからコンテナへのファイルコピー

COPY src destDocker!le

COPY ../src destDocker!le

Page 63: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“COPY”HostOSからコンテナへのファイルコピー

COPY src destDocker!le

COPY ../src destDocker!le

docker build時にDocker!leのあるディレクトリを一時的に領域にコピーしてからビルド開始するのでディレクトリをさかのぼることはできない

Page 64: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“COPY”HostOSからコンテナへのファイルコピー

FROM centos:centos6

COPY README.md /opt/README.md

RUN yum install -y sl

CMD sl

centos6base

COPY

sl

CMD

$ touch README.md

$ docker build .

Page 65: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“COPY”HostOSからコンテナへのファイルコピー

FROM centos:centos6

COPY README.md /opt/README.md

RUN yum install -y sl

CMD sl

centos6base

COPY

sl

CMD

$ touch README.md

$ docker build .

Page 66: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“COPY”HostOSからコンテナへのファイルコピー

FROM centos:centos6

COPY README.md /opt/README.md

RUN yum install -y sl

CMD sl

centos6base

COPY

sl sl’

CMD CMD’

$ touch README.md

$ docker build .

Page 67: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“ADD”

Page 68: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“ADD”COPYより前からあるコマンド

URIを指定できたり、tarファイルを自動解凍できる

必要なければ使わない方がよい

Page 69: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“ENV”環境変数

ENV PLACK_ENV productionENV PATH $PATH:/opt/local/perl-5.20/bin

Docker!le

ENV KEY NAMEDocker!le

変数も使用できる

Page 70: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“CMD”docker run時に起動するコマンド

CMD command args argsDocker!le

CMD [“command”,”args”,”args”]

上は [“bash”, ”-c”, “command args args”]  “RUN” と一緒

Page 71: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

“EXPOSE”コンテナ内のプロセスがListenするポート

EXPORT PORT_NUMDocker!le

EXPORT 11211CMD memcached -p 11211 -u nobody -m 1024 -c 100000

Docker!le

docker run -p 22122:11211 localdev/memcached

Host側のPort

コンテナのPort

Page 72: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker!le Reference

https://docs.docker.com/reference/builder/

Page 73: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

今日の内容• Docker の基本

• Docker!leとDockerイメージのビルド

• DockerでPerlを使う

• Dockerで自動化

• DockerでWebアプリケーション

Page 74: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

DockerでPerlを使う

Page 75: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

System Perl$ docker run -i -t ubuntu:14.04 bashroot@8ac58f29a17a:/# perl -v

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi(with 41 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

Perl may be copied only under the terms of either the Artistic License or theGNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found onthis system using "man perl" or "perldoc perl". If you have access to theInternet, point your browser at http://www.perl.org/, the Perl Home Page.

root@8ac58f29a17a:/#

Guest OS

ubuntuの場合

Page 76: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

System Perl$ docker run -i -t centos:centos6 bash

Guest OS

CentOSの場合

Page 77: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

System Perl$ docker run -i -t centos:centos6 bashbash-4.1# perl -v

Guest OS

CentOSの場合

Page 78: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

System Perl$ docker run -i -t centos:centos6 bashbash-4.1# perl -vbash: perl: command not foundbash-4.1#

Guest OS

CentOSの場合

CentOSはイメージサイズを小さくするために perl は削られている!

Page 79: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Perlの入ったイメージを使う

Page 80: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

registry.hub.docker.com

Perlで検索!

Page 81: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

registry.hub.docker.com

53件

Page 82: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

registry.hub.docker.com

53件

どれを使えば良いんだろう~

Page 83: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Dockerイメージを選ぶ基準• official repository

• Docker!leが公開されている

• Description、Docker!leをみてニーズを満たしているかどうか確認する

• Automated build repository を利用している

Page 84: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Automated build repository

Dockerfile

push

Page 85: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Automated build repository

Dockerfile

push

webhook

Page 86: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Automated build repository

Dockerfile

push

webhook docker build

Page 87: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Automated build repository

Dockerfile

push

webhook docker build

push

Page 88: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Automated build repository

Dockerfile

push

webhook docker build

pushbuildの過程に人の手が入らない

Page 89: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Dockerイメージを選ぶ基準

Page 90: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Dockerイメージを選ぶ基準

automated build

Docker!le

github repository

Page 91: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

おすすめ Docker イメージ

• perl

• jmmills/plenv

• kazeburo/perl

• 自分で作る

Page 92: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

kazeburo/perl の使い方$ docker run -i -t kazeburo/perl:v5.18 perl -vThis is perl 5, version 18, subversion 1 (v5.18.1) built for x86_64-linux

Copyright 1987-2013, Larry Wall..$

Guest OS

Page 93: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

kazeburo/perl の使い方

FROM kazeburo/perl:v5.18RUN cpanm -n PlackCMD plackup -v

Docker!le

cpanmも導入済み

$ docker build -t localdev/perl .$ docker run localdev/perl Plack 1.0031$

GuestOS

Page 94: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

今日の内容• Docker の基本

• Docker!leとDockerイメージのビルド

• DockerでPerlを使う

• Dockerで自動化

• DockerでWebアプリケーション

Page 95: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker で自動化

Page 96: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker の主な利用法

(Web)アプリケーションの実行≒

Page 98: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker を利用したperl-buildスクリプトのfatpack

Docker の活用例速い起動速度と揮発性を利用

Page 99: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

fatpack• 依存モジュールをすべてひとつのscript

!leにまとめ、配布しやすくする

• App::FatPacker が使われる

• cpamn でも使用

Page 100: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

perl-build• tokuhiromによるPerlをビルドするためのユーティリティモジュール・スクリプト

• ダウンロードとビルドを面倒見てくれる• plenvやxbuildで利用されている

• co-maintainerやってます

Page 101: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

perl-build 使い方

$ curl -s https://raw.githubusercontent.com/tokuhirom/Perl-Build/master/perl-build | perl - 5.20.0 ~/local/perl-5.20

shell

依存モジュールのインストールなく使える

Page 102: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

fatpackの手順• サポートしたい一番古いperlを用意

perl-buildでは “5.8.5”

• ExtUtils::MakeMaker のアップデートperl-5.12以前なら “6.56” をいれる

• cpanm, App::FatPacker をインストール

• 依存モジュールのインストール・アップデート

• fatpack

Page 103: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

fatpackの手順• サポートしたい一番古いperlを用意

perl-buildでは “5.8.5”

• ExtUtils::MakeMaker のアップデートperl-5.12以前なら “6.56” をいれる

• cpanm, App::FatPacker をインストール

• 依存モジュールのインストール・アップデート

• fatpack

再利用が可能

Page 104: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Dockerを使ってみよっかー

Page 105: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

FROM jmmills/plenv-base:latestRUN plenv install 5.8.5ENV PLENV_VERSION 5.8.5RUN curl -L http://cpanmin.us/ | plenv exec perl - -n ExtUtils::[email protected] curl -L http://cpanmin.us/ | plenv exec perl - -n App::cpanminusRUN curl -L http://cpanmin.us/ | plenv exec perl - -n Perl::Strip App::FatPackerRUN plenv rehashCMD bash -l -c 'cd /perl-build; cpanm -n --installdeps . ; bash author/fatpack.sh'

Docker!le

Dockerを使ったfatpack

Page 106: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

$ git clone https://github.com/tokuhirom/Perl-Build.git$ cd Perl-Build/author$ docker build -t perl-build .$ docker run -v ../:/perl-build perl-build

GuestOS

Dockerを使ったfatpack

“Perl-Build” ディレクトリをコンテナ内の”/perl-build”にマウント

Page 107: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

-v オプション毎回指定するの面倒だし、もっと言うと、Docker のインストールから

自動化したい。そうすると誰でも簡単に確実に

perl-buildのfatpackが実行できる

Page 108: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant + Docker の合わせ技

Page 109: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant+DockerVagrant.configure(2) do |config| config.vm.box = "hashicorp/precise64" config.vm.synced_folder "../", "/perl-build" config.vm.provision "docker", run: "always" do |d| d.build_image "/perl-build/author", args: "-t perl-build" end config.vm.provision "shell", run: "always", inline: "docker run -v /perl-build:/perl-build perl-build" config.vm.provision "destroy", destroy: false, run: "always"end

Vagrant!le

Page 110: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant+DockerVagrant.configure(2) do |config| config.vm.box = "hashicorp/precise64" config.vm.synced_folder "../", "/perl-build" config.vm.provision "docker", run: "always" do |d| d.build_image "/perl-build/author", args: "-t perl-build" end config.vm.provision "shell", run: "always", inline: "docker run -v /perl-build:/perl-build perl-build" config.vm.provision "destroy", destroy: false, run: "always"end

Vagrant!le/path/to/perl-buildをGuestOSの

/perl-buildにマウント

Page 111: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant+DockerVagrant.configure(2) do |config| config.vm.box = "hashicorp/precise64" config.vm.synced_folder "../", "/perl-build" config.vm.provision "docker", run: "always" do |d| d.build_image "/perl-build/author", args: "-t perl-build" end config.vm.provision "shell", run: "always", inline: "docker run -v /perl-build:/perl-build perl-build" config.vm.provision "destroy", destroy: false, run: "always"end

Vagrant!le/path/to/perl-buildをGuestOSの

/perl-buildにマウント

docker provisionerを使うと自動でGuestOSにdockerが入る

Page 112: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant+DockerVagrant.configure(2) do |config| config.vm.box = "hashicorp/precise64" config.vm.synced_folder "../", "/perl-build" config.vm.provision "docker", run: "always" do |d| d.build_image "/perl-build/author", args: "-t perl-build" end config.vm.provision "shell", run: "always", inline: "docker run -v /perl-build:/perl-build perl-build" config.vm.provision "destroy", destroy: false, run: "always"end

Vagrant!le/path/to/perl-buildをGuestOSの

/perl-buildにマウント

docker provisionerを使うと自動でGuestOSにdockerが入る

shell provisionerでdocker run

Page 113: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant+DockerVagrant.configure(2) do |config| config.vm.box = "hashicorp/precise64" config.vm.synced_folder "../", "/perl-build" config.vm.provision "docker", run: "always" do |d| d.build_image "/perl-build/author", args: "-t perl-build" end config.vm.provision "shell", run: "always", inline: "docker run -v /perl-build:/perl-build perl-build" config.vm.provision "destroy", destroy: false, run: "always"end

Vagrant!le/path/to/perl-buildをGuestOSの

/perl-buildにマウント

docker provisionerを使うと自動でGuestOSにdockerが入る

shell provisionerでdocker runGuestOSを自動で停止余計なリソース使わない

Page 114: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker provisionerでdocker runを行わない理由

config.vm.provision "docker", run: "always" do |d| d.build_image "/perl-build/author", args: "-t perl-build" d.run “perl-build”end

Vagrant!le

docker provisionerで run

これだと、fatpackが終わる前に、vagrant upが終わり、元のシェルにもどってしまい、いつfatpackが完了するか分からない

Page 115: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrant+Docker$ vagrant plugin install vagrant-destroy-provisioner$ vagrat up=> GuestOSの起動

=> docker provisionerでDockerイメージのビルド

=> shell provisioner経由でdocker run

==> 依存モジュールのインストール

==> fatpack$ git status ../perl-build..# modified: ../perl-build..$

MacOS X

Page 116: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

fatpackしたperl-buildコマンドの動作チェックも Docker でやると

捗ると思うのでpull-req お待ちしています(_ _)

Page 117: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

今日の内容• Docker の基本

• Docker!leとDockerイメージのビルド

• DockerでPerlを使う

• Dockerで自動化

• DockerでWebアプリケーション

Page 118: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

DockerでWebアプリケーション

Page 119: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

題材

Page 120: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

WebアプリケーションのDocker への Deploy

FROM perl:v5.20

COPY . /opt/app

RUN carton install

CMD carton exec -- plackup

docker イメージ

Page 121: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker buildFROM kazeburo/perl:v5.20RUN mkdir -p /opt/appCOPY ./cpanfile /opt/app/cpanfileCOPY ./cpanfile.snapshot /opt/app/cpanfile.snapshotWORKDIR /opt/appRUN carton install --deploymentEXPOSE 5000COPY . /opt/appCMD carton exec -- plackup -s Starlet --port 5000 -a app.psgi

Docker!le 先にcpan!leをコピーしcarton installを行う事で

cacheを有効活用

残りをコピー

Page 122: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

docker build

local

.dockerignore

.gitignore と同じような役割local をコンテナ内にコピーしない

Page 123: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

アプリケーションの起動$ docker build -t app .$ docker run -p 15000:5000 app

GuestOS

コンテナのPortHost側のPort

Page 124: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Vagrantでport_forward

Vagrant.configure(2) do |config| config.vm.box = "hashicorp/precise64" config.vm.network "forwarded_port", guest:15000, host:25000 config.vm.provision "docker", run: "always" do |d| d.pull_images "kazeburo/perl:v5.20" endend

Vagrant!le

Macのtcp 25000 をGuestOSの 15000 に

forward

Mac/Vagrant GuestOS コンテナ

50001500025000

Page 125: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

ブラウザでの確認

http://127.0.0.1:25000/

Page 126: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

Docker でWebアプリケーション残りの課題

• ログの取り扱い• MySQLなどの接続情報の受け渡し

• 性能評価• イメージビルド・デプロイ手段• 監視

まだまだ厳しい...

Page 127: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

引き続き Docker で遊びながら最新情報を追っていきたいと

考えております

Page 128: Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014

ご清聴ありがとうございました