podmanとpodman-composeを用いてgitlab/gitlabコンテナの構築


# 概要
podman・podman-composeを利用して、Gitlab/GitlabRunnerを構築した

# podmanとは
podmanは、docker同様コンテナ型仮想化を提供するパッケージ。
dockerはコンテナ型仮想化による恩恵を持ちつつ、docker imageの持つ可搬性の有用性を見出され、コンテナ型仮想化ツールの代表的なツールとなった。
その一方で、rootユーザーを前提にしていたり、デーモンが常駐しているといった要因がセキュリティの観点で問題視されるようになった。
podmanは、dockerの持つセキュリティ的な課題に対応しつつ、dockerとの互換性を非常に強く意識されたパッケージである。

以下に簡単に違いをまとめる。

| 特徴                     | Podman                                  | Docker                                  |
|--------------------------|-----------------------------------------|-----------------------------------------|
| デーモンの有無            | デーモンレス                             | デーモンが常駐                            |
| ユーザーモードのサポート  | 非特権ユーザーでも管理可能                 | 非特権ユーザーは直接管理不可               |
| ストレージ管理            | ユーザーごとに独立したストレージを持つ       | グローバルにストレージを管理                |
| ポッドサポート            | Kubernetes のポッド概念をサポート            | ポッドの概念なし                           |
| 互換性                   | `podman-docker` で Docker CLI と互換性あり   | Docker CLI に特化                        |
| セキュリティ              | デーモンレスでセキュリティリスクが低い       | デーモンを標的とした攻撃リスクあり           |
| Kubernetes との統合      | Kubernetes に近い運用が可能                 | 追加ツールが必要（現在は CRI-O や containerd 推奨） |
| イメージのビルド          | `buildah` を使用してデーモンレスでビルド     | デーモンを使用してビルド                   |
| エコシステムとツールチェーン| Kubernetes と密接に連携                   | 広範なエコシステムと豊富なツールチェーン      |

# 構築環境図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342577/f3524aec-3875-2cdd-c285-219cd6b78bbc.png)


# podmanとpodman-composeのインストール

podmanのデーモンレス機能を有効活用するために、docker-composeではなくpodman-composeを使用する方針で環境構築を行う。

## podmanのインストール

* リポジトリ更新

```
sudo dnf update
```

* podman のインストール

```
sudo dnf install -y podman
```

* インストール確認

```
podman --version
```

以下のように出れば良い

```
podman version 4.9.4-rhel
```




## podman-composeのインストール

### 前座として、pythonの更新とpip3.8のインストール
python3.6ベースでpip3をインストールしてpodman-composeを起動したところ失敗し、エラーを調べた結果python3.7のライブラリが必要なことが発覚。
現時点で最新バージョンであるpython3.8とpip3.8を使うことにする。

* python3.8のインストール

```
sudo dnf install python38
```

* python3.6→python3.8へシンボリックリンクを切り替える

以下のコマンドを実行する

```
sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2;sudo alternatives --config python3
```

以下の表示にて"2"を選択する

```
[ec2-user@ip-192-168-2-150 alternatives]$ sudo alternatives --config python3

There are 2 programs which provide 'python3'.

  Selection    Command
-----------------------------------------------
 + 1           /usr/bin/python3.6
*  2           /usr/bin/python3.8

```

* 以下のコマンド実行で確認する

```bash
[ec2-user@ip-192-168-2-150 alternatives]$ ll /etc/alternatives/python3
lrwxrwxrwx 1 root root 18 Aug  5 06:56 /etc/alternatives/python3 -> /usr/bin/python3.8
```

* pip38のインストール

```
sudo dnf install python38-pip
```

* シンボリックリンク設定

```
 sudo rm /usr/bin/pip3;sudo ln -s /usr/bin/pip3.8 /usr/bin/pip3
```

* pip3インストール確認

```
pip3 --version
```

以下のように出れば良い

```
pip 19.3.1 from /usr/lib/python3.8/site-packages/pip (python 3.8)
```

### podman-composeのインストール

* インストールコマンド

```
pip3 install --user podman-compose
```

* 確認コマンド

```
 podman-compose --version
```

* 以下のように出れば良い

```
podman-compose version 1.2.0
podman version 4.9.4-rhel
```


# gitlabコンテナとgitlab-runnerコンテナのインストール

## gitlabコンテナのインストール

* 以下のコマンドを実行する

```
podman pull docker.io/gitlab/gitlab-ee:17.2.1-ee.0
```

* 以下のような結果になればOK

```
[ec2-user@ip-192-168-2-150 gitlab-gitlabrunner]$ podman image ls docker.io/gitlab/gitlab-ee
REPOSITORY                  TAG          IMAGE ID      CREATED      SIZE
docker.io/gitlab/gitlab-ee  17.2.1-ee.0  a8aa14dc8a9b  12 days ago  3.36 GB
```

## gitlab-runnerコンテナのインストール

2024/08/05時点におけるUbuntu安定板を利用する。

* 以下のコマンドを実行する

```
podman pull docker.io/gitlab/gitlab-runner:ubuntu-v17.2.1
```

以下のコマンドでも同様のコンテナを取得できるが、実施タイミングによってubuntuタグの指すコンテナバージョンが異なる。
取得時期における最新の安定バージョンを取得したいという場合は以下のコマンドを実行すること

