概要
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 と密接に連携 | 広範なエコシステムと豊富なツールチェーン |
構築環境図
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
- 以下のコマンド実行で確認する
[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のままで、3分くらいたつと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
- 以下のコマンドを実行して初期パスワードを取得する
cat /home/ec2-user/gitlab-gitlabrunner/gitlab/config/initial_root_password
- 取得した情報を用いてログインを試みる
ユーザー名:root
パスワード:取得したパスワード
- 無事にログインが出来れば完了
【参考】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