Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

ビルドサーバで使うDocker

21.709 visualizaciones

Publicado el

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

Publicado en: Tecnología
  • Sé el primero en comentar

ビルドサーバで使う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

×