ニフクラ ブログ

ニフクラ/FJ Cloud-Vやクラウドの技術について、エンジニアが語るブログです。

ニフクラDevOps with GitLabでカスタムDockerイメージをコンテナレジストリに登録する方法

こんにちは、CRE部 技術支援チームです。

ニフクラではDevOps with GitLabというAll-in-oneのDevOpsサービスを提供しています。

サーバー構築は不要で、ニフクラのコントロールパネル(管理画面)からDevOps環境を簡単にサービスとして利用できます。

利用可能な機能は、Issue管理、プロジェクト管理、ソースコード管理、CI/CDパイプライン、コンテナレジストリ、セキュリティスキャンなどです。

特に、CI/CDパイプラインの構築は、ソフトウェア開発速度を高めつつ自動化によりヒューマンエラーを防止するという、DevOps導入のメリットのひとつとして認識されています。

これから3回の記事に分けてニフクラDevOps with GitLabにおけるCI/CDパイプラインにフォーカスしてDevOps開発作業の手法を紹介したいと思います。

第1回. カスタムDockerイメージを作成してコンテナレジストリに登録

第2回. カスタムDockerイメージエンハンス開発作業環境準備(CI/CDパイプラインを実行するGitLabRunnerの作成まで)

第3回. カスタムDockerイメージエンハンス開発作業実施(CI/CDパイプライン実行確認まで)

では、第1回目を始めます。

システム概念図

はじめに

DevOpsでの開発作業においてコンテナ(Dockerが主流)の利用はCI/CDと相性が良いと言われています。 コンテナの起動の速さ・可搬性の高さという特徴は、CI/CDのプロセスにおいて工数削減だけにとどまらずトラブル対処のしやすさという点でも大きなメリットがあります。

Dockerについては以下のブログ記事でも紹介していますのでご覧ください。
blog.pfs.nifcloud.com

開発現場では、アプリケーションに対して以下のように様々なカスタマイズ要件があります。

  • 初期設定ファイル、スタイルシート等のプロジェクト独自のデータファイルを持たせたい

  • 機密情報の漏洩防止、ユーザー認証、アクセス制御といったセキュリティ対策を取り入れたい

このような要件にDockerは柔軟に対応できるため、プロジェクト独自のカスタマイズされたDockerイメージが世界中で作成されています。
多くの場合、カスタマイズされたDockerイメージはコンテナレジストリ機能を持ったサーバーでプライベートに管理されています。

しかし、コンテナレジストリ機能をサーバーに構築する場合、関連パッケージのインストール、環境設定といった作業が発生するため、開発プロジェクト初期の大きな負担になります。

今回は、ニフクラDevOps with GitLabのコンテナレジストリ機能を利用することで、サーバー構築や環境設定の工数を削減して、簡単にコンテナを利用できるようにする手順を検証します。

検証概要

以下の➀~➂の内容で検証を実施します。

①. 開発用検証サーバーからdocker pushコマンドでカスタムDockerイメージをGitLabサーバーのコンテナレジストリに登録します。

②.WEBアプリ検証サーバーにカスタムDockerイメージをdocker pullコマンドでダウンロードします。

➂. WEBアプリ検証サーバーでカスタムDockerイメージをWEBアプリのコンテナとして起動します。WEBアプリがインターネットに公開されます。

ニフクラDevOps with GitLabコンテナレジストリ機能

前提条件

本ブログ記事は、以下の知識がある方を想定しています。

  • ニフクラの基本的な操作ができる(サーバー作成、ネットワーク構築)

  • Dockerについての基本的な設定や操作ができる

  • WEBアプリ開発の経験がある

作成するニフクラリソース

検証に利用したリソースは以下の通りです。

リソース 数量
DevOps with GitLabサーバー 1
DevOpsファイアウォール 1
検証サーバー 2
ファイアウォール 1

1.DevOps with GitLabサーバー作成

DevOps with GitLabサーバーを作成します。
作成方法は以下ヘルプサイト、ユーザーガイドを参照ください。
クラウドヘルプ(DevOpsサーバーの作成)
ユーザーガイド(DevOps with GitLab:クイックスタート)

項目名
サーバー名 dockertest
ファイアウォール dockertest-fw
パラメータグループ dockertestprm

2.DevOpsファイアウォール作成

