SlideShare ist ein Scribd-Unternehmen logo
1 von 28
[夏休み自由研究]
ラズパイ2で動く Docker PaaS
を作ってみたよ
自己紹介
 佐藤 哲大(tetz)
 本勉強会の企画、運営をしてます
 某ネットワークベンダで、SDN(っぽい)仕
事をしてます
2
tl;dr
 ラズパイ2で動く Docker PaaS を自作してみた
ので、その仕組みを紹介します
 自作した PaaS を CI (継続的インテグレーショ
ン)してみたので、その仕組みを紹介します
 テストする環境を構築した後に、テストするという意味
で、インフラ 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 エンジン
実行環境
(言語、ライブラリ、ミド
ルウェア)
実行環境
(言語、ライブラリ、ミド
ルウェア)
アプリケーション アプリケーション
 実行環境が多様化すると、PaaS ユー
ザはうれしいが、PaaS 事業者はメン
テナンスが大変
 PaaS ユーザは Docker コンテナで
動作させられる言語、ライブラリ、ミド
ルウェアを自由に利用できる
 PaaS 事業者は Docker コンテナが
動作する環境を用意すればいい
 どちらもハッピー
なぜ、ラズパイ2で Docker PaaS?
 建前
 ラズパイ2からクアッドコアに。これをカツカツに使いたい
 本音
 x86 だと、すでにすぐれた Docker PaaS がかなりある(>_<)
6
PaaS の デファクト - Heroku
 キャッチーでポップなワークフローにより一世風靡
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
 利用可能な環境
 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
 アプリケーションを自動で検知し、実行する環境を用意する Heroku
