SlideShare a Scribd company logo
Docker と継続的インテグレーション
14/02/12 Docker Meetup in Tokyo #1
Kazuki Suda
! @superbrothers
" github.com/superbrothers
Dockerと継続的インテグレーション
# 本日のお話

Docker での
ビルド -> テスト -> プッシュの自動化
# アジェンダ
-

CI ワークフロー 構成編

-

Dockerfile のテスト
-

ベースとなるイメージの実装

-

テストの準備と実行

-

CI ワークフロー ジョブスクリプト編

-

デモ

-

まとめ
# デモコードあります

https://github.com/ydnjp/
docker-continuous-integration-workflow
# CI ワークフロー 登場人物編
!

ビルド -> テスト -> プッシュの自動化
## 登場人物
Jenkins

Docker レジストリ

#

$
Git リポジトリ

Docker 入りスレーブ
## ワークフロー

ビルド

テスト

プッシュ

docker build

serverspec

docker push
# Dockerfile のテスト
Dockerと継続的インテグレーション
## ディレクトリ構造
├──Gemfile
├──Gemfile.lock
├──Rakefile
├──dockerfiles
│
├──base
│
│
├──Dockerfile
│
│
└──keys
│
│
├──id_rsa
│
│
└──id_rsa.pub
│
└──jenkins
│
├──Dockerfile
│
└──start-jenkins.sh
└──spec
├──base
│
└──sshd_spec.rb
├──jenkins
│
└──jenkins_spec.rb
└──spec_helper.rb
## Dockerfile の配置
├──Gemfile
dockerfiles/<image-name> で
├──Gemfile.lock
Dockerfile を配置する
├──Rakefile
├──dockerfiles
│
├──base
│
│
├──Dockerfile
│
│
└──keys
│
│
├──id_rsa
│
│
└──id_rsa.pub
base イメージ
│
└──jenkins
│
├──Dockerfile
│
└──start-jenkins.sh
└──spec
├──base
jenkins イメージ
│
└──sshd_spec.rb
├──jenkins
│
└──jenkins_spec.rb
└──spec_helper.rb
## spec の配置
├──Gemfile
spec/<image-name> で
├──Gemfile.lock
├──Rakefile
スペックを配置する
├──dockerfiles
│
├──base
│
│
├──Dockerfile
│
│
└──keys
│
│
├──id_rsa
│
│
└──id_rsa.pub
│
└──jenkins
│
├──Dockerfile
│
└──start-jenkins.sh
dockerfiles 以下に
└──spec
├──base
対応する形です
│
└──sshd_spec.rb
├──jenkins
│
└──jenkins_spec.rb
└──spec_helper.rb
serverspec は ssh を通して
コンテナとやりとりするので
sshd 入りのベースとする
イメージを用意します
(base イメージ)

├──Gemfile
├──Gemfile.lock
├──Rakefile
├──dockerfiles
│
├──base
│
│
├──Dockerfile
│
│
└──keys
│
│
├──id_rsa
│
│
└──id_rsa.pub
│
└──jenkins
│
├──Dockerfile
│
└──start-jenkins.sh
└──spec
├──base
│
└──sshd_spec.rb
├──jenkins
│
└──jenkins_spec.rb
└──spec_helper.rb

ssh ログインに使う
ノーパスキーです
dockerfiles/base/Dockerfile
FROM ubuntu:13.10
!
ENV DEBIAN_FRONTEND noninteractive
!
RUN apt-get -q update && apt-get -y upgrade
!
# Install openssh-server for serverspec
sshd をインストール
RUN apt-get -q -y install openssh-server && apt-get clean
RUN mkdir /var/run/sshd
RUN mkdir /root/.ssh && chmod 600 /root/.ssh
ノーパスの
ADD keys/id_rsa.pub /root/.ssh/authorized_keys
公開鍵を追加
RUN chown root:root /root/.ssh/authorized_keys
!
# Ubuntu 13.10 additional steps for SSHD Service
RUN sed -i 's/.*session.*required.*pam_loginuid.so.*/session optional
pam_loginuid.so/g' /etc/pam.d/sshd
RUN echo LANG="en_US.UTF-8" > /etc/default/locale
## ベースイメージのビルドとコンテナの起動