DevOpsファイアウォールを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(ファイアウォールグループの新規作成)

DevOpsファイアウォールグループ名 INルール
dockertest-fw TCP443:ブラウザアクセスで使用しているIPアドレス
TCP443:WEBアプリ検証サーバーのグローバルIPアドレス
TCP443:開発検証サーバーのグローバルIPアドレス

3.検証サーバー作成

WEBアプリ検証サーバーと開発検証サーバーを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(サーバーの作成)

  • WEBアプリ検証サーバー
項目名
OS Rocky Linux 8.5
サーバー名 WebAppSrv
ファイアウォール WebAppSrvFW
  • 開発検証サーバー
項目名
OS Rocky Linux 8.5
サーバー名 DevSrv
ファイアウォール WebAppSrvFW

4.検証サーバーファイアウォール作成

WEBアプリ検証サーバーと開発検証サーバーで使用するファイアウォールグループを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(ファイアウォールグループの新規作成)

ファイアウォール名 INルール
WebAppSrvFW(WEBアプリ検証サーバー用) TCP22:作業端末のグローバルIPアドレス
TCP8080:作業端末のグローバルIPアドレス

DevOps with GitLabサーバー環境設定

1.GitLabプロジェクト作成

DevOpsを実施するためにGitLabプロジェクトを作成します。

GitLabプロジェクト作成

ニフクラコントロールパネルのDevOps with GitLabサーバー基本情報「GitLab URL」に設定されたURLをブラウザに入力してDevOps with GitLabサーバーにログインします。
ログイン後右上の「New project」ボタンをクリックします。
プロジェクト名を入力して「Create project」ボタンをクリックします。
プロジェクトが作成されて一覧に表示されます。

2.コンテナレジストリ登録用アクセストークン発行

DevOps with GitLabサーバー上にカスタムしたDockerイメージを登録するために コンテナレジストリ登録用アクセストークンを発行します。 作成したプロジェクトに移動して「Settings」→「Access Tokens」を選択します。
「Token name」にトークン名を設定して、「read_registry」、「write_registry」 を選択して 「Create project Access token」ボタンをクリックします。
「Your new project access token」欄にトークンが発行されます。以降はトークンは表示できなくなるので、コピーして別途メモ等に保存しておきます。

コンテナレジストリ登録用アクセストークン発行は完了です。

WEBアプリ検証サーバー環境設定

DockerCEインストール

WEBアプリ検証サーバー上でDockerコンテナを起動するためにDockerCEをインストールします。

RockyLinuxを更新します。

$ dnf -y update

Dockerのリポジトリを追加します。

$ dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo

Dockerのリポジトリを確認します。

$ dnf repolist
repo id                             repo name
appstream                           Rocky Linux 8 - AppStream
baseos                              Rocky Linux 8 - BaseOS
docker-ce-stable                    Docker CE Stable - x86_64
extras                              Rocky Linux 8 - Extras

Dockerをインストールします。

$ dnf -y install docker-ce
Docker CE Stable - x86_64                       390 kB/s |  26 kB     00:00
Dependencies resolved.
================================================================================
 Package                   Arch   Version                Repository        Size
================================================================================
Installing:
 docker-ce                 x86_64 3:20.10.17-3.el8       docker-ce-stable  22 M
-----------省略-----------
Complete!

バージョンを確認します。

$ docker -v
Docker version 20.10.17, build 100c701

systemctl コマンドでdockerをスタートしておきます。

$ systemctl start docker

DockerCEインストールは完了です。

開発検証サーバー環境設定

DockerCEインストール

開発検証サーバーからGitLabサーバーにDockerイメージをコンテナレジストリ登録するためにDockerCEインストール を実施します。
※上記WEBアプリ検証サーバー環境設定の同一項目参照

カスタムDockerイメージ用Dockerfile作成

開発検証サーバーで検証独自のカスタムDockerイメージを定義したDockerfileを作成します。 また、カスタムDockerイメージへ含めるファイル(index.html、default.css)も作成します。 作業用の「registry_docker」ディレクトリとhtmlファイルとcssファイルを格納する「htmlディレクトリ」を作成します。
mkdirコマンドで作成します

$ mkdir -p ./registry_docker/html

viコマンドで「index.html」を作成します。

$ vi ./registry_docker/html/index.html

設定内容は以下です。

