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.

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

333 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. オンプレでPrivate Registry使った Dockerイメージの運用について Docker Kansai #3 やっさん @yassan168
  2. 2. オンプレのDockerイメージ運用 Webhook Trigger Status API Deployment API docker push ぷるりくえすと Auth & Registry Service
  3. 3. Portusについて OpenSUSEが開発するOSS。 Docker Registryの認証とフロントエンド機能を持つ。 Portus以外では、CNCFホストの vmware の Harbor が有名です。 また、最近ではP2Pを使ってスケーラブルにイメージを配信出来る CNCFホストの Alibaba の Dragonfly や Uber の Kraken があります。
  4. 4. Portusの構成について CVE データベース 脆弱性情報を同期 Portus (Web UI) Nginx (Proxy) PostgreSQL Portus (Background) Web UI Registry Service User/Team/Namespace /Image一覧/etcの更新 Image一覧の同期 脆弱性スキャン 脆弱性 情報の取得
  5. 5. JenkinsでGitHubのOrganizationを監視する 右図の様に itemにOrganization名を入 れ、 「GitHub Organization」 を選択する ※「Pull Request Builder Plugin」を利用している Organization名を記入
  6. 6. JenkinsでGitHubのOrganizationを監視する APIエンドポイントや クレデンシャルを選択。 OKボタン押下すると初回のス キャンが実行される。 これ以降は、Jenkinsfileがあれば 実行の対象となる。
  7. 7. CircleCIでも良いじゃん? オンプレで執事のお世話をする事で以下のメリットが得られる(強がり) • CircleCIで対応していない BuildKitが使える! • すぐにビルドを実行出来る!待たない! • リソースの許す限り、好きなだけコンテナ増やし放題 BuildKitと言えば、、KubeConEUでNTTの須田さんから発表ありましたね Container Build縛り会とか面白そう。。。
  8. 8. 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を使って環境変数で差し替え 出来るようにする。
  9. 9. 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)"
  10. 10. 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時に埋め込む
  11. 11. 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に空白区切りで記述して、 イメージタグを複数付けている
  12. 12. 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ツールなどへの移行も楽にな る。
  13. 13. 今日の発表について オンプレのDockerイメージの運用についてご紹介 • DockerレジストリにOpenSUSEのPortus • GitHubとJenkinsの連携(PR運用) • Jenkins Build PipelineでDockerイメージのビルドを自動化 • ビルドの自動化の際の工夫:Makefileによるビルドの簡略化
  14. 14. おまけ
  15. 15. 参考情報 • 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

×