Dockerイメージを公開するのにGitLabが最⭐高だったので紹介します。GitHubとDockerHubを使うより遥かに良いです。
以前GitLabを使っていくと言ったんですがその続報です。
この記事のGitLabという言葉はだいたいSaaS版のGitLab.comを指しています。
なにがいいの
特にいいと感じているのはこの2つです。
- とにかく簡単 ✨
- とにかく速い 🚀
もう2つ大きいのは次の2つです。
- GitLabだけで完結する
- 無料で無制限
ってところです。
どれぐらい簡単なの
簡単なサンプルを用意しました。
nownabe / docker-sample-app · GitLab
GitLabでDockerイメージを公開する場合、このようにDockerfile
と.gitlab-ci.yml
を用意するだけです。他にはProject1を作ったぐらいで、設定もなにもしてません。
.gitlab-ci.yml
も凝ったことしなければ同じYAMLが使いまわせます。
GitHub + DockerHubだと、公開したことある人はわかると思いますが結構めんどくさいです。GitHubにレポジトリ作って、DockerHubにAutomatedBuildのレジストリ作って、ビルドの設定して、みたいなことをする必要があります。他のCIサービスでビルドする場合は追加でCIの設定して、認証の設定してみたいな感じです。
速い!! 🚀
ソースコードをPushしてからイメージが公開されるまでがめちゃくちゃ速いです。サンプルで試したときは、ローカルからPushして、どれどれCIはちゃんと動いてるかなーとブラウザ開くともうイメージが公開されてました 😳 爆速です。
他のCIサービスやDockerHubでビルドすると早くても数分、10分以上かかることも珍しくありません。特にDockerHubは遅くて、数時間たっても終わらないことも多いのでこれはありがたいですね。
GitLab CI/CD
GitLabにはTravisCIのようなCIが組み込まれています。使い始めるには.gitlab-ci.yml
をコミットするだけです。他に設定はいりません。
GitLab CI/CDで検索すると自分でGitLabを運用するためのドキュメント等がでてきて難しそうですが、SaaS版使うには関係ないので無視しましょう。GitLab Runnerという単語が見えたら無視して良いドキュメントです。
先程のサンプルだと.gitlab-ci.yml
はこんな感じになってます。
image: docker:latest
services:
- docker:dind
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build:
script:
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
特にTravisCIを使ったことがある人はすんなり読めるかなーと思います。シンプルですね。
GitLab Container Registry
GitLabにはDockerイメージのRegistryも組み込まれています。ホスト名はregistry.gitlab.com
でイメージ名はProject名と一致します。なので、さっきのサンプルを実行するには次のようにします。
docker run registry.gitlab.com/nownabe/docker-sample-app:latest
非公開イメージのPullやイメージのPushには認証が必要です。他のRegistryと同じくdocker login
コマンドを使います。
GitLab Ci/CD + Container Registry
CIとRegistryの連携も非常に簡単になるようにできています。
ビルドしたイメージのPushにはRegistryへのログインが必要になりますが、これがまた非常に簡単にできるようになっています。
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
また、CI_REGISTRY_IMAGE
という環境変数にはRegistryにおけるDockerイメージ名が格納されており、イメージタグの指定がとても簡単にできます。
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
build:
script:
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
CI_COMMIT_REF_NAME
にはGitのブランチ名かタグ名が格納されています。なので、こうしておけば次のような運用が簡単にできます。
- Merge Request2を出したらそれがすぐDockerイメージとして使える状態になるので、簡単にテスト環境にデプロイしたりできる
- 複数バージョンを公開しときたいイメージなんかはGitタグを切っておけば、それに従ってDockerイメージも複数バージョン公開される
他のCIサービスで頑張って認証の設定したり、DockerHubでGitHubのブランチとDockerHubのタグを頑張って対応付けたりする必要がないので素晴らしく楽です。
これはGitレポジトリ、CI、Dockerレジストリが統合されてないと実現できない強みですね。
感想
GitLabはものすごいスピードで機能が増えてるのは知ってて、多機能ゆえに使いづらいんじゃないかと思ってましたが全然そんなことはありませんでした。多くの機能を簡単に使えるように工夫されていてとても好感触です。
まだ触ってない機能もいっぱいあるっぽいし、他に罠があるか、なんか制限があるか、とかもこれからで知らないことは多いですがより積極的に使っていきたいです。
とりあえずDockerイメージを公開するときはGitLab一択ですね 😘