index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="default.css">
    <title>INDEX</title>
</head>

<body>
    <h1>ニフクラINDEX</h1>
    インデックスページです。
</body>

</html>

viコマンドで「default.css」を作成します。

$ vi ./registry_docker/html/default.css

設定内容は以下です。

default.css

h1 {
  text-align: center;
  background-color: #1c5b87;
  font-weight: bold;
  color: #ffffff;
  font-size: 100%;
}

#nav {
  list-style: none;
  overflow: hidden;
}

#nav li {
  width: 140px;
  text-align: center;
  background-color: #1c5b87;
  float: left;
  margin-right: 2px;
}

#nav li a {
  text-decoration: none;
  color: #fff;
  font-weight: bold;
}


viコマンドで「Dockerfile」を作成します。 Dockerfile詳細についてはDockerfile公式サイトを参照してください(他サイトへのリンクです)

$ vi ./registry_docker/Dockerfile

設定内容は以下です。

#最新のNGINXのDockerイメージを使用
FROM 'nginx:latest'
#NGINXコンテナ内部の「/usr/share/nginx/html」に「html」以下のファイルをコピーする
COPY html/ /usr/share/nginx/html
  1. 「html」ディレクトリには「index.html」(indexページ)、「default.css」(デフォルトCSS)が格納されています。

  2. 「COPY html/ /usr/share/nginx/html」の実行でNGINXのDockerイメージコンテナ内の「/usr/share/nginx/html」に「html」ディレクトリの内容がコピーされます。

  3. 「index.html」、「default.css」付きのNGINXイメージがカスタムDockerイメージとして作成されます。

  4. コピー先の「/usr/share/nginx/html」はNGINXの公開ディレクトリです。ここに配置されたhtmlファイルはWEB画面として公開されます。

treeコマンドで確認します。構成内容は以下です。

$ tree -A -L 2 registry_docker
registry_docker
├Dockerfile
└html
  ├default.css
  └index.html

カスタムDockerイメージ用Dockerfileの作成は完了です。

検証実施

①DevOps with GitLabサーバーにコンテナレジストリ登録

開発検証サーバーで作成したカスタムDockerイメージをdocker pushコマンドでDevOps with GitLabサーバーにコンテナレジストリ登録します。 ブラウザでDevOps with GitLabサーバーにログインして 作成したプロジェクトに移動します。「Packages & Registries」→「Container Registry」を選択します。
画面にコンテナレジストリ登録するためのdockerコマンドが表示されます。

1~3の順序で表示されたdockerコマンドを開発用検証サーバーで実行します。
※開発用検証サーバーでのdockerコマンドは「registry_docker」ディレクトリで実行します。

1.docker loginコマンド

docker loginコマンドを実行します。
Username、Passwordの入力を求められます。 コンテナレジストリ登録用アクセストークンで発行された内容を入力します。 Usernameにアクセストークン名、Passwordにアクセストークンを入力します。

$ docker login xxxxxx.jp-east-1.gitlab.devops.nifcloud.com
Username: アクセストークン名
Password:アクセストークン
-----------省略-----------
Login Succeeded

docker loginが成功します。

2.docker buildコマンド

docker buildコマンドを実行します。

$ docker build -t xxxxxx.jp-east-1.gitlab.devops.nifcloud.com/xxxxxx/devops_docker .
Sending build context to Docker daemon  83.46kB
Step 1/2 : FROM 'nginx:latest'
-----------省略-----------
Step 2/2 : COPY html/ /usr/share/nginx/html
-----------省略-----------
 ---> 3943e0294b2b
Successfully built 833cdf31964c
Successfully tagged xxxxxx.jp-east-1.gitlab.devops.nifcloud.com/xxxxxx/devops_docker:latest

docker buildが成功します。

3.docker push コマンド

docker push コマンドを実行します。

$ docker push xxxxx.jp-east-1.gitlab.devops.nifcloud.com/xxxxxxxx/devops_docker
-----------省略-----------
3a89c8160a43: Pushed
e3257a399753: Pushed
92a4e8a3140f: Pushed
-----------省略-----------
latest: digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxx size: 1984

docker pushが成功します。

コンテナレジストリ登録確認

ブラウザでDevOps with GitLabサーバーの内容を確認します。
Dockerイメージがコンテナレジストリ登録されています。

