投稿日
Podmanを使ってコンテナを導入してみた事例紹介
もくじ
はじめに
私はアプリ開発に取り組むなかで、Podmanというコンテナを管理できるオープンソースを使っていました。
具体的にはデータベースの構築に活用しており、そのなかでPodmanならではのメリットを感じることがありました。それを踏まえて、コンテナ全般やPodmanに関心のある方に向けてその使い方や工夫した点をご紹介します。
コンテナ
コンテナとは、アプリとその実行に必要なものをまとめてパッケージ化する技術のことで、
動作している環境に挙動が左右されず、また軽量であるため短時間で起動できるなどのメリットがあります。
開発業務では、ローカルでのアプリの動作確認や、CI/CDパイプラインでのユニットテストの実行のためにすぐにデータベースを立ち上げられる点で役立っていました。
Podmanを採用した理由
前提
- コンテナにデータベースを構築することを例に説明します
- 記載している環境変数やその値、コマンドはあくまで参考までとしてください
- Podmanのインストール手順の説明は省略します
- 紹介内容は以下環境に基づきます
- データベース:MySQL(コンテナ上で動作)
- DevOps:Azure DevOps
- コンテナ管理ツール:
- CLI:Podman v4.6.2
- GUI:Podman Desktop v1.19.2
ファイル一覧
| リポジトリ | フォルダ | ファイル | 内容 |
| example-api | なし
(ルートディレクトリ直下) |
azure-pipeline.yml | CI/CDパイプライン実行時の処理内容の定義 |
| example-tools |
script/ut/podman/mysql |
run_on_pipeline.sh | CI/CDパイプラインでpodmanコマンドをdockerコマンドに読み替えて、run.shを呼び出し |
| run.sh | podmanコマンドでコンテナを起動 | ||
| docker-compose.yml | コンテナ(およびコンテナ起動時の処理)の定義 | ||
| Dockerfile | イメージを作成するための設定 | ||
| .env | 環境変数の定義(MySQL専用) | ||
| script/ut/podman | podman_common.env | 環境変数の定義(全サービス共通) |
GUIを使ったコンテナの作成・起動方法
FROM mysql:8.0
ADD ./db/mysql_conf/my.cnf /etc/my.cnf
RUN chmod 644 /etc/my.cnf





CLIを使ったコンテナの作成・起動方法
ローカルで実行する場合
#!/bin/bash
cd $(dirname $0) 2> /dev/null
# スクリプト名を表示して開始を知らせる
echo start $0
# 各種環境変数を読み込む
. .env
. ../podman_common.env
# 指定されたボリュームが存在しない場合は作成し、存在する場合はその旨を表示
if [[ ! $(podman volume ls -f "name=${VOLUME}" --format '{{.Name}}') == "${VOLUME}" ]]; then
podman volume create "${VOLUME}" >/dev/null && echo "Created new volume: ${VOLUME}"
else
echo "Using existing volume: ${VOLUME}"
fi
podman volume ls
# 指定されたネットワークが存在しない場合は作成し、存在する場合はその旨を表示
if [[ ! $(podman network ls -f "name=${NETWORK}" --format '{{.Name}}') == "${NETWORK}" ]]; then
podman network create "${NETWORK}" >/dev/null && echo "Created new network: ${NETWORK}"
else
echo "Using existing network: ${NETWORK}"
fi
podman network ls
echo "############ start podman-compose ############"
# 設定ファイルを反映させるため常に再ビルドする。
podman-compose build --no-cache
# コンテナをバックグラウンドで起動
podman-compose up -d
echo "############ end podman-compose ############"
# 実行中のコンテナ一覧をテーブル形式で表示、失敗したらエラーメッセージを表示
echo && podman container ps --format "table {{.ID}}t{{.Image}}t{{.Ports}}t{{.Names}}" || echo "Failed to start container."
version: "3.8"
services:
# MySQL
example-db-ut:
container_name: ${CONTAINER_NAME}
build: ./
volumes:
# 初期データを投入するSQLが格納されているdir
- ${INIT_SCRIPT}:/docker-entrypoint-initdb.d
# 永続化するときにマウントするdir
- ${VOLUME}:/var/lib/mysql
env_file:
- .env
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
- TZ=${TZ}
- BIND-ADDRESS=0.0.0.0
ports:
- ${DB_PORT}:3306
networks:
- ${NETWORK}
networks:
example-ut-network:
external: true
volumes:
example-mysql-ut-data:
external: true
以下は環境変数が定義されたファイルの例です。上記のファイルで指定されている環境変数の値の参考としてください。
.env(MySQLおよびそのコンテナに関する環境変数)
CONTAINER_NAME=example-db-ut
DB_NAME=example_db_ut
DB_USER=test
DB_PASS=test
DB_PORT=53306
TZ=Asia/Tokyo
VOLUME=example-mysql-ut-data
INIT_SCRIPT=./db/ut/init
podman_common.env(コンテナが属するネットワークに関する環境変数)
export NETWORK=example-ut-network
以上のファイル及び他設定ファイル(my.cnf)を用意のうえ、run.shを実行すればコンテナの作成・起動ができます。
XXXXXXXXXX@XXXXXXXXXXX-XX MINGW64 /c/example-tools $ script/ut/podman/mysql/run.sh start script/ut/podman/mysql/run.sh Using existing volume: example-mysql-ut-data (中略) ############ end podman-compose ############ CONTAINER ID IMAGE PORTS NAMES 1fc34949e1ab localhost/mysql_example-db-ut:latest 0.0.0.0:53306->3306/tcp example-db-ut
CI/CDパイプラインで実行する場合
resources:
repositories:
- repository: example-tools
type: git
name: example-tools
ref: develop
jobs:
- job: buildAndPublish
timeoutInMinutes: 120
pool:
vmImage: 'ubuntu-latest'
variables:
MAVEN_CACHE_FOLDER: $(Pipeline.Workspace)/.m2/repository
MAVEN_OPTS: '-Dmaven.repo.local=$(MAVEN_CACHE_FOLDER) -Duser.language=ja -Duser.country=JP'
steps:
- checkout: self
- checkout: example-tools
- task: bash@3
inputs:
targetType: 'inline'
script: |
chmod -R 755 .
example-tools/script/ut/podman/mysql/run_on_pipeline.sh
displayName: 'run docker '
#!/bin/bash
cd $(dirname $0)
echo start $0
# 非インタラクティブ時のalias有効化
shopt -s expand_aliases
# podmanをdockerに読み替え
alias podman=docker
# podman-composeをdocker composeに読み替え
alias podman-compose="docker compose"
. run.sh
おわりに
操作性の優れたGUIで簡単にコンテナを管理できることや、場面に応じてGUIとCLIを使い分けて柔軟にコンテナを管理できる点でPodmanは優れています。また、他の点においても他のツールに引けを取らないことは、導入を試すなかで感じた点でした。
以上の内容をご参考いただき、Podmanやコンテナを扱う方のお役に立てば幸いです。
