ビルドサーバで使うdocker

58
2014/12/19 shin1x1 DevLove 関西 ビルドサーバで使う Docker

Upload: masashi-shinbara

Post on 12-Jul-2015

12.127 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: ビルドサーバで使うDocker

2014/12/19 shin1x1

DevLove 関西

ビルドサーバで使う Docker

Page 2: ビルドサーバで使うDocker

Agenda

(c) 2014 Masashi Shinbara @shin1x1

• 開発構成 • 旧ビルドサーバ(Docker導入前) • 現ビルドサーバ(Docker導入後) • Docker in CI • 運用してみて • まとめ

Page 3: ビルドサーバで使うDocker

開発構成

(c) 2014 Masashi Shinbara @shin1x1

Page 4: ビルドサーバで使うDocker

PHPプロジェクト

(c) 2014 Masashi Shinbara @shin1x1

• Web アプリケーション開発 • PHP / Webサーバ / DB / KVS 等々 • PHPUnit で自動テスト

Page 5: ビルドサーバで使うDocker

ビルドサーバ

(c) 2014 Masashi Shinbara @shin1x1

• Jenkins サーバ • PHPUnit によるテスト実行 • デプロイ [ステージング / 本番] • (カバレッジ計測、静的解析等)

Page 6: ビルドサーバで使うDocker

旧ビルドサーバ

(c) 2014 Masashi Shinbara @shin1x1

Page 7: ビルドサーバで使うDocker

(c) 2014 Masashi Shinbara @shin1x1

構成

Mac

(1) git push

(2) hook

(3) git pull

社内サーバ(4) notification

Page 8: ビルドサーバで使うDocker

社内Jenkinsサーバ

(c) 2014 Masashi Shinbara @shin1x1

• 2009年頃構築 • 複数プロジェクトを管理 • 1サーバに別バージョンのPHPやDBを同居 • ビルドタスクを欲張る (カバレッジ、APIドキュメント、静的解析等)

Page 9: ビルドサーバで使うDocker

困っていたこと

(c) 2014 Masashi Shinbara @shin1x1

• プロジェクト毎の環境構築が面倒 (パスやポートを変えて同居)

• トラブルシューティングが面倒 • git push の度にサーバが唸る

Page 10: ビルドサーバで使うDocker

困っていたこと

(c) 2014 Masashi Shinbara @shin1x1

• プロジェクト毎の環境構築が面倒 (パスやポートを変えて同居)

• トラブルシューティングが面倒 • git push の度にサーバが唸る

Page 11: ビルドサーバで使うDocker

困っていたこと

(c) 2014 Masashi Shinbara @shin1x1

• プロジェクト毎の環境構築が面倒 (パスやポートを変えて同居)

• トラブルシューティングが面倒 • git push の度にサーバが唸る

Page 12: ビルドサーバで使うDocker

現ビルドサーバ

(c) 2014 Masashi Shinbara @shin1x1

Page 13: ビルドサーバで使うDocker

(c) 2014 Masashi Shinbara @shin1x1

構成

Mac

private repo

(1) git push

ビルドサーバ(さくらVPS)

(2) hook

(3) git pull

(4) docker build & docker run

(5) notification

Page 14: ビルドサーバで使うDocker

現Jenkinサーバ

(c) 2014 Masashi Shinbara @shin1x1

• さくらのVPS(2G)/ 月々1,580円 • Memory: 2GB • CPU: 仮想3Core • HDD: 200GB • CentOS 6.6

Page 15: ビルドサーバで使うDocker

構成のポイント

(c) 2014 Masashi Shinbara @shin1x1

• 外部サーバ、SaaS を利用 • Dockerでビルド環境を構築 • タスクを自動テスト実行に絞る

Page 16: ビルドサーバで使うDocker

Docker in CI

(c) 2014 Masashi Shinbara @shin1x1

Page 17: ビルドサーバで使うDocker

Dockerの利用方針

(c) 2014 Masashi Shinbara @shin1x1

• アプリケーションが動作する環境を 1 コンテナに集約

• Dockerfile を push して、 Jenkins サーバでイメージを生成

• アプリケーションは、ホストからマウント コンテナは、実行環境に徹する

Page 18: ビルドサーバで使うDocker

(c) 2014 Masashi Shinbara @shin1x1

構成

Mac

private repo

(1) git push

CI サーバ(さくらVPS)

(2) hook

(3) git pull

(4) docker build & docker run

Page 19: ビルドサーバで使うDocker

(c) 2014 Masashi Shinbara @shin1x1

Dockerfile

Mac

Dockerfile

private repo

CI サーバ(さくらVPS)

Page 20: ビルドサーバで使うDocker

Dockerfile

(c) 2014 Masashi Shinbara @shin1x1

• Dockerfile とプロビジョンファイルを用意 • プロビジョンには Ansible を利用 • 開発プロジェクトと同じリポジトリで管理

Page 21: ビルドサーバで使うDocker

FROM centos:centos6

# Ansible インストール、プロビジョンRUN …

# Supervisor インストールRUN …

# アプリケーションセットアップ、テスト実行CMD …