```
podman pull docker.io/gitlab/gitlab-runner:ubuntu
```

* 以下のような結果になればOK

```
[ec2-user@ip-192-168-2-150 gitlab-gitlabrunner]$ podman image ls docker.io/gitlab/gitlab-runner
REPOSITORY                      TAG             IMAGE ID      CREATED      SIZE
docker.io/gitlab/gitlab-runner  ubuntu-v17.2.1  cdfa8cbb0731  10 days ago  778 MB
```

# gitlab/gitlab-runnerコンテナの起動

## podman-compose.ymlの用意

* マウントの設定などがあるため/home/ec2-user/gitlab-gitlabディレクトリ内に以下のファイルを作成する。

ファイル名：podman-compose.yml

ファイルの中身：

```
version: '3.6'
services:
  gitlab:
    image: docker.io/gitlab/gitlab-ee:17.2.1-ee.0
    container_name: gitlab
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://XXX.XXX.XXX.XXX'
      HOME_DIR: /home/ec2-user
    ports:
      - '8080:80'
      - '8443:443'
      - '10022:22'
    volumes:
      - /home/ec2-user/gitlab-gitlabrunner/gitlab/config:/etc/gitlab
      - /home/ec2-user/gitlab-gitlabrunner/gitlab/logs:/var/log/gitlab
      - /home/ec2-user/gitlab-gitlabrunner/gitlab/data:/var/opt/gitlab
    shm_size: '256m'

  gitlab-runner:
    image: docker.io/gitlab/gitlab-runner:ubuntu-v17.2.1
    container_name: gitlab-runner
    restart: always
    environment:
      HOME_DIR: /home/ec2-user
    volumes:
      - /home/ec2-user/gitlab-gitlabrunner/gitlab-runner/config:/etc/gitlab-runner
      - /home/ec2-user/.ssh:/root/.ssh

```


* /home/ec2-user/gitlab-gitlabrunnerディレクトリ内で以下のコマンドを実行する

```
podman-compose -f podman-compose.yml up -d
```


* 以下のコマンドで起動確認を行う。ただし、gitlabコンテナのSTATUSは3分くらいたたないとstartingのままで、３分くらいたつとhealthyになる

```
 podman-compose ps
CONTAINER ID  IMAGE                                          COMMAND               CREATED             STATUS                        PORTS                                                               NAMES
5e583803f95c  docker.io/gitlab/gitlab-ee:17.2.1-ee.0         /assets/wrapper       About a minute ago  Up About a minute (starting)  0.0.0.0:8081->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:10022->22/tcp  gitlab
318c356b873a  docker.io/gitlab/gitlab-runner:ubuntu-v17.2.1  run --user=gitlab...  About a minute ago  Up About a minute                                                                                 gitlab-runner
```

# gitlabのログイン方法

* 以下のURLにウェブブラウザでアクセスを試みると、初回ログイン時は以下のような画面になる。

```
http://192.168.2.150:8081
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342577/4bec5936-3666-af98-f6dc-86cc9b9bfae2.png)


* 以下のコマンドを実行して初期パスワードを取得する

```
cat /home/ec2-user/gitlab-gitlabrunner/gitlab/config/initial_root_password
```

* 取得した情報を用いてログインを試みる

ユーザー名：root
パスワード：取得したパスワード


* 無事にログインが出来れば完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342577/91e5cc7e-7a25-c1a2-f690-b2275efabb5f.png)


# 【参考】podman環境でも、docker-composeコマンドを続投したい場合
podman-dockerはdockerコマンド対応のpodmanなので、docker-composeも問題なく使えるだろうと思ったがそこは大きな間違い。
podmanはデーモンレスなこともあり、docker-composeコマンドを使うとAPI叩けねぇみたいなエラーが出る。
エラーの例は以下の通り

```
[ec2-user@ip-192-168-2-126 gitlab-gitlabrunner]$ sudo docker-compose up -d
Traceback (most recent call last):
  File "urllib3/connectionpool.py", line 677, in urlopen
  File "urllib3/connectionpool.py", line 392, in _make_request
  File "http/client.py", line 1277, in request
  File "http/client.py", line 1323, in _send_request
  File "http/client.py", line 1272, in endheaders
  File "http/client.py", line 1032, in _send_output
  File "http/client.py", line 972, in send
  File "docker/transport/unixconn.py", line 43, in connect
FileNotFoundError: [Errno 2] No such file or directory

```

そのため、以下のコマンドでデーモン起動をする必要がある。せっかくデーモンレスなことがウリなのにそんなことしていいのかは少々疑問。

```
sudo systemctl start podman.socket
```

# 【参考】SE LINUXの解除
gitlab-runnerのコンテナ起動時にマウントをする関係上、SE LINUXを停止しておかないとコンテナ起動後にエラーが発生する。
正しいお作法があるはずだが、調べるのも大変なので解除方法だけ記載しておく

```
# vi /etc/selinux/config
SELINUX=disabled
```

# 参考URL
 [GitlabRunnerのリリース](https://gitlab.com/gitlab-org/gitlab-runner/-/releases) 

 [Gitlab-EEコンテナ](https://hub.docker.com/r/gitlab/gitlab-ee)

 [Gitlab-Runnerコンテナ](https://hub.docker.com/r/gitlab/gitlab-runner)

[PodmanCompose](https://github.com/containers/podman-compose)