Dockerイメージの公開にGitLabが最高

Contents
  1. なにがいいの
  2. どれぐらい簡単なの
  3. 速い!! 🚀
  4. GitLab CI/CD
  5. GitLab Container Registry
  6. GitLab Ci/CD + Container Registry
  7. 感想

Docker イメージを公開するのに GitLab が最⭐高だったので紹介します。GitHub と DockerHub を使うより遥かに良いです。

以前 GitLab を使っていくと言ったんですがその続報です。

nownab.log | 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 はこんな感じになってます。

.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 一択ですね 😘

Footnotes

  1. GitHub でいうレポジトリ ↩

  2. GitHub でいう Pull Request ↩