GitLabでDockerイメージを構築し、Dockerイメージリポジトリをホストする方法

前書き

コンテナ化は、クラウド環境でアプリケーションをパッケージ化および展開する最も受け入れられた方法になりつつあります。 それが提供する標準化は、そのリソース効率(完全な仮想マシンと比較した場合)と柔軟性とともに、現代の_DevOps_考え方の大きな実現要因となります。 アプリケーションとマイクロサービスが完全にコンテナ化されると、多くの興味深い「クラウドネイティブ」展開、オーケストレーション、および監視戦略が可能になります。

Dockerコンテナーは、今日の群を抜いて最も一般的なコンテナーです。 Docker HubのようなパブリックDockerイメージリポジトリは、コンテナ化されたオープンソースソフトウェアイメージでいっぱいですが、 `+ docker pull +`を使用して、今日使用できます画像を作成して保存するサービス、またはそのための独自のソフトウェアを実行するサービス。

GitLab Community Editionは、Gitリポジトリホスティング、プロジェクトトラッキング、CI / CDサービス、Dockerイメージレジストリなどの機能を提供する自己ホスト型のソフトウェアスイートです。 このチュートリアルでは、GitLabの継続的統合サービスを使用して、サンプルのNode.jsアプリからDockerイメージを構築します。 これらの画像はテストされ、独自のDockerレジストリにアップロードされます。

前提条件

始める前に、継続的な統合タスクを実行するために*安全なGitLabサーバー*と* GitLab CIランナー*をセットアップする必要があります。 以下のセクションでは、リンクと詳細について説明します。

SSLで保護されたGitLabサーバー

ソースコードを保存し、CI / CDタスクを実行し、Dockerレジストリをホストするには、GitLabインスタンスがUbuntu 16.04サーバーにインストールされている必要があります。 GitLabは現在、*少なくとも2つのCPUコアと4GBのRAM *を備えたサーバーを推奨しています。 さらに、Let’s EncryptのSSL証明書でサーバーを保護します。 そのためには、サーバーを指すドメイン名が必要です。

これらの前提条件の要件は、次のチュートリアルで完了できます。

GitLab CIランナー

https://www.digitalocean.com/community/tutorials/how-to-set-up-continuous-integration-pipelines-with-gitlab-ci-on-ubuntu-16-04 [継続的統合パイプラインのセットアップ方法Ubuntu 16.04上のGitLab CI]では、GitLabのCIサービスの概要を説明し、ジョブを処理するためのCIランナーのセットアップ方法を示します。 このチュートリアルで作成したデモアプリとランナーインフラストラクチャの上に構築します。

ステップ1-特権GitLab CIランナーのセットアップ

前提条件のGitLab継続的インテグレーションチュートリアルでは、 `+ sudo gitlab-runner register +`とそのインタラクティブな構成プロセスを使用してGitLabランナーをセットアップしました。 このランナーは、隔離されたDockerコンテナー内でソフトウェアのビルドとテストを実行できます。

ただし、Dockerイメージを構築するには、ランナーがDockerサービス自体へのフルアクセスを必要とします。 これを設定するための推奨される方法は、Dockerの公式の `+ docker-in-docker`イメージを使用してジョブを実行することです。 これには、ランナーに特別な「+ privileged +」実行モードを付与する必要があるため、このモードを有効にして2番目のランナーを作成します。

特権ランナーの使用にはセキュリティ上の意味があるため、 `+ hello_hapi `プロジェクトのDockerジョブのみを受け入れるプロジェクト固有のランナーを作成します(GitLab管理者は、いつでも手動でこのランナーを他のプロジェクトに追加できます)。 ` hello_hapi +`プロジェクトページから、左側のメニューの下部にある[設定]をクリックし、サブメニューで[CI / CD *]をクリックします。

image:https://assets.digitalocean.com/articles/gitlab-docker/settings-ci.png [GitLabプロジェクト設定メニュー]

*ランナーの設定*セクションの横にある*展開*ボタンをクリックします。

image:https://assets.digitalocean.com/articles/gitlab-docker/runner-expand.png [GitLab「ランナー設定」展開ボタン]

登録トークンなど、*特定のランナー*のセットアップに関する情報がいくつかあります。 このトークンに注意してください。 これを使用して新しいランナーを登録すると、ランナーはこのプロジェクトにのみロックされます。

image:https://assets.digitalocean.com/articles/gitlab-docker/runner-token.png [GitLabプロジェクト固有のランナーオプション]

このページで、[共有ランナーを無効にする]ボタンをクリックします。 Dockerジョブが常に特権ランナーで実行されるようにします。 特権のない共有ランナーが利用可能な場合、GitLabはその1つを使用することを選択し、ビルドエラーが発生する可能性があります。

現在のCIランナーが存在するサーバーにログインします。 まだランナーでマシンをセットアップしていない場合は、戻ってhttps://www.digitalocean.com/community/tutorials/how-to-set-up-continuous-integration-pipelines-with-gitlabを完了してください-ci-on-ubuntu-16-04#installing-the-gitlab-ci-runner-service [先に進む前に、前提条件チュートリアルのGitLab CI Runnerサービスのインストール+]セクション。

