Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ビルドサーバで使うDocker

21,270 views

Published on

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

Published in: Technology
  • Be the first to comment

ビルドサーバで使うDocker

  1. 1. 2014/12/19 shin1x1 DevLove 関西 ビルドサーバで使う Docker
  2. 2. Agenda (c) 2014 Masashi Shinbara @shin1x1 • 開発構成 • 旧ビルドサーバ(Docker導入前) • 現ビルドサーバ(Docker導入後) • Docker in CI • 運用してみて • まとめ
  3. 3. 開発構成 (c) 2014 Masashi Shinbara @shin1x1
  4. 4. PHPプロジェクト (c) 2014 Masashi Shinbara @shin1x1 • Web アプリケーション開発 • PHP / Webサーバ / DB / KVS 等々 • PHPUnit で自動テスト
  5. 5. ビルドサーバ (c) 2014 Masashi Shinbara @shin1x1 • Jenkins サーバ • PHPUnit によるテスト実行 • デプロイ [ステージング / 本番] • (カバレッジ計測、静的解析等)
  6. 6. 旧ビルドサーバ (c) 2014 Masashi Shinbara @shin1x1
  7. 7. (c) 2014 Masashi Shinbara @shin1x1 構成 Mac (1) git push (2) hook (3) git pull 社内サーバ (4) notification
  8. 8. 社内Jenkinsサーバ (c) 2014 Masashi Shinbara @shin1x1 • 2009年頃構築 • 複数プロジェクトを管理 • 1サーバに別バージョンのPHPやDBを同居 • ビルドタスクを欲張る
 (カバレッジ、APIドキュメント、静的解析等)
  9. 9. 困っていたこと (c) 2014 Masashi Shinbara @shin1x1 • プロジェクト毎の環境構築が面倒
 (パスやポートを変えて同居) • トラブルシューティングが面倒 • git push の度にサーバが唸る
  10. 10. 困っていたこと (c) 2014 Masashi Shinbara @shin1x1 • プロジェクト毎の環境構築が面倒
 (パスやポートを変えて同居) • トラブルシューティングが面倒 • git push の度にサーバが唸る
  11. 11. 困っていたこと (c) 2014 Masashi Shinbara @shin1x1 • プロジェクト毎の環境構築が面倒
 (パスやポートを変えて同居) • トラブルシューティングが面倒 • git push の度にサーバが唸る
  12. 12. 現ビルドサーバ (c) 2014 Masashi Shinbara @shin1x1
  13. 13. (c) 2014 Masashi Shinbara @shin1x1 構成 Mac private repo (1) git push ビルドサーバ(さくらVPS) (2) hook (3) git pull (4) docker build & docker run (5) notification
  14. 14. 現Jenkinサーバ (c) 2014 Masashi Shinbara @shin1x1 • さくらのVPS(2G)/ 月々1,580円 • Memory: 2GB • CPU: 仮想3Core • HDD: 200GB • CentOS 6.6
  15. 15. 構成のポイント (c) 2014 Masashi Shinbara @shin1x1 • 外部サーバ、SaaS を利用 • Dockerでビルド環境を構築 • タスクを自動テスト実行に絞る
  16. 16. Docker in CI (c) 2014 Masashi Shinbara @shin1x1
  17. 17. Dockerの利用方針 (c) 2014 Masashi Shinbara @shin1x1 • アプリケーションが動作する環境を
 1 コンテナに集約 • Dockerfile を push して、
 Jenkins サーバでイメージを生成 • アプリケーションは、ホストからマウント
 コンテナは、実行環境に徹する
  18. 18. (c) 2014 Masashi Shinbara @shin1x1 構成 Mac private repo (1) git push CI サーバ(さくらVPS) (2) hook (3) git pull (4) docker build & docker run
  19. 19. (c) 2014 Masashi Shinbara @shin1x1 Dockerfile Mac Dockerfile private repo CI サーバ(さくらVPS)
  20. 20. Dockerfile (c) 2014 Masashi Shinbara @shin1x1 • Dockerfile とプロビジョンファイルを用意 • プロビジョンには Ansible を利用 • 開発プロジェクトと同じリポジトリで管理
  21. 21. FROM centos:centos6 # Ansible インストール、プロビジョン RUN … # Supervisor インストール RUN … # アプリケーションセットアップ、テスト実行 CMD … Dockerfile
  22. 22. FROM centos:centos6 # Ansible インストール RUN … # Supervisor インストール RUN … # アプリケーションセットアップ、テスト実行 CMD … Dockerfile CentOS Official Image
  23. 23. FROM centos:centos6 # Ansible インストール、プロビジョン RUN … # Supervisor インストール RUN … # アプリケーションセットアップ、テスト実行 CMD … Dockerfile プロビジョン
  24. 24. FROM centos:centos6 # Ansible インストール、プロビジョン RUN … # Supervisor インストール RUN … # アプリケーションセットアップ、テスト実行 CMD … Dockerfile サービス起動用
  25. 25. FROM centos:centos6 # Ansible インストール、プロビジョン RUN … # Supervisor インストール RUN … # アプリケーションセットアップ、テスト実行 CMD … Dockerfile コンテナ実行コマンド
  26. 26. Ansible (c) 2014 Masashi Shinbara @shin1x1 • コンテナにインストール • ローカルコネクションで自身にプロビジョン • playbookやroleを別環境
 (開発、ステージング等)と共有 • レイヤを節約
  27. 27. RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/ epel/6/i386/epel-release-6-8.noarch.rpm RUN yum -y install ansible libselinux-python sudo ADD provision /opt/provision RUN ansible-playbook /opt/provision/docker.yml -- connection=local -i /opt/provision/localhost -vv Ansible
  28. 28. RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/ epel/6/i386/epel-release-6-8.noarch.rpm RUN yum -y install ansible libselinux-python sudo ADD provision /opt/provision RUN ansible-playbook /opt/provision/docker.yml -- connection=local -i /opt/provision/localhost -vv Ansible Ansibleインストール
  29. 29. RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/ epel/6/i386/epel-release-6-8.noarch.rpm RUN yum -y install ansible libselinux-python sudo ADD provision /opt/provision RUN ansible-playbook /opt/provision/docker.yml -- connection=local -i /opt/provision/localhost -vv Ansible プロビジョンファイルをインポート
  30. 30. RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/ epel/6/i386/epel-release-6-8.noarch.rpm RUN yum -y install ansible libselinux-python sudo ADD provision /opt/provision RUN ansible-playbook /opt/provision/docker.yml -- connection=local -i /opt/provision/localhost -vv Ansible ansible-playbook 実行 (ローカルコネクション)
  31. 31. Supervisor (c) 2014 Masashi Shinbara @shin1x1 • デーモンプロセスを起動(死活監視込) • 1プロセスで、複数のデーモンを起動 • Webサーバ、DB を起動
  32. 32. RUN yum -y install python-setuptools RUN easy_install supervisor ADD docker/supervisord.conf /etc/supervisord.conf Supervisor Supervisor インストール
  33. 33. RUN yum -y install python-setuptools RUN easy_install supervisor ADD docker/supervisord.conf /etc/supervisord.conf Supervisor 設定ファイルをインポート
  34. 34. コンテナコマンド (c) 2014 Masashi Shinbara @shin1x1 • Supervisor を起動 • composer install(依存解決) • DBマイグレーション • PHPUnit(自動テスト)実行
  35. 35. コンテナコマンド 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
  36. 36. 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 起動
  37. 37. 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 コンテナコマンド 依存解決
  38. 38. 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マイグレーション
  39. 39. 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 コンテナコマンド 自動テスト実行
  40. 40. (c) 2014 Masashi Shinbara @shin1x1 Jenkinsで実行 Mac private repo CI サーバ(さくらVPS) docker build && run
  41. 41. Jenkinsで実行 (c) 2014 Masashi Shinbara @shin1x1 • git pull でリポジトリから Dockerfile 取得 • docker build でイメージ生成 • docker run でコンテナ実行 • 結果レポートを Jenkins で表示
  42. 42. Jenkinsで実行 (c) 2014 Masashi Shinbara @shin1x1
  43. 43. Jenkinsで実行 (c) 2014 Masashi Shinbara @shin1x1 sudo docker build -t ${JOB_NAME} . sudo docker run -v ${WORKSPACE}/src:/share ${JOB_NAME}
  44. 44. docker build (c) 2014 Masashi Shinbara @shin1x1 • Dockerfile からイメージをビルド • ジョブ名(${JOB_NAME})をイメージ名に sudo docker build -t ${JOB_NAME} .
  45. 45. docker run (c) 2014 Masashi Shinbara @shin1x1 • 生成したイメージからコンテナ実行 • -v で、アプリケーションディレクトリを
 マウント sudo docker run -v ${WORKSPACE}/src:/share ${JOB_NAME}
  46. 46. マウントディレクトリ対応 (c) 2014 Masashi Shinbara @shin1x1 ${WORKSPACE}/src + application_code + build/ /share + application_code + build/ ホスト(Jenkins) コンテナ
  47. 47. アプリケーション (c) 2014 Masashi Shinbara @shin1x1 ${WORKSPACE}/src + application_code + build/ /share + application_code + build/ ホスト(Jenkins) コンテナ アプリケーションを参照
  48. 48. 結果レポート (c) 2014 Masashi Shinbara @shin1x1 ${WORKSPACE}/src + application_code + build/ /share + application_code + build/ ホスト(Jenkins) コンテナ /share/build/ に 結果ログを出力
  49. 49. 結果レポート (c) 2014 Masashi Shinbara @shin1x1 ${WORKSPACE}/src + application_code + build/ /share + application_code + build/ ホスト(Jenkins) コンテナ build/ のログから 結果レポート生成
  50. 50. 結果レポート (c) 2014 Masashi Shinbara @shin1x1
  51. 51. 8ヶ月運用してみて (c) 2014 Masashi Shinbara @shin1x1
  52. 52. Dockerコンテナの良さ (c) 2014 Masashi Shinbara @shin1x1 • プロジェクト毎に独立した環境 • 軽量なので、低スペック機でも利用可能 • 毎回、作って、使って、捨ててなので、管理が楽 • どこでも同じコンテナが作れるので、メンテが楽
 (boot2docker で検証できる)
  53. 53. 突然のテスト失敗 (c) 2014 Masashi Shinbara @shin1x1 • 開発環境で all green だったテストがこける • なぜか依存解決で失敗 • コンテナから外部へ通信できない>< • docker デーモン再起動で解決
  54. 54. 突然のテスト失敗2 (c) 2014 Masashi Shinbara @shin1x1 • docker デーモン再起動でも復旧せず • yum install でエラー • EPEL の CA証明書の期限切れ • ベースイメージを更新
 (yum update ca-certificates でも ok)
  55. 55. 今後 (c) 2014 Masashi Shinbara @shin1x1 • ステージングサーバへのコンテナデプロイ • docker コンテナ実行環境は
 クラウドサービスに任せたい • コンテナレポジトリも任せたい • 全部自分でやるなら、PaaS の方が楽
  56. 56. まとめ (c) 2014 Masashi Shinbara @shin1x1
  57. 57. (c) 2014 Masashi Shinbara @shin1x1 まとめ • マルチな環境を同居させるのに便利 • ビルド、ジョブワーカーなど
 使い捨ての環境なら、実用的 • 常に起動するサービスなら、
 docker デーモン運用、デプロイ、監視等々を
 Dockerクラウドサービスに任せたい
  58. 58. @shin1x1 (c) 2014 Masashi Shinbara @shin1x1

×