Dockerfile

Page 22: ビルドサーバで使うDocker

FROM centos:centos6

# Ansible インストールRUN …

# Supervisor インストールRUN …

# アプリケーションセットアップ、テスト実行CMD …

Dockerfile

CentOS Official Image

Page 23: ビルドサーバで使うDocker

FROM centos:centos6

# Ansible インストール、プロビジョンRUN …

# Supervisor インストールRUN …

# アプリケーションセットアップ、テスト実行CMD …

Dockerfile

プロビジョン

Page 24: ビルドサーバで使うDocker

FROM centos:centos6

# Ansible インストール、プロビジョンRUN …

# Supervisor インストールRUN …

# アプリケーションセットアップ、テスト実行CMD …

Dockerfile

サービス起動用

Page 25: ビルドサーバで使うDocker

FROM centos:centos6

# Ansible インストール、プロビジョンRUN …

# Supervisor インストールRUN …

# アプリケーションセットアップ、テスト実行CMD …

Dockerfile

コンテナ実行コマンド

Page 26: ビルドサーバで使うDocker

Ansible

(c) 2014 Masashi Shinbara @shin1x1

• コンテナにインストール • ローカルコネクションで自身にプロビジョン • playbookやroleを別環境 (開発、ステージング等)と共有

• レイヤを節約

Page 27: ビルドサーバで使うDocker

RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpmRUN yum -y install ansible libselinux-python sudoADD provision /opt/provisionRUN ansible-playbook /opt/provision/docker.yml --connection=local -i /opt/provision/localhost -vv

Ansible

Page 28: ビルドサーバで使うDocker

RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpmRUN yum -y install ansible libselinux-python sudoADD provision /opt/provisionRUN ansible-playbook /opt/provision/docker.yml --connection=local -i /opt/provision/localhost -vv

Ansible

Ansibleインストール

Page 29: ビルドサーバで使うDocker

RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpmRUN yum -y install ansible libselinux-python sudoADD provision /opt/provisionRUN ansible-playbook /opt/provision/docker.yml --connection=local -i /opt/provision/localhost -vv

Ansible

プロビジョンファイルをインポート

Page 30: ビルドサーバで使うDocker

RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpmRUN yum -y install ansible libselinux-python sudoADD provision /opt/provisionRUN ansible-playbook /opt/provision/docker.yml --connection=local -i /opt/provision/localhost -vv

Ansible

ansible-playbook 実行 (ローカルコネクション)

Page 31: ビルドサーバで使うDocker

Supervisor

(c) 2014 Masashi Shinbara @shin1x1

• デーモンプロセスを起動(死活監視込) • 1プロセスで、複数のデーモンを起動 • Webサーバ、DB を起動

Page 32: ビルドサーバで使うDocker

RUN yum -y install python-setuptoolsRUN easy_install supervisorADD docker/supervisord.conf /etc/supervisord.conf

Supervisor

Supervisor インストール

Page 33: ビルドサーバで使うDocker

RUN yum -y install python-setuptoolsRUN easy_install supervisorADD docker/supervisord.conf /etc/supervisord.conf

Supervisor

設定ファイルをインポート

Page 34: ビルドサーバで使うDocker

コンテナコマンド

(c) 2014 Masashi Shinbara @shin1x1

• Supervisor を起動 • composer install(依存解決) • DBマイグレーション • PHPUnit(自動テスト)実行

Page 35: ビルドサーバで使うDocker

コンテナコマンド

CMD /usr/bin/supervisord -c /etc/supervisord.conf && \ cd /share && \ /usr/bin/composer install && \ php artisan migrate --env=testing && \ ./vendor/bin/phpunit --log-junit \ /share/reports/junit.xml \ —coverage-html /share/reports/coverage \ —coverage-clover /share/reports/coverage.xml

Page 36: ビルドサーバで使うDocker

CMD /usr/bin/supervisord -c /etc/supervisord.conf && \ cd /share && \ /usr/bin/composer install && \ php artisan migrate --env=testing && \ ./vendor/bin/phpunit --log-junit \ /share/reports/junit.xml \ —coverage-html /share/reports/coverage \ —coverage-clover /share/reports/coverage.xml

コンテナコマンド

Supervisor 起動

Page 37: ビルドサーバで使うDocker

CMD /usr/bin/supervisord -c /etc/supervisord.conf && \ cd /share && \ /usr/bin/composer install && \ php artisan migrate --env=testing && \ ./vendor/bin/phpunit --log-junit \ /share/reports/junit.xml \ —coverage-html /share/reports/coverage \ —coverage-clover /share/reports/coverage.xml

コンテナコマンド

依存解決

Page 38: ビルドサーバで使うDocker

CMD /usr/bin/supervisord -c /etc/supervisord.conf && \ cd /share && \ /usr/bin/composer install && \ php artisan migrate --env=testing && \ ./vendor/bin/phpunit --log-junit \ /share/reports/junit.xml \ —coverage-html /share/reports/coverage \ —coverage-clover /share/reports/coverage.xml

コンテナコマンド

DBマイグレーション