次に、次のコマンドを実行して、特権のあるプロジェクト固有のランナーを設定します。

sudo gitlab-runner register -n \
 --url https:/// \
 --registration-token  \
 --executor docker \
 --description "" \
 --docker-image "docker:latest" \
 --docker-privileged
OutputRegistering runner... succeeded                     runner=61SR6BwV
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

必ず独自の情報に置き換えてください。 プロンプトでは「+-docker-privileged +」モードを指定できないため、インタラクティブプロンプトを使用するのではなく、コマンドラインですべてのランナーオプションを設定します。

これで、ランナーのセットアップ、登録、実行が完了しました。 確認するには、ブラウザに切り替えます。 メインのGitLabメニューバーでレンチアイコンをクリックし、左側のメニューで[*ランナー] *をクリックします。 ランナーがリストされます:

image:https://assets.digitalocean.com/articles/gitlab-docker/runner-list.png [GitLabランナーリスト]

Dockerイメージを作成できるランナーができたので、画像をプッシュするためのプライベートDockerレジストリを設定しましょう。

ステップ2-GitLabのDockerレジストリのセットアップ

独自のDockerレジストリを設定すると、独自のプライベートサーバーからイメージをプッシュおよびプルできるため、セキュリティが向上し、ワークフローが外部サービスに依存する度合いが減少します。

GitLabは、構成の更新をいくつか行うだけで、プライベートDockerレジストリをセットアップします。 最初に、レジストリが存在するURLを設定します。 次に、(オプションで)S3互換オブジェクトストレージサービスを使用してデータを保存するようにレジストリを構成します。

GitLabサーバーにSSHで接続し、GitLab構成ファイルを開きます。

sudo nano /etc/gitlab/gitlab.rb
  • Container Registry settings *セクションまでスクロールダウンします。 `+ registry_external_url `行のコメントを外し、ポート番号が ` 5555 +`のGitLabホスト名に設定します。

/etc/gitlab/gitlab.rb

registry_external_url 'https://:5555'

次に、次の2行を追加して、Let’s Encrypt証明書の場所をレジストリに指示します。

/etc/gitlab/gitlab.rb

registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live//fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live//privkey.pem"

ファイルを保存して閉じ、GitLabを再構成します。

sudo gitlab-ctl reconfigure
Output. . .
gitlab Reconfigured!

ファイアウォールを更新して、レジストリポートへのトラフィックを許可します。

sudo ufw allow 5555

Dockerがインストールされている別のマシンに切り替えて、プライベートDockerレジストリにログインします。 ローカル開発コンピューターにDockerがない場合は、GitLab CIジョブを実行するようにセットアップされているサーバーを使用できます。Dockerが既にインストールされているためです。

docker login :5555

ユーザー名とパスワードの入力を求められます。 GitLab資格情報を使用してログインします。

OutputLogin Succeeded

成功! レジストリがセットアップされ、動作しています。 現在、GitLabサーバーのローカルファイルシステムにファイルを保存します。 代わりにオブジェクトストレージサービスを使用する場合は、このセクションに進んでください。 そうでない場合は、ステップ3に進んでください。

