無料でGitLabの「Container Registry」を使って、docker composeのイメージをプライベートで保存してみる

初めましての方、ご無沙汰している方、おはこんばんにちは。
Nな人です。

Twitter（現X）が何故か凍結され、早半年が過ぎました。
今はもうBlueSkyに生きていますので、よかったらフォローお願いします！
https://bsky.app/profile/nnahito.com


## 前置き（読み飛ばし推奨）
最近、自分のブログ「 https://nnahito.com/ 」を長らく放置していたので、
これを機に色々変えたいなーと思って模索している中、
「そうだ、コンテナ化しよう！」となり、勉強を始めました。

どうせやるなら、可能な限り無料でやりたい！
そんな夢を叶えていきましょうか。

それでは、やっていきましょう。


## 対象者
一応、アカウント登録などの手順はすっ飛ばすので、
この記事の対象者をまとめておきます。

- GitLabのアカウントを持っている
    - 「GitLab？いやいやエンジニアならGitHubだろｗｗｗ」とかいう訳のわからないこだわりのない人
- dockerの操作をある程度わかっている
- git関連の操作をある程度わかっている
    - 不安な方は、 https://qiita.com/nnahito/items/565f8755e70c51532459 あたりを見ましょう
- Nな人の記事が好き


## GitLabのContainer Registry
適当なリポジトリを作ったあと、画像の位置にあります。

![スクリーンショット 2023-12-09 17.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63338/a5d408f5-fff5-2aa3-88c0-6a65ba2dd636.png)


## プロジェクトをを作る
早速適当なdocker-composeのプロジェクトを用意しましょう。
サンプルコードをGit**Hub**に用意してあるので、それを使っていただいても大丈夫です。
（GitHubかよｗｗｗというツッコミは受け付けておりません。）

サンプル環境
https://github.com/nnahito/gitlab-container-samplecode


## イメージの登録に向けて、レジストリにログイン
おそらく、本来だったらdocker公式が用意したレジストリに登録するのでしょうが、
今回はGitLabのプライベートなイメージレジストリに保存するので、
GitLabにログインする必要があります。

なので、以下のコマンドを実行し、GitLabにログインしておきましょう。

```bash
$ docker login registry.gitlab.com
```
※ 聞かれるID/PASSは、GitLabにログインするものです


## イメージのタグ付け

イメージにタグを付けましょう。
以下のようなコマンドを実行します

```bash
$ docker tag コンテナ名:コンテナのバージョン GitLabのコンテナレジストリのパス:コンテナのバージョン
```

サンプル

```bash
$ docker tag container-test-app:latest registry.gitlab.com/nnahito/container-test:0.01
```

## イメージをPush
タグを付けたらGitLab上にPushします。
以下のようなコマンドを実行します。

```bash
$ docker push GitLabのコンテナレジストリのパス:コンテナのバージョン 
```

「GitLabのコンテナレジストリのパス」は、
Container Registoryのページに行ったときに書いてありますのですぐわかると思います。

サンプル

```bash
$ docker push registry.gitlab.com/nnahito/container-test:0.01
```

おめでとうございます。
これでPushができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63338/3e49f4c2-78ee-38b9-0bf7-75e13d34d9c0.png)


## 階層別け
docker-composeを使う場合、複数のコンテナが存在することになります。
しかし、上記のやり方だと最後にビルドされたイメージしかpushされません。

1コンテナ1サービス（1プロセス）の推奨の元、その様になって……いるのかな？
多分。しらんけど。

複数のコンテナを保存したい場合は、階層を別けましょう。

### 階層別け
おなじみの`/`で階層を分けることができます。

私の[サンプルコード](https://github.com/nnahito/gitlab-container-samplecode)を利用している前提でのサンプルコマンドになりますのでご注意ください。

まずはコンテナをビルドします。

```bash
$ docker compose build docker-compose.ymlで指定しているサービス名 
```

そしてTag登録をします。

```bash
$ docker tag コンテナ名:コンテナのバージョン GitLabのコンテナレジストリのパス/階層名:コンテナのバージョン
```

サンプル

```bash
# コンテナイメージのビルド
$ docker compose build app1

# Registory用にTagを発行
$ docker tag container-test-app:latest registry.gitlab.com/nnahito/container-test/app1:0.02
```

```bash
# コンテナイメージのビルド
$ docker compose build app2

# Registory用にTagを発行
$ docker tag container-test-app:latest registry.gitlab.com/nnahito/container-test/app2:0.02
```

これで準備完了です。
Pushしましょう。

```bash
$ docker push GitLabのコンテナレジストリのパス/階層名:コンテナのバージョン 
```

サンプル

```bash
# app1のコンテナイメージをPush
$ docker push registry.gitlab.com/nnahito/container-test/app1:0.02

# app2のコンテナイメージをPush
$ docker push registry.gitlab.com/nnahito/container-test/app2:0.02
```

これで、GitLab上に複数階層で、複数のイメージを置くことができます。


## 作ったイメージを使う
先程作ったイメージを使ってみましょう。
と言っても、普通にpullしてくると使えます。

### pull

```bash
$ docker pull リポジトリのパス:バージョン
```

サンプル

```bash
# app1のコンテナイメージをPull
$ docker pull registry.gitlab.com/nnahito/container-test/app1:0.02

# app2のコンテナイメージをPull
$ docker push registry.gitlab.com/nnahito/container-test/app2:0.02
```

### コンテナの起動

```bash
$ docker run -it リポジトリのパス:バージョン
```

サンプル

```
# app1のコンテナを起動
$ docker run -it registry.gitlab.com/nnahito/container-test/app1:0.02

# app2のコンテナを起動
$ docker run -it registry.gitlab.com/nnahito/container-test/app2:0.02
```

以上です。

## 終わりに
こんな感じでコンテナを無料でprivateに管理できるので、いい感じですね。

ちなみにGitHubにも同じような機能があるようなのですが、
こっちはそんなに調べていないのでまた別の機会に、ということで。

少しでも参考になった、助かったと思っていただければ、LGTMやストックをお願いします。

それではまた次回！