% docker build -t base dockerfiles/base
!

% docker run -d -p 22 base /usr/sbin/sshd -D

22番ポートが bind されたポートを指定して
ノーパスキーの秘密鍵を使うとログインできる
## ベースイメージのポイント

-

ノーパスキーを利用しよう

-

root にパスワードを設定しちゃダメ!
# serverspec を使ったテストの準備と実行
## serverspec を使ったテスト実行の流れ

1. イメージからコンテナを起動する
-

CMD /usr/sbin/sshd -D

-

22番ポートを bind する

2. bind されたポートに対して SSH を使って spec を流し込む
-

ノーパスの秘密鍵を使います

-

bind されたポートは inspect で取得

-

1 -> 2 を最後まで繰り返す

3. 利用したコンテナを殺して削除する
spec/spec_helper.rb (前編)
c.before :all do
(略)…
host = File.basename(Pathname.new(file).dirname)
!

if c.host != host
Docker イメージごとにコンテナを起動
## Start container and retrieve port number of sshd
container = Docker::Container.create(
docker-api 使ってます
:Image => "#{host}",
:Entrypoint => ['/usr/sbin/sshd'],
:Cmd => ['-D'],
sshd を起動させる
:ExposedPorts => {'22/tcp' => {}},
:User => 'root'
).start(
:PortBindings => {
コンテナの22番ポートを
親のホストに bind
'22/tcp' => [{:HostIp =>‘127.0.0.1’}]
}
)
使ったコンテナはあとで
sleep 1
停止、削除するのでとっておく
containers << container
spec/spec_helper.rb (後編)
c.ssh.close if c.ssh
base イメージに追加した公開鍵と
c.host = host
対の秘密鍵を使う
options = {
:keys => [File.expand_path('../../dockerfiles/base/keys/id_rsa',
__FILE__)],
:port => container.json['HostConfig']['PortBindings']['22/tcp'][0]
['HostPort']
HostConfig から bind されたポートを
}
取得する
c.ssh = Net::SSH.start('0.0.0.0', 'root', options)
end
接続先はローカルホストで root ユーザ
end
!
c.after(:suite) do
利用したコンテナを
## Kill and delete containers
殺して削除する
containers.each {|container| container.kill.delete }
end
spec/base/sshd_spec.rb
require 'spec_helper'
!
describe package('openssh-server') do
it { should be_installed }
end
!
describe file('/var/run/sshd') do
it { should be_directory }
end
!
describe file('/root/.ssh') do
it { should be_directory }
it { should be_mode 600 }
end

パッケージが正しく
インストールされているか

ディレクトリが存在するか

ディレクトリが存在するか

パーミッションが正しいか

spec の記述については serverspec 公式の
ドキュメントを確認してください
## テストの実行

$ bundle exec rake spec
/usr/bin/ruby1.9.1 -S rspec spec/base/sshd_spec.rb
.........
!
Finished in 2.21 seconds
9 examples, 0 failures
ベースとなるイメージの実装が終わったので
本来必要なイメージを
実装する準備が整いました(長い)

例として jenkins イメージを作ります