レジストリのオブジェクトストレージバックエンドを設定するには、オブジェクトストレージサービスに関する次の情報を知る必要があります。

  • アクセスキー

  • 秘密鍵

  • リージョン+ us-east-1 +)、たとえばAmazon S3を使用している場合、または*リージョンエンドポイント* S3互換サービスを使用している場合( + https:// nyc.digitaloceanspaces.com +

  • バケット名

DigitalOcean Spacesを使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-create-a-digitalocean-を読むことで、新しいスペースをセットアップして上記の情報を取得する方法を見つけることができます。 space-and-api-key [DigitalOceanスペースとAPIキーを作成する方法]。

オブジェクトストレージ情報を入手したら、GitLab構成ファイルを開きます。

sudo nano /etc/gitlab/gitlab.rb

もう一度、コンテナレジストリセクションまでスクロールします。 `+ registry ['storage'] +`ブロックを探してコメントを外し、次のように更新します。必要に応じて、独自の情報に置き換えてください。

/etc/gitlab/gitlab.rb

registry['storage'] = {
 's3' => {
   'accesskey' => '',
   'secretkey' => '',
   'bucket' => '',
   'region' => '',
   'regionendpoint' => ''
 }
}

Amazon S3を使用している場合、必要なのは `+ region `のみで、 ` regionendpoint `は不要です。 SpacesなどのS3互換サービスを使用している場合は、「 regionendpoint 」が必要です。 この場合、「 region +」は実際には何も設定せず、入力する値は重要ではありませんが、空白ではなく存在する必要があります。

ファイルを保存して閉じます。

GitLabをもう一度再構成します。

sudo gitlab-ctl reconfigure

他のDockerマシンで、レジストリに再度ログインして、すべてが正常であることを確認します。

docker login :5555

`+ Login Succeeded +`メッセージが表示されます。

Dockerレジストリをセットアップしたので、アプリケーションのCI構成を更新してアプリをビルドおよびテストし、Dockerイメージをプライベートレジストリにプッシュします。

ステップ3-`+ gitlab-ci.yaml +`の更新とDockerイメージの構築

Dockerでアプリをビルドするには、 `+ .gitlab-ci.yml `ファイルを更新する必要があります。 メインのプロジェクトページでこのファイルをクリックしてから[編集]ボタンをクリックすると、GitLabでこのファイルを直接編集できます。 または、レポジトリをローカルマシンにクローンし、ファイルを編集してから、「 git push +」でGitLabに戻すこともできます。 これは次のようになります。

git clone [email protected]:sammy/hello_hapi.git
cd hello_hapi
# edit the file w/ your favorite editor
git commit -am "updating ci configuration"
git push

まず、ファイル内のすべてを削除してから、次の構成に貼り付けます。

gitlab-ci.yml
image: docker:latest
services:
- docker:dind

stages:
- build
- test
- release

variables:
 TEST_IMAGE: //hello_hapi:$CI_COMMIT_REF_NAME
 RELEASE_IMAGE: //hello_hapi:latest

before_script:
 - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN

build:
 stage: build
 script:
   - docker build --pull -t $TEST_IMAGE .
   - docker push $TEST_IMAGE

test:
 stage: test
 script:
   - docker pull $TEST_IMAGE
   - docker run $TEST_IMAGE npm test

release:
 stage: release
 script:
   - docker pull $TEST_IMAGE
   - docker tag $TEST_IMAGE $RELEASE_IMAGE
   - docker push $RELEASE_IMAGE
 only:
   - master

強調表示されたURLとユーザー名を自分の情報で更新してから、GitLabの[変更をコミット]ボタンで保存してください。 GitLabの外部でファイルを更新する場合は、変更をコミットしてGitLabに「+ git push +」を返します。

この新しい設定ファイルは、GitLabに最新のdockerイメージ( + image:docker:latest +)を使用し、それをdocker-in-dockerサービス(docker:dind)にリンクするように指示します。 次に、「+ build」、「+ test」、および「+ release」ステージを定義します。 + build`ステージは、リポジトリで提供されている + Dockerfile`を使用してDockerイメージをビルドし、Dockerイメージレジストリにアップロードします。 それが成功した場合、 + test`ステージはビルドしたばかりのイメージをダウンロードし、その中で + npm test`コマンドを実行します。 テスト段階が成功した場合、「+ release 」段階は画像をプルし、「 hello_hapi:latest +」としてタグ付けして、レジストリにプッシュします。

ワークフローに応じて、追加の + test`ステージを追加したり、アプリをステージングまたは実稼働環境にプッシュする + deploy`ステージを追加したりすることもできます。

構成ファイルを更新すると、新しいビルドがトリガーされます。 GitLabの `+ hello_hapi +`プロジェクトに戻り、コミットのCIステータスインジケーターをクリックします。

image:https://assets.digitalocean.com/articles/gitlab-docker/commit-widget.png [パイプラインステータスアイコン付きのGitLabコミット通知]

表示されたページで、ステージのいずれかをクリックして、進行状況を確認できます。

image:https://assets.digitalocean.com/articles/gitlab-docker/commit-pipeline.png [GitLabパイプラインの詳細]

image:https://assets.digitalocean.com/articles/gitlab-docker/stage-detail.png [GitLabパイプラインステージの進捗状況]

最終的に、すべての段階で緑色のチェックマークアイコンを表示して、成功したことを示す必要があります。 左側のメニューの[レジストリ]項目をクリックすると、作成されたばかりのDockerイメージを見つけることができます。

image:https://assets.digitalocean.com/articles/gitlab-docker/docker-list.png [GitLab container registry image list]

画像名の横にある小さな「ドキュメント」アイコンをクリックすると、適切な `+ docker pull …​ +`コマンドがクリップボードにコピーされます。 その後、イメージをプルして実行できます。

docker pull
docker run -it --rm -p 3000:3000
Output> [email protected] start /usr/src/app
> node app.js

Server running at: http://56fd5df5ddd3:3000

画像はレジストリから取得され、コンテナで開始されました。 ブラウザに切り替えて、ポート3000でアプリに接続してテストします。 この場合、ローカルマシンでコンテナを実行しているため、次のURLの* localhost *を介してアクセスできます。

http://localhost:3000/hello/test
OutputHello, test!

成功! `+ CTRL-C `でコンテナを停止できます。 これから、リポジトリの ` master `ブランチに新しいコードをプッシュするたびに、新しい ` hello_hapi:latest +`イメージを自動的に構築してテストします。

結論

このチュートリアルでは、新しいGitLabランナーをセットアップしてDockerイメージを構築し、プライベートDockerレジストリを作成してそれらを保存し、Node.jsアプリを更新してDockerコンテナー内で構築およびテストします。

このセットアップで使用されるさまざまなコンポーネントの詳細については、https://docs.gitlab.com/ce/README.html [GitLab CE]、https://docs.gitlab.com/eeの公式ドキュメントをご覧ください。 /administration/container_registry.html[GitLab Container Registry]、およびhttps://docs.docker.com/[Docker]。

Related