際際滷

際際滷Share a Scribd company logo
[歪俚み徭喇冩梢]
ラズパイ2で咾 Docker PaaS
を恬ってみたよ
徭失B初
? 恃儲 學寄tetz
? 云茶氏の二鮫、\咾鬚靴討泙
? 蝶ネットワ`クベンダで、SDN┐辰櫃ぃ碧
並をしてます
2
tl;dr
? ラズパイ2で咾 Docker PaaS を徭恬してみた
ので、その碧MみをB初します
? 徭恬した PaaS を CI ┥@A議インテグレ`ショ
ンしてみたので、その碧MみをB初します
? テストするh廠をBした瘁に、テストするという吭龍
で、インフラ CI とやっていることは揖じ
3
デモ
? <paas_name> は、屡贋の Linux コマンドと Linux ユ`ザとコ
ンフリクトしなければ、なんでも辛
? <paas_name> は、ユ`ティリティコマンドと git リモ`トリポジトリ
の兆念に聞われる
? <paas_name> scale web=3
? git push <paas_name> master
4
$ wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh
$ chmod +x bootstrap.sh
$ sudo ./bootstrap.sh <paas_name>
そもそも Docker PaaS のうれしさ
5
Docker PaaS愔瓦PaaS
ハ`ドウェア
ハイパ`バイザ
OS
ハ`ドウェア
OS
Docker エンジン
g佩h廠
冱Z、ライブラリ、ミド
ルウェア
g佩h廠
冱Z、ライブラリ、ミド
ルウェア
アプリケ`ション アプリケ`ション
? g佩h廠が謹晒すると、PaaS ユ`
ザはうれしいが、PaaS 並I宀はメン
テナンスが寄
? PaaS ユ`ザは Docker コンテナで
嘛させられる冱Z、ライブラリ、ミド
ルウェアを徭喇に旋喘できる
? PaaS 並I宀は Docker コンテナが
嘛するh廠を喘吭すればいい
? どちらもハッピ`
なぜ、ラズパイ2で Docker PaaS
? 秀念
? ラズパイ2からクアッドコアに。これをカツカツに聞いたい
? 云咄
? x86 だと、すでにすぐれた Docker PaaS がかなりある(>_<)
6
PaaS の デファクト - Heroku
? キャッチ`でポップなワ`クフロ`により匯弊L智
7
$ heroku create
Creating polar-inlet-4930... done, stack is cedar-14
http://polar-inlet-4930.herokuapp.com/ | https://git.heroku.com/polar-inlet-4930.git
Git remote heroku added
$ heroku scale web=2
Scaling dynos... done, now running web at 2:standard-1x
$ git push heroku master
Fetching repository, done.
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 876 bytes | 0 bytes/s, done.
Total 6 (delta 4), reused 0 (delta 0)
....
Heroku Inspired な
Docker PaaS?
? 恷弌巷蔚方議な蒙罾暴
? ワ`クフロ`が Heroku っぽい
? <heroku> create
? git push <heroku> master
? <heroku> scale web=3
? Buildpack 鬈瘁峰
? 醤悶箭
? シングルノ`ドで嘛する Dokku
? マルチノ`ドで嘛する Deis、Flynn
8
Raspaas
https://github.com/tetsusat/raspaas
? 旋喘辛嬬なh廠
? x86_64
? Ubuntu14.04 / Docker 1.6 # Vagrantfile 歌孚
? ARMv7
? Hypriot Docker Image for Raspberry Pi (Version 0.4)
? http://blog.hypriot.com/downloads/
? Scaleway (www.scaleway.com)
? できること
? git push ´ で Docker コンテナが羨ち貧がる
? Buildpack には隆
? Dockerfile を徭蛍で喘吭する駅勣あり (>_<)
? オ`トスケ`リング (heroku scale web=3 みたいなやつ) 9
ちなみに Buildpack
? アプリケ`ションを徭咾返し、g佩するh廠を喘吭する Heroku
の碧Mみ
10
[歌深] Buildpack Adventure 2 (http://ba2.herokuapp.com/)
Heroku Inspired な
Docker PaaS 曳^┣四衄井
11
Dokku Raspaas
CPU ア`キテクチャ x86_64 x86_64 x86_64 x86_64 / ARMv7
OS CoreOS Ubuntu Ubuntu Ubuntu
ノ`ド マルチ マルチ シングル シングル
アプリケ`ションの
デプロイ圭塀
Buildpack
Dockerイメ`ジ
Dockerfile
Buildpack
Dockerイメ`ジ
Buildpack
Dockerfile
Dockerfile
デモ┐弔鼎
12
$ git clone https://github.com/tetsusat/ruby-sample.git
$ teroku create
$ git push teroku master
$ teroku scale web=3
旋喘コンポ`ネント
? gitreceive (https://github.com/progrium/gitreceive/)
? git push したHの git フックを碧譴韻襪燭瓩離罘`ティリティ
? Consul (https://www.consul.io/)
? サ`ビスディスカバリ
? Registrar (https://hub.docker.com/r/gliderlabs/registrator/)
? Docker API からサ`ビスを返して Consul へ鞠h
? Consul Template (https://github.com/hashicorp/consul-template)
? Consul イベントを返して Nginx のO協を厚仟
? Nginx (http://nginx.org/)
? ル`タHTTP リクエストをロ`ドバランス
? Docker Compose (https://docs.docker.com/compose/)
? Docker コンテナ砿尖のユ`ティリティ
13
git pushでデプロイできる碧Mみ
14
Git Repo
git push teroku master
 git clone ´
 docker build ´.
 docker run ´
オ`トスケ`リングの碧Mみ
15
Docker エンジン
registrar
 鞠h
Nginx +
consul template
app
consul
 O協厚仟
teroku scale web=3
app app
Docker コンテナ┘轡好謄爍
Docker コンテナ┘罘`ザ
HTTP リクエスト
Docker API
Consul Template
16
{{range services}}upstream {{.Name}} {
{{range service .Name}}server 10.0.2.15:{{.Port}};
{{else}}server 127.0.0.1:65535; # force a 502{{end}}
}{{end}}
server {
listen 80;
{{range services}}location /{{.Name}} {
proxy_pass http://{{.Name}}/;
}{{end}}
}
upstream ruby-sample {
server 10.0.2.15:32768;
server 10.0.2.15:32769;
server 10.0.2.15:32770;
}
server {
listen 80;
}location /ruby-sample {
proxy_pass http://ruby-sample/;
}
}
/etc/nginx/conf.d/service.conf
匯何のみ/templates/service.ctmpl
? Consul のイベントをトリガ`にテンプレ`トから蒙協のファイルO
協ファイルなどを啜弔防撹し、アクション┘稀`ビスのリロ`など
をg佩
Scaleway
? ARMベ`スのベアメタルクラウドサ`ビス
? 4コアCPU50GB SSD で 2.99 ┛欧達。
17
Drone+Gitlab+Vagrantで
PaaS の CI h廠をBしてみた
18
drone.io
? Travis CI、Circle CI のように、Github 吉の Git ホスティング
サ`ビスとB亊できるホスティング侏の CI ツ`ル
? ホスティング井だけでなく、オンプレh廠で嘛するオ`プンソ`ス
井がある
? Drone + Gitlab + Vagrant で PaaS の CI h廠をオンプレに
o創で恬れそう。。。
19
PaaS の CI
20
Drone Host Vagrant/Virtualbox
Drone
Docker Engine
app app app
 Gitlab へ git push
 Gitlab から Drone を柵び竃し
 Drone がテスト喘に Docker コンテナを伏撹
∠ AnsibleでVagrant VM の軟
⊥ Ansibleで PaaS (raspaas) のインスト`ル
⌒ Ansible で App (ruby-sample) のインスト`ル
∂ Infrataster でテスト
∇ Ansible で App のオ`トスケ`リング
≡ Infrataster でテスト
≒ AnsibleでVagrant VM の
∠
≒
⊥ ⌒ ∇
∂ ≡
Docker コンテナ
VirtualBox VM
Infrataster
Ansible
Serverspec と Infrataster
21
[歌深] Introduction Infrataster
(https://speakerdeck.com/ryotarai/introducing-infrataster)
.drone.yml
22
image: "tetz/drone-npstudy"
git:
path:$$GITLAB/tetsusat/raspaas
script:
- rm $HOME/.ssh/id_rsa
- echo 'StrictHostKeyChecking=no' > $HOME/.ssh/ssh-config
- ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -q -N ''
- sshpass -p $$VAGRANT_HOST_PASS ssh-copy-id
$$VAGRANT_HOST_USER@$$VAGRANT_HOST
- echo 'vagrant-host ansible_ssh_host=$$VAGRANT_HOST
ansible_ssh_user=$$VAGRANT_HOST_USER' > hosts
- echo 'vagrant-guest ansible_ssh_port=22222 ansible_ssh_host=$$VAGRANT_HOST
ansible_ssh_user=$$VAGRANT_USER' >> hosts
- ansible-playbook -i hosts playbooks/vagrant-up.yml
- sshpass -p vagrant ssh-copy-id 'vagrant@$$VAGRANT_HOST -p 22222'
- ansible-playbook -i hosts playbooks/raspaas-setup.yml
- ansible-playbook -i hosts playbooks/app-setup.yml
- cd tests
- rspec spec/raspaas_app_spec.rb
- ansible-playbook -i ../hosts ../playbooks/app-auto-scale.yml
- rspec spec/raspaas_auto_scale_spec.rb
- ansible-playbook -i ../hosts ../playbooks/vagrant-destroy.yml
Ansibleインベントリ恬撹
Ansible Playbook g佩
Infrataster g佩
Ansible Playbooks
Raspaas のセットアップ
23
- hosts: vagrant-guest
tasks:
- name: restart docker engine
command: sudo service docker restart
- name: download bootstrap.sh
command: wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh
- name: chmod +x bootstrap.sh
command: chmod +x bootstrap.sh
- name: start bootstrap script
command: sudo ./bootstrap.sh teroku
playbooks/raspaas-setup.yml
Ansible Playbooks
サンプル App のセットアップ
24
- hosts: vagrant-guest
tasks:
- name: change ssh config for git push
shell: echo 'StrictHostKeyChecking no' > $HOME/.ssh/config
- name: git clone
command: git clone https://github.com/tetsusat/ruby-sample.git
- name: teroku create
command: teroku create
args:
chdir: ruby-sample/
- name: git push
command: git push teroku master
args:
chdir: ruby-sample/
playbooks/app-setup.yml
Infrastater Spec ファイル
サンプル App のテスト
25
require 'spec_helper'
describe server(:vagrant_host) do
describe http('http://<vagrant_host>:8080/ruby-sample') do
it "responds content including 'Hello, world'" do
expect(response.body).to include('Hello, world')
end
end
end
tests/spec/raspaas_app_spec.rb
Infrastater Spec ファイル
オ`トスケ`リングのテスト
26
require 'spec_helper'
seen = []
describe server(:vagrant_host) do
3.times do
describe http('http://<vagrant_host>:8080/ruby-sample') do
it "responds content including 'Hello, world' from unseen container" do
see = ""
if response.body =~ /Hello, world from (w+)/
see = $1
end
expect(seen).not_to include(see)
seen << see
end
end
end
end
tests/spec/raspaas_auto_scale_spec.rb
g佩イメ`ジ
27
払 撹孔
おわり
ご賠、ありがとうございました
m(_ _)m
28

More Related Content

ラズパイ2で咾 Docker PaaSを恬ってみたよ

  • 2. 徭失B初 ? 恃儲 學寄tetz ? 云茶氏の二鮫、\咾鬚靴討泙 ? 蝶ネットワ`クベンダで、SDN┐辰櫃ぃ碧 並をしてます 2
  • 3. tl;dr ? ラズパイ2で咾 Docker PaaS を徭恬してみた ので、その碧MみをB初します ? 徭恬した PaaS を CI ┥@A議インテグレ`ショ ンしてみたので、その碧MみをB初します ? テストするh廠をBした瘁に、テストするという吭龍 で、インフラ CI とやっていることは揖じ 3
  • 4. デモ ? <paas_name> は、屡贋の Linux コマンドと Linux ユ`ザとコ ンフリクトしなければ、なんでも辛 ? <paas_name> は、ユ`ティリティコマンドと git リモ`トリポジトリ の兆念に聞われる ? <paas_name> scale web=3 ? git push <paas_name> master 4 $ wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh $ chmod +x bootstrap.sh $ sudo ./bootstrap.sh <paas_name>
  • 5. そもそも Docker PaaS のうれしさ 5 Docker PaaS愔瓦PaaS ハ`ドウェア ハイパ`バイザ OS ハ`ドウェア OS Docker エンジン g佩h廠 冱Z、ライブラリ、ミド ルウェア g佩h廠 冱Z、ライブラリ、ミド ルウェア アプリケ`ション アプリケ`ション ? g佩h廠が謹晒すると、PaaS ユ` ザはうれしいが、PaaS 並I宀はメン テナンスが寄 ? PaaS ユ`ザは Docker コンテナで 嘛させられる冱Z、ライブラリ、ミド ルウェアを徭喇に旋喘できる ? PaaS 並I宀は Docker コンテナが 嘛するh廠を喘吭すればいい ? どちらもハッピ`
  • 6. なぜ、ラズパイ2で Docker PaaS ? 秀念 ? ラズパイ2からクアッドコアに。これをカツカツに聞いたい ? 云咄 ? x86 だと、すでにすぐれた Docker PaaS がかなりある(>_<) 6
  • 7. PaaS の デファクト - Heroku ? キャッチ`でポップなワ`クフロ`により匯弊L智 7 $ heroku create Creating polar-inlet-4930... done, stack is cedar-14 http://polar-inlet-4930.herokuapp.com/ | https://git.heroku.com/polar-inlet-4930.git Git remote heroku added $ heroku scale web=2 Scaling dynos... done, now running web at 2:standard-1x $ git push heroku master Fetching repository, done. Counting objects: 10, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 876 bytes | 0 bytes/s, done. Total 6 (delta 4), reused 0 (delta 0) ....
  • 8. Heroku Inspired な Docker PaaS? ? 恷弌巷蔚方議な蒙罾暴 ? ワ`クフロ`が Heroku っぽい ? <heroku> create ? git push <heroku> master ? <heroku> scale web=3 ? Buildpack 鬈瘁峰 ? 醤悶箭 ? シングルノ`ドで嘛する Dokku ? マルチノ`ドで嘛する Deis、Flynn 8
  • 9. Raspaas https://github.com/tetsusat/raspaas ? 旋喘辛嬬なh廠 ? x86_64 ? Ubuntu14.04 / Docker 1.6 # Vagrantfile 歌孚 ? ARMv7 ? Hypriot Docker Image for Raspberry Pi (Version 0.4) ? http://blog.hypriot.com/downloads/ ? Scaleway (www.scaleway.com) ? できること ? git push ´ で Docker コンテナが羨ち貧がる ? Buildpack には隆 ? Dockerfile を徭蛍で喘吭する駅勣あり (>_<) ? オ`トスケ`リング (heroku scale web=3 みたいなやつ) 9
  • 10. ちなみに Buildpack ? アプリケ`ションを徭咾返し、g佩するh廠を喘吭する Heroku の碧Mみ 10 [歌深] Buildpack Adventure 2 (http://ba2.herokuapp.com/)
  • 11. Heroku Inspired な Docker PaaS 曳^┣四衄井 11 Dokku Raspaas CPU ア`キテクチャ x86_64 x86_64 x86_64 x86_64 / ARMv7 OS CoreOS Ubuntu Ubuntu Ubuntu ノ`ド マルチ マルチ シングル シングル アプリケ`ションの デプロイ圭塀 Buildpack Dockerイメ`ジ Dockerfile Buildpack Dockerイメ`ジ Buildpack Dockerfile Dockerfile
  • 12. デモ┐弔鼎 12 $ git clone https://github.com/tetsusat/ruby-sample.git $ teroku create $ git push teroku master $ teroku scale web=3
  • 13. 旋喘コンポ`ネント ? gitreceive (https://github.com/progrium/gitreceive/) ? git push したHの git フックを碧譴韻襪燭瓩離罘`ティリティ ? Consul (https://www.consul.io/) ? サ`ビスディスカバリ ? Registrar (https://hub.docker.com/r/gliderlabs/registrator/) ? Docker API からサ`ビスを返して Consul へ鞠h ? Consul Template (https://github.com/hashicorp/consul-template) ? Consul イベントを返して Nginx のO協を厚仟 ? Nginx (http://nginx.org/) ? ル`タHTTP リクエストをロ`ドバランス ? Docker Compose (https://docs.docker.com/compose/) ? Docker コンテナ砿尖のユ`ティリティ 13
  • 14. git pushでデプロイできる碧Mみ 14 Git Repo git push teroku master git clone ´ docker build ´. docker run ´
  • 15. オ`トスケ`リングの碧Mみ 15 Docker エンジン registrar 鞠h Nginx + consul template app consul O協厚仟 teroku scale web=3 app app Docker コンテナ┘轡好謄爍 Docker コンテナ┘罘`ザ HTTP リクエスト Docker API
  • 16. Consul Template 16 {{range services}}upstream {{.Name}} { {{range service .Name}}server 10.0.2.15:{{.Port}}; {{else}}server 127.0.0.1:65535; # force a 502{{end}} }{{end}} server { listen 80; {{range services}}location /{{.Name}} { proxy_pass http://{{.Name}}/; }{{end}} } upstream ruby-sample { server 10.0.2.15:32768; server 10.0.2.15:32769; server 10.0.2.15:32770; } server { listen 80; }location /ruby-sample { proxy_pass http://ruby-sample/; } } /etc/nginx/conf.d/service.conf 匯何のみ/templates/service.ctmpl ? Consul のイベントをトリガ`にテンプレ`トから蒙協のファイルO 協ファイルなどを啜弔防撹し、アクション┘稀`ビスのリロ`など をg佩
  • 18. Drone+Gitlab+Vagrantで PaaS の CI h廠をBしてみた 18
  • 19. drone.io ? Travis CI、Circle CI のように、Github 吉の Git ホスティング サ`ビスとB亊できるホスティング侏の CI ツ`ル ? ホスティング井だけでなく、オンプレh廠で嘛するオ`プンソ`ス 井がある ? Drone + Gitlab + Vagrant で PaaS の CI h廠をオンプレに o創で恬れそう。。。 19
  • 20. PaaS の CI 20 Drone Host Vagrant/Virtualbox Drone Docker Engine app app app Gitlab へ git push Gitlab から Drone を柵び竃し Drone がテスト喘に Docker コンテナを伏撹 ∠ AnsibleでVagrant VM の軟 ⊥ Ansibleで PaaS (raspaas) のインスト`ル ⌒ Ansible で App (ruby-sample) のインスト`ル ∂ Infrataster でテスト ∇ Ansible で App のオ`トスケ`リング ≡ Infrataster でテスト ≒ AnsibleでVagrant VM の ∠ ≒ ⊥ ⌒ ∇ ∂ ≡ Docker コンテナ VirtualBox VM Infrataster Ansible
  • 21. Serverspec と Infrataster 21 [歌深] Introduction Infrataster (https://speakerdeck.com/ryotarai/introducing-infrataster)
  • 22. .drone.yml 22 image: "tetz/drone-npstudy" git: path:$$GITLAB/tetsusat/raspaas script: - rm $HOME/.ssh/id_rsa - echo 'StrictHostKeyChecking=no' > $HOME/.ssh/ssh-config - ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -q -N '' - sshpass -p $$VAGRANT_HOST_PASS ssh-copy-id $$VAGRANT_HOST_USER@$$VAGRANT_HOST - echo 'vagrant-host ansible_ssh_host=$$VAGRANT_HOST ansible_ssh_user=$$VAGRANT_HOST_USER' > hosts - echo 'vagrant-guest ansible_ssh_port=22222 ansible_ssh_host=$$VAGRANT_HOST ansible_ssh_user=$$VAGRANT_USER' >> hosts - ansible-playbook -i hosts playbooks/vagrant-up.yml - sshpass -p vagrant ssh-copy-id 'vagrant@$$VAGRANT_HOST -p 22222' - ansible-playbook -i hosts playbooks/raspaas-setup.yml - ansible-playbook -i hosts playbooks/app-setup.yml - cd tests - rspec spec/raspaas_app_spec.rb - ansible-playbook -i ../hosts ../playbooks/app-auto-scale.yml - rspec spec/raspaas_auto_scale_spec.rb - ansible-playbook -i ../hosts ../playbooks/vagrant-destroy.yml Ansibleインベントリ恬撹 Ansible Playbook g佩 Infrataster g佩
  • 23. Ansible Playbooks Raspaas のセットアップ 23 - hosts: vagrant-guest tasks: - name: restart docker engine command: sudo service docker restart - name: download bootstrap.sh command: wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh - name: chmod +x bootstrap.sh command: chmod +x bootstrap.sh - name: start bootstrap script command: sudo ./bootstrap.sh teroku playbooks/raspaas-setup.yml
  • 24. Ansible Playbooks サンプル App のセットアップ 24 - hosts: vagrant-guest tasks: - name: change ssh config for git push shell: echo 'StrictHostKeyChecking no' > $HOME/.ssh/config - name: git clone command: git clone https://github.com/tetsusat/ruby-sample.git - name: teroku create command: teroku create args: chdir: ruby-sample/ - name: git push command: git push teroku master args: chdir: ruby-sample/ playbooks/app-setup.yml
  • 25. Infrastater Spec ファイル サンプル App のテスト 25 require 'spec_helper' describe server(:vagrant_host) do describe http('http://<vagrant_host>:8080/ruby-sample') do it "responds content including 'Hello, world'" do expect(response.body).to include('Hello, world') end end end tests/spec/raspaas_app_spec.rb
  • 26. Infrastater Spec ファイル オ`トスケ`リングのテスト 26 require 'spec_helper' seen = [] describe server(:vagrant_host) do 3.times do describe http('http://<vagrant_host>:8080/ruby-sample') do it "responds content including 'Hello, world' from unseen container" do see = "" if response.body =~ /Hello, world from (w+)/ see = $1 end expect(seen).not_to include(see) seen << see end end end end tests/spec/raspaas_auto_scale_spec.rb