の仕組み
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 した際の git フックを仕掛けるためのユーティリティ
 Consul (https://www.consul.io/)
 サービスディスカバリ
 Registrar (https://hub.docker.com/r/gliderlabs/registrator/)
 Docker API からサービスを検知して Consul へ登録
 Consul Template (https://github.com/hashicorp/consul-template)
 Consul イベントを検知して Nginx の設定を更新
 Nginx (http://nginx.org/)
 ルータ(HTTP リクエストをロードバランス)
 Docker Compose (https://docs.docker.com/compose/)
 Docker コンテナ管理のユーティリティ
13
git pushでデプロイできる仕組み
14
Git Repo
git push teroku master
① git clone …
② docker build ….
③ docker run …
オートスケーリングの仕組み
15
Docker エンジン
registrar
① 登録
Nginx +
consul template
app
consul
② 設定更新
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 のイベントをトリガーにテンプレートから特定のファイル(設
定ファイルなど)を動的に生成し、アクション(サービスのリローなど)
を実行
Scaleway
 ARMベースのベアメタルクラウドサービス
 4コアCPU+50GB SSD で €2.99 (安っ!)
17
Drone+Gitlab+Vagrantで
PaaS の CI 環境を構築してみた
18
drone.io
 Travis CI、Circle CI のように、Github 等の Git ホスティング
サービスと連携できるホスティング型の CI ツール
 ホスティング版だけでなく、オンプレ環境で動作するオープンソース
版がある
 Drone + Gitlab + Vagrant で PaaS の CI 環境をオンプレに
無料で作れそう。。。
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 実行
Infrataster 実行
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
実行イメージ
27
失敗 成功
おわり
ご清聴、ありがとうございました
m(_ _)m
28

Weitere ähnliche Inhalte

Was ist angesagt?

Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineEtsuji Nakai
 
Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Masahito Zembutsu
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかえむ ばーど
 
爆速プレビュープロキシ pool
爆速プレビュープロキシ pool爆速プレビュープロキシ pool
爆速プレビュープロキシ poolmookjp
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西Masahide Yamamoto
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~Masaomi Kudo
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?ogawatti
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかEmma Haruka Iwao
 
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulicDocker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ puliccyberblack28 Ichikawa
 
Dockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかDockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかaxsh co., LTD.
 
Using LXC on Production
Using LXC on ProductionUsing LXC on Production
Using LXC on ProductionIsao Shimizu
 
Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要
Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要
Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要Etsuji Nakai
 
Rancher.ioを試してみる
Rancher.ioを試してみるRancher.ioを試してみる
Rancher.ioを試してみるTakaaki Fukai
 
Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~HommasSlide
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座Masahito Zembutsu
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもんMasahito Zembutsu
 

Was ist angesagt? (20)

Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのか
 
爆速プレビュープロキシ pool
爆速プレビュープロキシ pool爆速プレビュープロキシ pool
爆速プレビュープロキシ pool
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~
 
Docker入門
Docker入門Docker入門
Docker入門
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのか
 
Openresty
OpenrestyOpenresty
Openresty
 
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulicDocker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
 
Dockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかDockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんか
 
Linux Namespaces
Linux NamespacesLinux Namespaces
Linux Namespaces
 
Using LXC on Production
Using LXC on ProductionUsing LXC on Production
Using LXC on Production
 
Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要
Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要
Okinawa Open Days 2014 OpenStackハンズオンセミナー / OpenStackの機能概要
 
Rancher.ioを試してみる
Rancher.ioを試してみるRancher.ioを試してみる
Rancher.ioを試してみる
 
Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 

Andere mochten auch

API イントロダクション APIC-EM, Prime Infrastructure & CMX
API イントロダクション APIC-EM, Prime Infrastructure & CMXAPI イントロダクション APIC-EM, Prime Infrastructure & CMX
API イントロダクション APIC-EM, Prime Infrastructure & CMXnpsg
 
ネットワークプログラマビリティ勉強会 これまでのおさらい
ネットワークプログラマビリティ勉強会 これまでのおさらいネットワークプログラマビリティ勉強会 これまでのおさらい
ネットワークプログラマビリティ勉強会 これまでのおさらいnpsg
 
CDP Indicator
CDP IndicatorCDP Indicator
CDP Indicatornpsg
 
VPP事始め
VPP事始めVPP事始め
VPP事始めnpsg
 
物理ネットワーク受け入れテストの自動化を考える
物理ネットワーク受け入れテストの自動化を考える物理ネットワーク受け入れテストの自動化を考える
物理ネットワーク受け入れテストの自動化を考えるskipping classes
 
自動化と画面を考えてみました
自動化と画面を考えてみました自動化と画面を考えてみました
自動化と画面を考えてみましたskipping classes
 
ネットワークプログラマビリティ勉強会
ネットワークプログラマビリティ勉強会ネットワークプログラマビリティ勉強会
ネットワークプログラマビリティ勉強会Tomoya Hibi
 
Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Tomoya Hibi
 
Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析npsg
 
いんふらフレンズ
いんふらフレンズいんふらフレンズ
いんふらフレンズMiho Yamamoto
 
ELK ではじめる自宅ネットワーク監視
ELK ではじめる自宅ネットワーク監視ELK ではじめる自宅ネットワーク監視
ELK ではじめる自宅ネットワーク監視npsg
 
NetOpsCoding#5 introduction
NetOpsCoding#5 introductionNetOpsCoding#5 introduction
NetOpsCoding#5 introductionTaiji Tsuchiya
 
Ansible x napalm x nso 解説・比較パネルディスカッション nso
Ansible x napalm x nso 解説・比較パネルディスカッション nsoAnsible x napalm x nso 解説・比較パネルディスカッション nso
Ansible x napalm x nso 解説・比較パネルディスカッション nsoAkira Iwamoto
 
Telemetry事始め
Telemetry事始めTelemetry事始め
Telemetry事始めnpsg
 
ネットワーク運用とIoT
ネットワーク運用とIoTネットワーク運用とIoT
ネットワーク運用とIoTcloretsblack
 
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudyネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudyYahoo!デベロッパーネットワーク
 
ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)akira6592
 
パケットキャプチャでインフラ主導のデバッグ環境を作る
パケットキャプチャでインフラ主導のデバッグ環境を作るパケットキャプチャでインフラ主導のデバッグ環境を作る
パケットキャプチャでインフラ主導のデバッグ環境を作るcloretsblack
 

Andere mochten auch (20)

API イントロダクション APIC-EM, Prime Infrastructure & CMX
API イントロダクション APIC-EM, Prime Infrastructure & CMXAPI イントロダクション APIC-EM, Prime Infrastructure & CMX
API イントロダクション APIC-EM, Prime Infrastructure & CMX
 
ネットワークプログラマビリティ勉強会 これまでのおさらい
ネットワークプログラマビリティ勉強会 これまでのおさらいネットワークプログラマビリティ勉強会 これまでのおさらい
ネットワークプログラマビリティ勉強会 これまでのおさらい
 
CDP Indicator
CDP IndicatorCDP Indicator
CDP Indicator
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
 
物理ネットワーク受け入れテストの自動化を考える
物理ネットワーク受け入れテストの自動化を考える物理ネットワーク受け入れテストの自動化を考える
物理ネットワーク受け入れテストの自動化を考える
 
自動化と画面を考えてみました
自動化と画面を考えてみました自動化と画面を考えてみました
自動化と画面を考えてみました
 
Contiv
ContivContiv
Contiv
 
ネットワークプログラマビリティ勉強会
ネットワークプログラマビリティ勉強会ネットワークプログラマビリティ勉強会
ネットワークプログラマビリティ勉強会
 
Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続
 
Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析
 
いんふらフレンズ
いんふらフレンズいんふらフレンズ
いんふらフレンズ
 
Ansible npstudy-shtsuchi
Ansible npstudy-shtsuchiAnsible npstudy-shtsuchi
Ansible npstudy-shtsuchi
 
ELK ではじめる自宅ネットワーク監視
ELK ではじめる自宅ネットワーク監視ELK ではじめる自宅ネットワーク監視
ELK ではじめる自宅ネットワーク監視
 
NetOpsCoding#5 introduction
NetOpsCoding#5 introductionNetOpsCoding#5 introduction
NetOpsCoding#5 introduction
 
Ansible x napalm x nso 解説・比較パネルディスカッション nso
Ansible x napalm x nso 解説・比較パネルディスカッション nsoAnsible x napalm x nso 解説・比較パネルディスカッション nso
Ansible x napalm x nso 解説・比較パネルディスカッション nso
 
Telemetry事始め
Telemetry事始めTelemetry事始め
Telemetry事始め
 
ネットワーク運用とIoT
ネットワーク運用とIoTネットワーク運用とIoT
ネットワーク運用とIoT
 
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudyネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
 
ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)
 
パケットキャプチャでインフラ主導のデバッグ環境を作る
パケットキャプチャでインフラ主導のデバッグ環境を作るパケットキャプチャでインフラ主導のデバッグ環境を作る
パケットキャプチャでインフラ主導のデバッグ環境を作る
 

Ähnlich wie ラズパイ2で動く Docker PaaSを作ってみたよ

WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築Saito5656
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門hiro nemu
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Naoki Nagazumi
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
DockerハンズオンKazuyuki Mori
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境Kazuhiro Nishiyama
 
Docker handson
Docker handsonDocker handson
Docker handsonkoda3
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門Masahito Zembutsu
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Masahito Zembutsu
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門Tsukasa Kato
 
Docker講習会資料
Docker講習会資料Docker講習会資料
Docker講習会資料teruyaono1
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Masahito Zembutsu
 

Ähnlich wie ラズパイ2で動く Docker PaaSを作ってみたよ (20)

WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
Dockerと継続的インテグレーション
Dockerと継続的インテグレーションDockerと継続的インテグレーション
Dockerと継続的インテグレーション
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
Dockerの導入
Dockerの導入Dockerの導入
Dockerの導入
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境
 
Docker handson
Docker handsonDocker handson
Docker handson
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門
 
Docker講習会資料
Docker講習会資料Docker講習会資料
Docker講習会資料
 
Docker社内勉強会
Docker社内勉強会Docker社内勉強会
Docker社内勉強会
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 

Mehr von npsg

Webアプリケーションによる電源管理システムのご紹介
Webアプリケーションによる電源管理システムのご紹介Webアプリケーションによる電源管理システムのご紹介
Webアプリケーションによる電源管理システムのご紹介npsg
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態npsg
 
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~npsg
 
ネットワークプログラマビリティ勉強会 目的と方針(暫定)
ネットワークプログラマビリティ勉強会 目的と方針(暫定)ネットワークプログラマビリティ勉強会 目的と方針(暫定)
ネットワークプログラマビリティ勉強会 目的と方針(暫定)npsg
 
IxVM on CML
IxVM on CMLIxVM on CML
IxVM on CMLnpsg
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefnpsg
 

Mehr von npsg (6)

Webアプリケーションによる電源管理システムのご紹介
Webアプリケーションによる電源管理システムのご紹介Webアプリケーションによる電源管理システムのご紹介
Webアプリケーションによる電源管理システムのご紹介
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
 
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
 
ネットワークプログラマビリティ勉強会 目的と方針(暫定)
ネットワークプログラマビリティ勉強会 目的と方針(暫定)ネットワークプログラマビリティ勉強会 目的と方針(暫定)
ネットワークプログラマビリティ勉強会 目的と方針(暫定)
 
IxVM on CML
IxVM on CMLIxVM on CML
IxVM on CML
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 

ラズパイ2で動く Docker PaaSを作ってみたよ

  • 2. 自己紹介  佐藤 哲大(tetz)  本勉強会の企画、運営をしてます  某ネットワークベンダで、SDN(っぽい)仕 事をしてます 2
  • 3. tl;dr  ラズパイ2で動く Docker PaaS を自作してみた ので、その仕組みを紹介します  自作した PaaS を CI (継続的インテグレーショ ン)してみたので、その仕組みを紹介します  テストする環境を構築した後に、テストするという意味 で、インフラ 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 エンジン 実行環境 (言語、ライブラリ、ミド ルウェア) 実行環境 (言語、ライブラリ、ミド ルウェア) アプリケーション アプリケーション  実行環境が多様化すると、PaaS ユー ザはうれしいが、PaaS 事業者はメン テナンスが大変  PaaS ユーザは Docker コンテナで 動作させられる言語、ライブラリ、ミド ルウェアを自由に利用できる  PaaS 事業者は Docker コンテナが 動作する環境を用意すればいい  どちらもハッピー
  • 6. なぜ、ラズパイ2で Docker PaaS?  建前  ラズパイ2からクアッドコアに。これをカツカツに使いたい  本音  x86 だと、すでにすぐれた Docker PaaS がかなりある(>_<) 6
  • 7. PaaS の デファクト - Heroku  キャッチーでポップなワークフローにより一世風靡 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  利用可能な環境  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  アプリケーションを自動で検知し、実行する環境を用意する Heroku の仕組み 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 した際の git フックを仕掛けるためのユーティリティ  Consul (https://www.consul.io/)  サービスディスカバリ  Registrar (https://hub.docker.com/r/gliderlabs/registrator/)  Docker API からサービスを検知して Consul へ登録  Consul Template (https://github.com/hashicorp/consul-template)  Consul イベントを検知して Nginx の設定を更新  Nginx (http://nginx.org/)  ルータ(HTTP リクエストをロードバランス)  Docker Compose (https://docs.docker.com/compose/)  Docker コンテナ管理のユーティリティ 13
  • 14. git pushでデプロイできる仕組み 14 Git Repo git push teroku master ① git clone … ② docker build …. ③ docker run …
  • 15. オートスケーリングの仕組み 15 Docker エンジン registrar ① 登録 Nginx + consul template app consul ② 設定更新 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 のイベントをトリガーにテンプレートから特定のファイル(設 定ファイルなど)を動的に生成し、アクション(サービスのリローなど) を実行
  • 18. Drone+Gitlab+Vagrantで PaaS の CI 環境を構築してみた 18
  • 19. drone.io  Travis CI、Circle CI のように、Github 等の Git ホスティング サービスと連携できるホスティング型の CI ツール  ホスティング版だけでなく、オンプレ環境で動作するオープンソース 版がある  Drone + Gitlab + Vagrant で PaaS の CI 環境をオンプレに 無料で作れそう。。。 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 実行 Infrataster 実行
  • 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