コンテナレジストリ登録は確認は完了です。

②コンテナレジストリ登録後のカスタムDockerコンテナイメージダウンロード

  1. WEBアプリ検証サーバーからGitLabサーバーのコンテナレジストリにdocker loginコマンドでログインします。

  2. docker pullコマンドを実行してコンテナレジストリからカスタムDockerコンテナイメージをダウンロードする

コンテナレジストリにdocker loginコマンドでログイン

WEBアプリ検証サーバーでdocker loginコマンドを実行してGitLabサーバーのコンテナレジストリにログインします。
プロジェクト→「Packages & Registries」→「Container Registry」→「CLI Commands(青色メニュー)」→「Login」内のコピーボタンでコピーできます。 コマンドを実行します。

$ docker login xxxxxx.jp-east-1.gitlab.devops.nifcloud.com
Username: dockertoken
Password:xxxxxxx
-----------省略-----------
Login Succeeded

ログインは完了です。

コンテナレジストリからカスタムDockerコンテナイメージをdocker pullでダウンロード

WEBアプリ検証サーバーでdocker pullコマンドを実行してコンテナレジストリからカスタムDockerコンテナイメージをダウンロードします。 パラメーターにはコンテナイメージURLパスを指定します。
コンテナイメージURLパスは以下の「Packages & Registries」→「Container Registry」→対象の「カスタムDockerコンテナイメージ」リンク移動します。 最新バージョン「latest」のコピーボタンでコンテナイメージURLパスはコピーできます

docker pullコマンドを実行します。

$ docker pull xxxxxx.jp-east-1.gitlab.devops.nifcloud.com/xxxxx/devops_docker: latest
latest: Pulling from xxxxx/devops_docker
-----------省略-----------
Digest: sha256:91dded32efeb2977014474226a2c40334643f86b462d68057079aaae4cf0bc91
Status: Image is up to date for xxxxxx.jp-east-1.gitlab.devops.nifcloud.com/xxxxx/devops_docker:latest
xxxxxx.jp-east-1.gitlab.devops.nifcloud.com/xxxxx/devops_docker:latest

カスタムDockerコンテナイメージのダウンロードは完了です。

➂カスタムDockerコンテナイメージ起動と稼働確認

  1. WEBアプリ検証サーバーでdocker runコマンドを実行してカスタムDockerコンテナイメージをWEBアプリとして起動します。

  2. ブラウザでWEB画面を参照できることを確認します。

カスタムDockerコンテナイメージを起動

コンテナイメージ起動

WEBアプリ検証サーバーでdocker runコマンドを実行してカスタムDockerコンテナイメージをWEBアプリとして起動します。
パラメーターにはdocker pullコマンドと同様コンテナイメージURLパスを指定します。
※8080ポートを開放するため「-p 8080:80」を指定します。バックグラウンド起動するため「-d」を指定します。

$ docker run xxxxxxx.jp-east-1.gitlab.devops.nifcloud.com/xxxxx/devops_docker:latest -p 8080:80 -d
e7eda31c2dca2e0921883a611b2c4bf05ca3a9cdff413f38c47150f4387d583

カスタムDockerコンテナイメージ起動は完了です。

WEB画面表示

ブラウザでWebアプリ検証サーバーのURLにアクセスします。

  • http ://Webアプリ検証サーバーのグローバルIP:8080/

カスタムDockerイメージのindexページが表示されます。
稼働確認作業は完了です。

まとめ

ニフクラDevOps with GitLabのコンテナレジストリ機能を使ったカスタムDockerイメージの登録方法を紹介しました。

  • 煩雑なサーバーのインストール作業、環境設定等の負担を無くしてコンテナレジストリ機能を利用できる。

  • コンテナレジストリ機能ではdockerコマンドで簡単にカスタムDockerイメージを管理できる

以上の内容が、ご理解いただけたかと思います。

次回以降、カスタムDockerイメージの内容を編集するエンハンス作業を通してDevOpsのメインとなるソースコード管理、CI/CDパイプラインについて紹介します。

最後までお読みくださいましてありがとうございました。

注意事項

  • 本記事に記載されている会社名、製品名等の固有名詞は各社の商号、登録商標または商標です。
  • 本記事の他社サイトへのリンクにつきまして、リンク切れの際はご容赦ください。
  • 本記事は、2022年9月時点の情報です。