(ここからは早送り
## jenkins イメージ
├──Gemfile
├──Gemfile.lock
├──Rakefile
├──dockerfiles
│
├──base
│
│
├──Dockerfile
│
│
└──keys
│
│
├──id_rsa
│
│
└──id_rsa.pub
│
└──jenkins
│
├──Dockerfile
│
└──start-jenkins.sh
└──spec
├──base
│
└──sshd_spec.rb
├──jenkins
│
└──jenkins_spec.rb
└──spec_helper.rb

Dockerfile はここ

spec はこちら
dockerfiles/jenkins/Dockerfile

FROM base
base をベースとするので、sshd 入り
!
RUN apt-get -q -y install openjdk-7-jre-headless && apt-get clean
!
# Install Jenkins
jenkins のセットアップ(略)
RUN mkdir /opt/jenkins
…

FROM base としているので、そのままで
sshd を起動したコンテナを起動させることができます
!

あとは spec を実装したら完了です
(spec を先に実装することで TDD もできちゃう)
spec の実装は省略します
# docker build, push の Rake タスク化
!

繰り返し行うことはタスクにまとめましょう
## docker build
イメージが base に依存しているので、
base から順番にビルドする
% bundle exec rake docker:build

docker build -t base dockerfiles/base
(略)...

## docker push
docker tag でプライベートレジストリの情報を付けたのち、
順番に push する
% bundle exec rake docker:push
docker tag base 0.0.0.0:5000/base
docker push 0.0.0.0:5000/base
(略)...

実装はデモコードの Rakefile を参照してください!
# CI ワークフロー ジョブスクリプト編
!

ビルド -> テスト -> プッシュの自動化
## ジョブスクリプト

ベースは出来ているのでこれだけです。
デモ
## まとめ

-

ビルド、テスト、プッシュの自動化ができました

-

毎日自動でまわすことで常に最新のセキュリティ
アップデートを当て続けることもできます

!

次は継続的デリバリーに向けて?
# デモコードあります (再掲)

https://github.com/ydnjp/
docker-continuous-integration-workflow
ありがとうございました

More Related Content

PDF
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
 
PDF
Docker Swarm入門
Masahito Zembutsu
 
PDF
Dockerでデプロイ
oshiro_seiya
 
PDF
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
Kunihiro TANAKA
 
PDF
【dots. IT勉強会】開発環境のDocker化
Yuki Kanazawa
 
PDF
Docker入門
Keita Midorikawa
 
PDF
Using LXC on Production
Isao Shimizu
 
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
 
Docker Swarm入門
Masahito Zembutsu
 
Dockerでデプロイ
oshiro_seiya
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
Kunihiro TANAKA
 
【dots. IT勉強会】開発環境のDocker化
Yuki Kanazawa
 
Docker入門
Keita Midorikawa
 
Using LXC on Production
Isao Shimizu
 

What's hot (20)

PPTX
Appsody でnodejsのアプリを立ち上げよう!
Daisuke Hiraoka
 
PDF
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Masahiro Nagano
 
PDF
Docker超入門
Katsunori Kanda
 
PPTX
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Naoki Nagazumi
 
PDF
Docker Swarm モード にゅうもん
Masahito Zembutsu
 
PDF
Introduce that Best practices for writing Dockerfiles
Yukiya Hayashi
 
PDF
VagrantユーザのためのDocker入門
Masashi Shinbara
 
PDF
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
PDF
Dockerハンズオン
Kazuyuki Mori
 
PDF
Dive into dockerネットワーク
Kazuyuki Mori
 
PDF
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Masahito Zembutsu
 
PDF
コンテナ型仮想化とはなんだったのか
えむ ばーど
 
PDF
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Akihiro Suda
 
PDF
Docker Machineを始めるには?
Masahito Zembutsu
 
PDF
Rancher command line interface
Masahito Zembutsu
 
PDF
清貧Docker ~個人がDockerを使う理由~
harupong
 
PDF
静的サイトどこにする?
ogawatti
 
PPTX
開発環境をVagrantからdockerに移行してみた
pyar6329
 
PDF
Drone.io のご紹介
Uchio Kondo
 
PDF
ECS-CLI in Action
Ryo Nakamaru
 
Appsody でnodejsのアプリを立ち上げよう!
Daisuke Hiraoka
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Masahiro Nagano
 
Docker超入門
Katsunori Kanda
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Naoki Nagazumi
 
Docker Swarm モード にゅうもん
Masahito Zembutsu
 
Introduce that Best practices for writing Dockerfiles
Yukiya Hayashi
 
VagrantユーザのためのDocker入門
Masashi Shinbara
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
Dockerハンズオン
Kazuyuki Mori
 
Dive into dockerネットワーク
Kazuyuki Mori
 
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Masahito Zembutsu
 
コンテナ型仮想化とはなんだったのか
えむ ばーど
 
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Akihiro Suda
 
Docker Machineを始めるには?
Masahito Zembutsu
 
Rancher command line interface
Masahito Zembutsu
 
清貧Docker ~個人がDockerを使う理由~
harupong
 
静的サイトどこにする?
ogawatti
 
開発環境をVagrantからdockerに移行してみた
pyar6329
 
Drone.io のご紹介
Uchio Kondo
 
ECS-CLI in Action
Ryo Nakamaru
 
Ad

Similar to Dockerと継続的インテグレーション (20)

PDF
Circle ci and docker+serverspec
Tsuyoshi Yamada
 
PPTX
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
辰徳 斎藤
 
PDF
Dockerイメージ構築 実践テクニック
Emma Haruka Iwao
 
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
 
PDF
Docker handson
koda3
 
PPTX
ラズパイ2で動く Docker PaaSを作ってみたよ
npsg
 
PDF
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
PPTX
コンテナの基本 ~Docker実践~
Ryosuke Uchiyama
 
PPTX
Docker & Kubernetes基礎
Daisuke Hiraoka
 
PDF
Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
Masahito Zembutsu
 
PPTX
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
VirtualTech Japan Inc.
 
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
PDF
アプリ屋もDockerをドカドカ使おう ~ Docker入門
Hori Tasuku
 
PDF
コマンドラインツールとしてのDocker
74th
 
PDF
コンテナ情報交換会2
Masahide Yamamoto
 
PDF
オトナのDocker入門
Tsukasa Kato
 
PDF
Docker事始めと最新動向 2015年6月
Emma Haruka Iwao
 
PDF
Dockerの仕組みとIIJ社内での利用例
maebashi
 
PPTX
今さら聞けない人のためのDocker超入門
VirtualTech Japan Inc./Begi.net Inc.
 
PDF
Docker社内勉強会
osamu_takezawa
 
Circle ci and docker+serverspec
Tsuyoshi Yamada
 
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
辰徳 斎藤
 
Dockerイメージ構築 実践テクニック
Emma Haruka Iwao
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
 
Docker handson
koda3
 
ラズパイ2で動く Docker PaaSを作ってみたよ
npsg
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
コンテナの基本 ~Docker実践~
Ryosuke Uchiyama
 
Docker & Kubernetes基礎
Daisuke Hiraoka
 
Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
Masahito Zembutsu
 
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
VirtualTech Japan Inc.
 
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
Hori Tasuku
 
コマンドラインツールとしてのDocker
74th
 
コンテナ情報交換会2
Masahide Yamamoto
 
オトナのDocker入門
Tsukasa Kato
 
Docker事始めと最新動向 2015年6月
Emma Haruka Iwao
 
Dockerの仕組みとIIJ社内での利用例
maebashi
 
今さら聞けない人のためのDocker超入門
VirtualTech Japan Inc./Begi.net Inc.
 
Docker社内勉強会
osamu_takezawa
 
Ad

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
Yahoo!デベロッパーネットワーク
 
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
Yahoo!デベロッパーネットワーク
 
PDF
オンプレML基盤on Kubernetes パネルディスカッション
Yahoo!デベロッパーネットワーク
 
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Yahoo!デベロッパーネットワーク
 
PDF
Persistent-memory-native Database High-availability Feature
Yahoo!デベロッパーネットワーク
 
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
Yahoo!デベロッパーネットワーク
 
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ビッグデータから人々のムードを捉える #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Yahoo!デベロッパーネットワーク
 
ゼロから始める転移学習
Yahoo!デベロッパーネットワーク
 
継続的なモデルモニタリングを実現するKubernetes Operator
Yahoo!デベロッパーネットワーク
 
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
Yahoo!デベロッパーネットワーク
 
オンプレML基盤on Kubernetes パネルディスカッション
Yahoo!デベロッパーネットワーク
 
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Yahoo!デベロッパーネットワーク
 
Persistent-memory-native Database High-availability Feature
Yahoo!デベロッパーネットワーク
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
Yahoo!デベロッパーネットワーク
 
eコマースと実店舗の相互利益を目指したデザイン #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
ビッグデータから人々のムードを捉える #yjtc
Yahoo!デベロッパーネットワーク
 
サイエンス領域におけるMLOpsの取り組み #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo!デベロッパーネットワーク
 
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
Yahoo!デベロッパーネットワーク
 
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
Yahoo!デベロッパーネットワーク
 
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
Yahoo!デベロッパーネットワーク
 
「新しいおうち探し」のためのAIアシスト検索 #yjtc
Yahoo!デベロッパーネットワーク
 
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Yahoo!デベロッパーネットワーク
 

Recently uploaded (9)

PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 

Dockerと継続的インテグレーション