Page 39: ビルドサーバで使うDocker

CMD /usr/bin/supervisord -c /etc/supervisord.conf && \ cd /share && \ /usr/bin/composer install && \ php artisan migrate --env=testing && \ ./vendor/bin/phpunit --log-junit \ /share/reports/junit.xml \ —coverage-html /share/reports/coverage \ —coverage-clover /share/reports/coverage.xml

コンテナコマンド

自動テスト実行

Page 40: ビルドサーバで使うDocker

(c) 2014 Masashi Shinbara @shin1x1

Jenkinsで実行

Mac

private repo

CI サーバ(さくらVPS)

docker build && run

Page 41: ビルドサーバで使うDocker

Jenkinsで実行

(c) 2014 Masashi Shinbara @shin1x1

• git pull でリポジトリから Dockerfile 取得 • docker build でイメージ生成 • docker run でコンテナ実行 • 結果レポートを Jenkins で表示

Page 42: ビルドサーバで使うDocker

Jenkinsで実行

(c) 2014 Masashi Shinbara @shin1x1

Page 43: ビルドサーバで使うDocker

Jenkinsで実行

(c) 2014 Masashi Shinbara @shin1x1

sudo docker build -t ${JOB_NAME} .sudo docker run -v ${WORKSPACE}/src:/share ${JOB_NAME}

Page 44: ビルドサーバで使うDocker

docker build

(c) 2014 Masashi Shinbara @shin1x1

• Dockerfile からイメージをビルド • ジョブ名(${JOB_NAME})をイメージ名に

sudo docker build -t ${JOB_NAME} .

Page 45: ビルドサーバで使うDocker

docker run

(c) 2014 Masashi Shinbara @shin1x1

• 生成したイメージからコンテナ実行 • -v で、アプリケーションディレクトリを マウント

sudo docker run -v ${WORKSPACE}/src:/share ${JOB_NAME}

Page 46: ビルドサーバで使うDocker

マウントディレクトリ対応

(c) 2014 Masashi Shinbara @shin1x1

${WORKSPACE}/src + application_code + build/

/share + application_code + build/

ホスト(Jenkins) コンテナ

Page 47: ビルドサーバで使うDocker

アプリケーション

(c) 2014 Masashi Shinbara @shin1x1

${WORKSPACE}/src + application_code + build/

/share + application_code + build/

ホスト(Jenkins) コンテナ

アプリケーションを参照

Page 48: ビルドサーバで使うDocker

結果レポート

(c) 2014 Masashi Shinbara @shin1x1

${WORKSPACE}/src + application_code + build/

/share + application_code + build/

ホスト(Jenkins) コンテナ

/share/build/ に 結果ログを出力

Page 49: ビルドサーバで使うDocker

結果レポート

(c) 2014 Masashi Shinbara @shin1x1

${WORKSPACE}/src + application_code + build/

/share + application_code + build/

ホスト(Jenkins) コンテナ

build/ のログから 結果レポート生成

Page 50: ビルドサーバで使うDocker

結果レポート

(c) 2014 Masashi Shinbara @shin1x1

Page 51: ビルドサーバで使うDocker

8ヶ月運用してみて

(c) 2014 Masashi Shinbara @shin1x1

Page 52: ビルドサーバで使うDocker

Dockerコンテナの良さ

(c) 2014 Masashi Shinbara @shin1x1

• プロジェクト毎に独立した環境 • 軽量なので、低スペック機でも利用可能 • 毎回、作って、使って、捨ててなので、管理が楽 • どこでも同じコンテナが作れるので、メンテが楽 (boot2docker で検証できる)

Page 53: ビルドサーバで使うDocker

突然のテスト失敗

(c) 2014 Masashi Shinbara @shin1x1

• 開発環境で all green だったテストがこける • なぜか依存解決で失敗 • コンテナから外部へ通信できない>< • docker デーモン再起動で解決

Page 54: ビルドサーバで使うDocker

突然のテスト失敗2

(c) 2014 Masashi Shinbara @shin1x1

• docker デーモン再起動でも復旧せず • yum install でエラー • EPEL の CA証明書の期限切れ • ベースイメージを更新 (yum update ca-certificates でも ok)

Page 55: ビルドサーバで使うDocker

今後

(c) 2014 Masashi Shinbara @shin1x1

• ステージングサーバへのコンテナデプロイ • docker コンテナ実行環境は クラウドサービスに任せたい

• コンテナレポジトリも任せたい • 全部自分でやるなら、PaaS の方が楽

Page 56: ビルドサーバで使うDocker

まとめ

(c) 2014 Masashi Shinbara @shin1x1

Page 57: ビルドサーバで使うDocker

(c) 2014 Masashi Shinbara @shin1x1

まとめ

• マルチな環境を同居させるのに便利 • ビルド、ジョブワーカーなど 使い捨ての環境なら、実用的

• 常に起動するサービスなら、 docker デーモン運用、デプロイ、監視等々を Dockerクラウドサービスに任せたい

Page 58: ビルドサーバで使うDocker

@shin1x1

(c) 2014 Masashi Shinbara @shin1x1