コンテナ管理ツールをPortainerからKomodoに乗り換えた話
この記事は
Dockerコンテナの管理ツールとしてPortainerを使っていましたが、Komodoに乗り換えました。
この記事ではKomodoについて紹介します。
Portainerの課題
Portainerは直感的で使いやすいUIを持つ優れたコンテナ管理ツールです。
しかし、実際に運用していく中で以下の課題を感じていました。
docker-compose.ymlの管理が面倒
Portainerでは、docker-compose.ymlをPortainerの内部ストレージに保存して管理します。
そのためdocker-compose.ymlを編集しようと思ったらPortainerのウェブエディタで編集する必要があります。
また、バージョン管理もできません。
私としては
- VS Codeで編集したい
- Gitでバージョン管理したい
のです。
よって、乗り換えを検討しました。
移行先の検討
Portainerの代替として、以下の条件を満たすツールを探しました。
必須条件:
- 既存のdocker-compose.ymlを直接管理・編集できること
- 複数のサーバーで動くコンテナを一元管理できること
候補として以下の2つのツールを検討しました。両方とも上記の条件を満たしています。
Dockge
Dockgeはシンプルで設定も簡単なコンテナ管理ツールです。
特徴:
- 軽量でセットアップが容易
- シンプルなUIで分かりやすい
課題:
- 機能が比較的限定的
- 高度な監視機能やアクション実行機能は少なめ
シンプルさを重視する場合には良い選択肢です。
Komodo
Komodoは機能が豊富なコンテナ管理プラットフォームです。
特徴:
- 豊富な機能(リソース監視、ログ確認、アクション実行など)
- Portainerに近い機能性を維持
最終的にKomodoを選択
割とPortainerに近い機能性を持ちながら、docker-compose.ymlを直接管理できる点が決め手です。
Komodoの導入手順
Komodoの基本的な導入手順を説明します。
Komodoのインストール
Komodoはdocker composeで簡単にインストールできます。
まず、設定ファイルをダウンロードするディレクトリを作成します。
mkdir -p komodo && cd komodo
次に、docker-compose.ymlと環境変数ファイルをダウンロードします。
wget https://raw.githubusercontent.com/moghtech/komodo/main/compose/mongo.compose.yaml
wget https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env
mongo.compose.yamlをdocker-compose.ymlに変更し、私は以下のように修正しています
################################
# 🦎 KOMODO COMPOSE - MONGO 🦎 #
################################
## This compose file will deploy:
## 1. MongoDB
## 2. Komodo Core
## 3. Komodo Periphery
services:
mongo:
image: mongo
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
command: --quiet --wiredTigerCacheSizeGB 0.25
restart: unless-stopped
# ports:
# - 27017:27017
volumes:
- mongo-data:/data/db
- mongo-config:/data/configdb
environment:
MONGO_INITDB_ROOT_USERNAME: ${KOMODO_DB_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${KOMODO_DB_PASSWORD}
core:
image: ghcr.io/moghtech/komodo-core:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
depends_on:
- mongo
ports:
- 9120:9120
env_file: ./.env
environment:
KOMODO_DATABASE_ADDRESS: mongo:27017
KOMODO_DATABASE_USERNAME: ${KOMODO_DB_USERNAME}
KOMODO_DATABASE_PASSWORD: ${KOMODO_DB_PASSWORD}
volumes:
## Store dated backups of the database - https://komo.do/docs/setup/backup
- ${COMPOSE_KOMODO_BACKUPS_PATH}:/backups
## Store sync files on server
# /sync:/sync
## Optionally mount a custom core.config.toml
# - ./config.toml:/config/config.toml
## Allows for systemd Periphery connection at
## "https://host.docker.internal:8120"
# extra_hosts:
# - host.docker.internal:host-gateway
## Deploy Periphery container using this block,
## or deploy the Periphery binary with systemd using
## https://github.com/moghtech/komodo/tree/main/scripts
periphery:
image: ghcr.io/moghtech/komodo-periphery:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
env_file: ./.env
volumes:
## Mount external docker socket
- /var/run/docker.sock:/var/run/docker.sock
## Allow Periphery to see processes outside of container
- /proc:/proc
## Specify the Periphery agent root directory.
## Must be the same inside and outside the container,
## or docker will get confused. See https://github.com/moghtech/komodo/discussions/180.
## Default: /etc/komodo.
- ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}:${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}
volumes:
# Mongo
mongo-data:
mongo-config:
ダウンロードしたcompose.envを.envにrenameして、必要な設定を変更します。
最低限、以下の項目を変更することをお勧めします。
-
KOMODO_DB_PASSWORD: データベースのパスワード -
KOMODO_PASSKEY: CoreとPeriphery間の認証用パスキー -
KOMODO_WEBHOOK_SECRET: Webhook認証用シークレット -
KOMODO_JWT_SECRET: JWT生成用シークレット -
KOMODO_INIT_ADMIN_PASSWORD: 初期管理者パスワード(デフォルト:changeme) -
PERIPHERY_ROOT_DIRECTORY=/etc/komodo: 管理対象のcompose.yamlの置き場所
Komodoの起動
設定が完了したら、Komodoを起動します。
docker compose up -d
起動状態を確認します。
Komodoにアクセス
ブラウザで以下のURLにアクセスします。
http://your-server:9120
初回アクセス時には、管理者アカウントのセットアップ画面が表示されます。
ユーザー名とパスワードを設定してアカウントを作成してください。
既存のdocker-compose.ymlを登録
Komodoにログイン後、以下の手順で既存のdocker-compose.ymlを登録します。
ここで注意が必要なのは、実際のサーバー上のパスではなく、Komodoのperipheryコンテナ内から見たパスを指定する必要がある点です。
前述のdocker-compose.ymlでは、$PERIPHERY_ROOT_DIRECTORYが/etc/komodoに設定されているため、ホスト上の/etc/komodoがコンテナ上でも同じディレクトリとしてマウントされています。よって、ホスト上の/etc/komodo/stacks/nginx/docker-compose.ymlを同じパスで登録できます。
もし、ホスト上の他のディレクトリにあるdocker-compose.ymlを登録したい場合は、.env内のPERIPHERY_ROOT_DIRECTORYの設定を変更してコンテナを再起動してください。
以下は/etc/komodo/stacks/nginx/docker-compose.ymlを登録する場合の手順です。
- 左メニューから「Stacks」を選択
- 「New Stack」ボタンをクリック
- Stack名を入力
- 「Select Server」で
Localを選択 - 「Choose Mode」で
File On Serverを選択
- 「Run Directory」にdocker-compose.ymlがあるディレクトリを入力。未入力の場合は
${PERIPHERY_ROOT_DIRECTORY}/stacks/スタック名が指定されます。今回は/etc/komodo/stacks/nginxなので空で大丈夫です。 - 「File Paths」にdocker-compose.ymlと入力。compose.yamlの場合は空でよいですが、今回はファイル名が異なるため明示的に指定します。
- 「Save」をクリック
これで、ファイルシステム上のdocker-compose.ymlが直接管理されるようになります。
Stackの操作
登録したStackは以下の操作が可能です。
- Start: コンテナを起動
- Stop: コンテナを停止
- Restart: コンテナを再起動
- Deploy: docker-compose.ymlの変更を反映して再デプロイ
- Logs: コンテナのログを確認
- また、スタックの配下の各コンテナを指定し、Terminalでシェルアクセスすることも可能です。
VS Codeでdocker-compose.ymlを編集した後、Komodoの画面から「Deploy」を実行することで変更が反映されます。
リモートサーバーの追加
Komodoでは、複数のサーバーを一元管理できます。リモートサーバーを管理対象に追加する手順を説明します。
リモートサーバーにKomodo Peripheryをインストール
Komodo Peripheryは、リモートサーバー上でKomodo Coreと通信するためのエージェントです。以下の手順でインストールします。
リモートサーバーでdocker composeを使ってPeripheryを起動します。
docker-compose.ymlファイルを作成します。
###################################
# 🦎 KOMODO COMPOSE - PERIPHERY 🦎 #
####################################
## This compose file will deploy:
## 1. Komodo Periphery
services:
periphery:
image: ghcr.io/moghtech/komodo-periphery:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
## https://komo.do/docs/connect-servers#configuration
environment:
PERIPHERY_ROOT_DIRECTORY: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}
## Pass the same passkey as used by the Komodo Core connecting to this Periphery agent.
PERIPHERY_PASSKEYS: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
## Make server run over https
PERIPHERY_SSL_ENABLED: true
## Specify whether to disable the terminals feature
## and disallow remote shell access (inside the Periphery container).
PERIPHERY_DISABLE_TERMINALS: false
## If the disk size is overreporting, can use one of these to
## whitelist / blacklist the disks to filter them, whichever is easier.
## Accepts comma separated list of paths.
## Usually whitelisting just /etc/hostname gives correct size for single root disk.
PERIPHERY_INCLUDE_DISK_MOUNTS: /etc/hostname
# PERIPHERY_EXCLUDE_DISK_MOUNTS: /snap,/etc/repos
volumes:
## Mount external docker socket
- /var/run/docker.sock:/var/run/docker.sock
## Allow Periphery to see processes outside of container
- /proc:/proc
## Specify the Periphery agent root directory.
## Must be the same inside and outside the container,
## or docker will get confused. See https://github.com/moghtech/komodo/discussions/180.
- /home/stacks:/etc/komodo/stacks
## Default: /etc/komodo.
- ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}:${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}
## If periphery is being run remote from the core server, ports need to be exposed
ports:
- 8120:8120
## If you want to use a custom periphery config file, use command to pass it to periphery.
# command: periphery --config-path ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/periphery.config.toml
PERIPHERY_PASSKEYSには、Komodo Core側で設定したKOMODO_PASSKEYを指定します。
PERIPHERY_ROOT_DIRECTORYは、管理対象のdocker-compose.ymlが置かれるディレクトリを指定します。
ファイルを作成したら、以下のコマンドでPeripheryを起動します。
docker compose up -d
Komodoにリモートサーバーを登録
- Komodoの画面で左メニューから「Servers」を選択
- 「New Server」ボタンをクリック
- サーバー名を入力
- AddressにリモートサーバーのURLを入力(https://your-remote-server:8120)
- 「Save」をクリック
接続に成功すると、リモートサーバーがServers一覧に表示されます。
リモートサーバー上でStackを作成
リモートサーバーを追加した後は、通常のStackと同様に以下の手順で作成できます。
- 「Stacks」から「New Stack」を選択
- Serverでリモートサーバーを選択
- Stack名とdocker-compose.ymlの情報を入力
- 「Save」をクリック
これで、リモートサーバー上のコンテナもKomodoから一元管理できるようになります。
まとめ
PortainerからKomodoに移行することで、以下のメリットが得られました。
- docker-compose.ymlをVS Codeで直接編集可能
- Gitでのバージョン管理がスムーズ
- 複数サーバーにまたがるコンテナを一元管理
docker-compose.ymlをコードとして管理したい方や、複数サーバーのコンテナを一元管理したい方には、Komodoをお勧めします。
Discussion