SlideShare a Scribd company logo
1 of 15
オンプレでPrivate Registry使った
Dockerイメージの運用について
Docker Kansai #3
やっさん
@yassan168
オンプレのDockerイメージ運用
Webhook Trigger
Status API
Deployment API
docker push
ぷるりくえすと
Auth &
Registry
Service
Portusについて
OpenSUSEが開発するOSS。
Docker Registryの認証とフロントエンド機能を持つ。
Portus以外では、CNCFホストの vmware の Harbor が有名です。
また、最近ではP2Pを使ってスケーラブルにイメージを配信出来る
CNCFホストの Alibaba の Dragonfly や Uber の Kraken があります。
Portusの構成について
CVE
データベース
脆弱性情報を同期
Portus
(Web UI)
Nginx
(Proxy)
PostgreSQL
Portus
(Background)
Web UI
Registry
Service
User/Team/Namespace
/Image一覧/etcの更新
Image一覧の同期
脆弱性スキャン
脆弱性
情報の取得
JenkinsでGitHubのOrganizationを監視する
右図の様に
itemにOrganization名を入
れ、
「GitHub Organization」
を選択する
※「Pull Request Builder
Plugin」を利用している
Organization名を記入
JenkinsでGitHubのOrganizationを監視する
APIエンドポイントや
クレデンシャルを選択。
OKボタン押下すると初回のス
キャンが実行される。
これ以降は、Jenkinsfileがあれば
実行の対象となる。
CircleCIでも良いじゃん?
オンプレで執事のお世話をする事で以下のメリットが得られる(強がり)
• CircleCIで対応していない BuildKitが使える!
• すぐにビルドを実行出来る!待たない!
• リソースの許す限り、好きなだけコンテナ増やし放題
BuildKitと言えば、、KubeConEUでNTTの須田さんから発表ありましたね
Container Build縛り会とか面白そう。。。
Dockerfile
FROM openjdk:8-jdk
:
ARG GIT_REVISION=unknown
ARG GIT_ORIGIN=unknown
ARG IMAGE_NAME=unknown
LABEL git-revision=$GIT_REVISION 
git-origin=$GIT_ORIGIN 
image-name=$IMAGE_NAME
Dockerイメージの情報を付加
トレース用にLABELを用意し、
ARGを使って環境変数で差し替え
出来るようにする。
Makefile
NAME := hoge
REVISION := $(shell git rev-parse --short HEAD)
ORIGIN := $(shell git remote get-url origin | sed -e 's/^.*@//g')
TAGS := $(REVISION)
RELEASE_TAGS := 0.1.1 prod $(REVISION)
REGISTRY := registry.yassan.local
USER := yassan
.PHONY: revision
revision:
@echo $(REVISION)
.PHONY: test
test:
@python -m unittest test/test_config.py
@python -m unittest test/validate_config.py
.PHONY: test-with-docker
test-with-docker:
@docker run 
-w /tmp/test 
-v `pwd`:/tmp/test $(REGISTRY)/$(USER)/$(NAME):$(REVISION) 
make test
.PHONY: build
build:
@docker build 
--build-arg GIT_REVISION=$(REVISION) 
--build-arg GIT_ORIGIN=$(ORIGIN) 
--build-arg IMAGE_NAME=$(REGISTRY)/$(USER)/$(NAME) 
$(addprefix -t $(REGISTRY)/$(USER)/$(NAME):,$(TAGS)) .
.PHONY: push
push:
@for TAG in $(TAGS); do
docker push $(REGISTRY)/$(USER)/$(NAME):$$TAG; 
done
.PHONY: release
release:
@make build TAGS="$(RELEASE_TAGS)"
@make push TAGS="$(RELEASE_TAGS)"
Makefile
NAME := hoge
REVISION := $(shell git rev-parse --short HEAD)
ORIGIN := $(shell git remote get-url origin | sed -e 's/^.*@//g')
TAGS := $(REVISION)
RELEASE_TAGS := 0.1.1 prod $(REVISION)
REGISTRY := registry.yassan.local
USER := yassan
.PHONY: revision
revision:
@echo $(REVISION)
.PHONY: test
test:
@python -m unittest test/test_config.py
@python -m unittest test/validate_config.py
.PHONY: test-with-docker
test-with-docker:
@docker run 
-w /tmp/test 
-v `pwd`:/tmp/test $(REGISTRY)/$(USER)/$(NAME):$(REVISION) 
make test
.PHONY: build
build:
@docker build 
--build-arg GIT_REVISION=$(REVISION) 
--build-arg GIT_ORIGIN=$(ORIGIN) 
--build-arg IMAGE_NAME=$(REGISTRY)/$(USER)/$(NAME) 
$(addprefix -t $(REGISTRY)/$(USER)/$(NAME):,$(TAGS)) .
.PHONY: push
push:
@for TAG in $(TAGS); do
docker push $(REGISTRY)/$(USER)/$(NAME):$$TAG; 
done
.PHONY: release
release:
@make build TAGS="$(RELEASE_TAGS)"
@make push TAGS="$(RELEASE_TAGS)"
REVISIONとORIGINはコマンドで取得。
取得したものをdocker build時に埋め込む
Makefile
NAME := hoge
REVISION := $(shell git rev-parse --short HEAD)
ORIGIN := $(shell git remote get-url origin | sed -e 's/^.*@//g')
TAGS := $(REVISION)
RELEASE_TAGS := 0.1.1 prod $(REVISION)
REGISTRY := registry.yassan.local
USER := yassan
.PHONY: revision
revision:
@echo $(REVISION)
.PHONY: test
test:
@python -m unittest test/test_config.py
@python -m unittest test/validate_config.py
.PHONY: test-with-docker
test-with-docker:
@docker run 
-w /tmp/test 
-v `pwd`:/tmp/test $(REGISTRY)/$(USER)/$(NAME):$(REVISION) 
make test
.PHONY: build
build:
@docker build 
--build-arg GIT_REVISION=$(REVISION) 
--build-arg GIT_ORIGIN=$(ORIGIN) 
--build-arg IMAGE_NAME=$(REGISTRY)/$(USER)/$(NAME) 
$(addprefix -t $(REGISTRY)/$(USER)/$(NAME):,$(TAGS)) .
.PHONY: push
push:
@for TAG in $(TAGS); do
docker push $(REGISTRY)/$(USER)/$(NAME):$$TAG; 
done
.PHONY: release
release:
@make build TAGS="$(RELEASE_TAGS)"
@make push TAGS="$(RELEASE_TAGS)"
TAGSに空白区切りで記述して、
イメージタグを複数付けている
Jenkinsfile
pipeline {
agent any
stages {
stage('Test build') {
steps {
sh 'make build'
sh 'make push'
}
}
stage('Test') {
steps {
sh 'make test-with-docker'
}
}
stage('Docker release') {
when {
branch 'master'
}
steps {
sh 'make release'
}
Makefileだけでdocker buildやpushが
出来るので、Jenkinsfileが非常に簡単
になる。
また、Makefileで構成しているので、
他のCIツールなどへの移行も楽にな
る。
今日の発表について
オンプレのDockerイメージの運用についてご紹介
• DockerレジストリにOpenSUSEのPortus
• GitHubとJenkinsの連携(PR運用)
• Jenkins Build PipelineでDockerイメージのビルドを自動化
• ビルドの自動化の際の工夫:Makefileによるビルドの簡略化
おまけ
参考情報
• Portus Official Docker image
• dockerをbuildする際のMakefile - Qiita
• Pull Request Builder PluginをJenkinsに導入する - Qiita
• JenkinsとGitHubを使ったCI実践ガイド | GitHub Resources
• [KubeConEU] Building images efficiently and securely on Kubernetes with
BuildKit
• Blue Ocean
• coreos/clair
• Clairで、Dockerイメージの脆弱性スキャンを試す - CLOVER🍀
• Harbor
• Dragonfly
• uber/kraken
• 複数のDockerイメージを単一リポジトリで管理する - Qiita

More Related Content

What's hot

What's hot (20)

OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
Visual Studio を使わず .NET する
Visual Studio を使わず .NET するVisual Studio を使わず .NET する
Visual Studio を使わず .NET する
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私
 
トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門
 
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料) 40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 

Similar to オンプレでPrivate Registry使ったDockerイメージの運用について

Rails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2editionRails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2edition
Satomi Tsujita
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 
20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
Shugo Numano
 
Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
peryaudo
 

Similar to オンプレでPrivate Registry使ったDockerイメージの運用について (20)

Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
Rails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2editionRails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2edition
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境
 
Fig
FigFig
Fig
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
Dockerの導入
Dockerの導入Dockerの導入
Dockerの導入
 
Sinatra and heroku for mac
Sinatra and heroku for macSinatra and heroku for mac
Sinatra and heroku for mac
 
ラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaS
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
 
start Heroku
start Herokustart Heroku
start Heroku
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
 
Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
 

More from YASUKAZU NAGATOMI

Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.
Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.
Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.
YASUKAZU NAGATOMI
 

More from YASUKAZU NAGATOMI (18)

コンテナ化から始めてKubernetesクラスタ管理にRancherを使うまで〜前編〜
コンテナ化から始めてKubernetesクラスタ管理にRancherを使うまで〜前編〜コンテナ化から始めてKubernetesクラスタ管理にRancherを使うまで〜前編〜
コンテナ化から始めてKubernetesクラスタ管理にRancherを使うまで〜前編〜
 
RancherとGitOps的な話
RancherとGitOps的な話RancherとGitOps的な話
RancherとGitOps的な話
 
Cloud Native をやっていくにはどう学んでいくかをみんなで考えてみる
Cloud Native をやっていくにはどう学んでいくかをみんなで考えてみるCloud Native をやっていくにはどう学んでいくかをみんなで考えてみる
Cloud Native をやっていくにはどう学んでいくかをみんなで考えてみる
 
コンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについてコンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについて
 
オンプレ Rancher Server × ML基盤 をはじめます
オンプレ Rancher Server × ML基盤 をはじめますオンプレ Rancher Server × ML基盤 をはじめます
オンプレ Rancher Server × ML基盤 をはじめます
 
Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.
Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.
Webアプリ開発向け ゆるふわDocker使いがCloud Naive開発に必要そうなetc.
 
ざっくり始めるCloud Native開発
ざっくり始めるCloud Native開発ざっくり始めるCloud Native開発
ざっくり始めるCloud Native開発
 
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
 
データ分析基盤として Rancher・k8s で始まるのか調査してみた
データ分析基盤として Rancher・k8s で始まるのか調査してみたデータ分析基盤として Rancher・k8s で始まるのか調査してみた
データ分析基盤として Rancher・k8s で始まるのか調査してみた
 
続Rancherで始めるRedmine生活~Redmineのプライベートカタログを作ってみた~
続Rancherで始めるRedmine生活~Redmineのプライベートカタログを作ってみた~続Rancherで始めるRedmine生活~Redmineのプライベートカタログを作ってみた~
続Rancherで始めるRedmine生活~Redmineのプライベートカタログを作ってみた~
 
Rancherで始めるRedmine生活 ~ Redmineのプライベートカタログを作ってみた~
Rancherで始めるRedmine生活 ~ Redmineのプライベートカタログを作ってみた~Rancherで始めるRedmine生活 ~ Redmineのプライベートカタログを作ってみた~
Rancherで始めるRedmine生活 ~ Redmineのプライベートカタログを作ってみた~
 
redashのプラベートカタログ作成してつまづいたアレやコレや
redashのプラベートカタログ作成してつまづいたアレやコレやredashのプラベートカタログ作成してつまづいたアレやコレや
redashのプラベートカタログ作成してつまづいたアレやコレや
 
オンプレ&HTTP Proxyな環境でRancherOS入れてみた話
オンプレ&HTTP Proxyな環境でRancherOS入れてみた話オンプレ&HTTP Proxyな環境でRancherOS入れてみた話
オンプレ&HTTP Proxyな環境でRancherOS入れてみた話
 
Kichijoji-mini #010:うちの残念な開発環境を正常な状態にするには?
Kichijoji-mini #010:うちの残念な開発環境を正常な状態にするには?Kichijoji-mini #010:うちの残念な開発環境を正常な状態にするには?
Kichijoji-mini #010:うちの残念な開発環境を正常な状態にするには?
 
PM Beginners #06 : MTGの理想と現実
PM Beginners #06 : MTGの理想と現実PM Beginners #06 : MTGの理想と現実
PM Beginners #06 : MTGの理想と現実
 
プロジェクトマネジメントと開発を両立したい!
プロジェクトマネジメントと開発を両立したい!プロジェクトマネジメントと開発を両立したい!
プロジェクトマネジメントと開発を両立したい!
 
PM Beginners #3:メンバの考えていること、共有できてます?
PM Beginners #3:メンバの考えていること、共有できてます?PM Beginners #3:メンバの考えていること、共有できてます?
PM Beginners #3:メンバの考えていること、共有できてます?
 
技術的負債だらけのチームで技術マネージメントしてみた Kichijoji.pm7[talk2]
技術的負債だらけのチームで技術マネージメントしてみた Kichijoji.pm7[talk2]技術的負債だらけのチームで技術マネージメントしてみた Kichijoji.pm7[talk2]
技術的負債だらけのチームで技術マネージメントしてみた Kichijoji.pm7[talk2]
 

オンプレでPrivate Registry使ったDockerイメージの運用について