ChefsMeeting.nagoya
2014/09/24 Vol.4
自己紹介
● 伊東 宏起 (@_nihi)
○
来栖川電算 Infrastructure Support Engineer
○
最近は IPv6 に興味があります
○
社内では Zabbix 管理したり、ネットワークの保守をしたり
○
来年からさくらインターネットで働きます
● はまじ (@HmjKRS)
○
来栖川電算 Development Support Engineer
○
Vagrant + Chef を独学した人
○
普段は
■
Jenkins や Atlassian 製品のプラグインを作ったり
■
ふつうのプロジェクトのテストや CI したり
■
Java 研修担当
■
引きこもり系エンジニア
勉強会のきっかけ
● 主催者は完全に独学
● Web 上にまともな情報が少ない、見つけにくい
○
「やってみた」系記事が多く、そのほとんどがノイズ
○
明らかに使ったこともない人が書いてる記事がある
● なんとなく使えているけど。。
○
これほんとうにあってるのかな?
○
もっと楽な方法はないのかな?
→ 情報交換したい!
本日の内容
1. Chef Container とは
2. Chef Container を試す
1) 環境構築
2) 初期化
3) Attribute の定義
4) イメージのビルド
5) コンテナの起動
現時点での Chef Container をオススメしたいわけではありません …Chef Container
● どういうもの?
Chef Container
● どういうもの?
Docker 流行ってるけど今まで Chef で書いていたものを
Dockerfile に書き直すのしんどい
Chef Container
● どういうもの?
Docker 流行ってるけど今まで Chef で書いていたものを
Dockerfile に書き直すのしんどい
knife でイメージをつくれるようにしたよ!
knife-container
※ Recipe の実行は後述の chef-init が担当Chef Container
● どういうもの?
Docker に init システムがなくて
Chef Container
● どういうもの?
Docker に init システムがなくて
サービス管理がしんどい
runit で管理できるようにしたよ!
chef-container(chef-init)
● つまりどういうことだってばよ…
Chef Container
knife-container Docker Engine container runit chef-init Apache MySQL entry point execute image commit knife chef-container buildインストール
● [前提] Docker & ChefDK
● Chef Container 本体をインストール
● Chef Container のインタフェースをインストール
$ chef gem install knife-container --no-rdoc --no-riChef Container を試す
必要なソフトウェア
VirtualBox
https://www.virtualbox.org/
Vagrant
Vagrant プラグイン
VM に Chef をインストールするプラグイン
VM の Guest Additions を更新するプラグイン
$ vagrant plugin install vagrant-omnibusVM を起動、ログイン
ChefsMeeting リポジトリを Clone
開発環境 VM を起動
ログイン
$ cd chefs_meeting/environments/chef-container/ $ vagrant up$ git clone https://kurusugawa.jp/stash/scm/chef/chefs_meeting.git
Chef Container を試す
1. 環境構築
→ 完了
2. 初期化
3. Attribute の定義
4. イメージのビルド
5. コンテナの起動
Chef Container を試す
初期化
● knife container docker init
● <image>
: これからつくるイメージの名前
● -r <run_list>
: chef-init の run_list
● -z
: ローカルモード
● -b
: Berkshelf をつかう
● -f <image>
: 使用するベースイメージ
詳細: https://docs.getchef.com/plugin_knife_container.html#docker-init
初期化
● knife container docker init
● 何が起こるか
○
ベースイメージが pull される
○
必要なファイルが生成される
初期化
● knife container docker init
● pull されたイメージ
$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE chef/ubuntu-12.04 latest cc83fc2b4611 3 weeks ago 289.2 MB
chefs_meeting/demo latest cc83fc2b4611 3 weeks ago 289.2 MB
0.2.0 では Docker Hub の chef リポジトリ(https://registry.hub.docker. com/repos/chef/)
にあるイメージのみベースにできる。
初期化
● knife container docker init
● 生成されたファイル
$ tree dockerfiles/ dockerfiles/ └── chefs_meeting └── demo ├── Berksfile ├── Dockerfile └── chef ├── first-boot.json └── zero.rb 3 directories, 4 files Image と同名のディレクトリが生成された。初期化
● knife container docker init
● 生成されたファイル
$ tree dockerfiles/ dockerfiles/ └── chefs_meeting └── demo ├── Berksfile ├── Dockerfile └── chef ├── first-boot.json └── zero.rb 3 directories, 4 files 生成された Dockerfile。 chefs_meeting/demo をベースに chef-init を実行する構成に なっている。初期化
● knife container docker init
● 生成されたファイル
$ tree dockerfiles/ dockerfiles/ └── chefs_meeting └── demo ├── Berksfile ├── Dockerfile └── chef ├── first-boot.json └── zero.rb 3 directories, 4 files chef-init が参照する json ファイル。 init 時に指定した run_list がここに書かれている。 このファイルはあとで編集する必要がある。初期化
● knife container docker init
● 生成されたファイル
$ tree dockerfiles/ dockerfiles/ └── chefs_meeting └── demo ├── Berksfile ├── Dockerfile └── chef ├── first-boot.json └── zero.rb 3 directories, 4 files -b オプションをつけたので Berksfile が生成された。 init 時に指定した run_list の Cookbook がSupermarket からダウンロードされるように記述されている。 $ knife container docker init chefs_meeting/demo -r 'recipe[apache2]' -z -b -f chef/ubuntu-12.04
Chef Container を試す
1. 環境構築
→ 完了
2. 初期化
→ 完了
3. Attribute の定義
4. イメージのビルド
5. コンテナの起動
Chef Container を試す
あれ、ちょっと待って!
docker コンテナって、
init システムを持ってないんだよね?
Recipe の中で service Resource を書いても
docker コンテナには効かない…?
Node Attribute の定義
Recipe の中で service Resource を書いても
docker コンテナには効かない…?
代わりに container_service Resource がある
Node Attribute の定義
container_service Resource って?
● chef-init が Recipe を収束するときに、
service Resource の代わりに叩いてくれる Resource
● runit によるサービスの管理を提供
container_service Resource を使うには
● Recipe に書いてある service Resource と
runit のコマンドのひも付けが必要
container_service Resource を使うには
● Recipe に書いてある service Resource と
runit のコマンドのひも付けが必要
Node Attribute の定義
container_service Resource のひも付けを定義
Node Attribute の定義
$ vi dockerfiles/chefs_meeting/demo/chef/first-boot.json { “run_list”: [“ “recipe[apache2]” ], “container_service”: { “apache2”: {“command”: “/usr/sbin/apache2 -k start” }
} }
apache2 Cookbook の中で service[apache2] Resource を使用している。 これに対応するコマンドをここで定義しなければならない。
Chef Container を試す
1. 環境構築
→ 完了
2. 初期化
→ 完了
3. Attribute の定義
→ 完了
4. イメージのビルド
5. コンテナの起動
Chef Container を試す
イメージのビルド
● knife container docker build
● <image>
: これからつくるイメージの名前
● -z
: ローカルモード
イメージのビルド
● knife container docker build
● 何が起こるか
○
Dockerfile が実行される
○
chef-init が実行される
○
run_list の Recipe が収束される
○
イメージがコミットされる
イメージのビルド
● knife container docker build
● コミットされたイメージ
$ knife container docker build chefs_meeting/demo -z
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE chefs_meeting/demo latest 857e880a046d 23 seconds ago 290 MB
Chef Container を試す
1. 環境構築
→ 完了
2. 初期化
→ 完了
3. Attribute の定義→ 完了
4. イメージのビルド
→ 完了
5. コンテナの起動
Chef Container を試す
コンテナの起動
● docker run
● -d
: デーモンモード
(コンテナのバックグラウンド実行)
● <image>
: ベースイメージの名前
$ docker run -d chefs_meeting/demoコンテナの起動
● docker run
● 起動されたコンテナ
$ docker run -d chefs_meeting/demo$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コンテナの起動
● docker run
● コンテナ内のプロセス
$ docker run -d chefs_meeting/demo$ docker top `docker ps -q | head -n 1`
UID PID PPID C STIME TTY TIME CMD
root 4982 4976 0 15:27 ? 00:00:00 /opt/chef/embedded/bin/ruby /usr/bin/chef-init --onboot root 5037 4982 0 15:27 ? 00:00:00 /opt/chef/embedded/bin/runsvdir -P /opt/chef/service 'log:...'. root 5243 4982 0 15:28 ? 00:00:00 /usr/sbin/apache2 -k start
33 5366 5243 0 15:28 ? 00:00:00 /usr/sbin/apache2 -k start 33 5367 5243 0 15:28 ? 00:00:00 /usr/sbin/apache2 -k start 33 5368 5243 0 15:28 ? 00:00:00 /usr/sbin/apache2 -k start 33 5425 5243 0 15:28 ? 00:00:00 /usr/sbin/apache2 -k start
コンテナの起動
● docker run
● コンテナのIPアドレス
● コンテナの apache にアクセス
$ docker run -d chefs_meeting/demo$ docker inspect --format="{{ .NetworkSettings.IPAddress }}" `docker ps -q | head -n 1` 172.17.0.8
$ curl http://172.17.0.8/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head>
<title>404 Not Found</title> </head><body>
<h1>Not Found</h1>
<p>The requested URL / was not found on this server.</p> <hr>
<address>Apache Server at 172.17.0.8 Port 80</address> </body></html>