🐳

コンテナ管理ツールを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

https://github.com/louislam/dockge

Dockgeはシンプルで設定も簡単なコンテナ管理ツールです。

特徴:

  • 軽量でセットアップが容易
  • シンプルなUIで分かりやすい

課題:

  • 機能が比較的限定的
  • 高度な監視機能やアクション実行機能は少なめ

シンプルさを重視する場合には良い選択肢です。

Komodo

https://github.com/mbecker20/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に変更し、私は以下のように修正しています

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を登録する場合の手順です。

  1. 左メニューから「Stacks」を選択
  2. 「New Stack」ボタンをクリック
  3. Stack名を入力
    スタック名
  4. 「Select Server」でLocalを選択
  5. 「Choose Mode」でFile On Serverを選択
    Choose Mode
  6. 「Run Directory」にdocker-compose.ymlがあるディレクトリを入力。未入力の場合は${PERIPHERY_ROOT_DIRECTORY}/stacks/スタック名が指定されます。今回は/etc/komodo/stacks/nginxなので空で大丈夫です。
  7. 「File Paths」にdocker-compose.ymlと入力。compose.yamlの場合は空でよいですが、今回はファイル名が異なるため明示的に指定します。
    File Paths
  8. 「Save」をクリック

これで、ファイルシステム上のdocker-compose.ymlが直接管理されるようになります。

Stackの操作

登録したStackは以下の操作が可能です。

  • Start: コンテナを起動
  • Stop: コンテナを停止
  • Restart: コンテナを再起動
  • Deploy: docker-compose.ymlの変更を反映して再デプロイ
  • Logs: コンテナのログを確認
  • また、スタックの配下の各コンテナを指定し、Terminalでシェルアクセスすることも可能です。
    Terminal

VS Codeでdocker-compose.ymlを編集した後、Komodoの画面から「Deploy」を実行することで変更が反映されます。

リモートサーバーの追加

Komodoでは、複数のサーバーを一元管理できます。リモートサーバーを管理対象に追加する手順を説明します。

リモートサーバーにKomodo Peripheryをインストール

Komodo Peripheryは、リモートサーバー上でKomodo Coreと通信するためのエージェントです。以下の手順でインストールします。
リモートサーバーでdocker composeを使ってPeripheryを起動します。

docker-compose.ymlファイルを作成します。

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にリモートサーバーを登録

  1. Komodoの画面で左メニューから「Servers」を選択
  2. 「New Server」ボタンをクリック
  3. サーバー名を入力
    New Server
  4. AddressにリモートサーバーのURLを入力(https://your-remote-server:8120)
    Address
  5. 「Save」をクリック

接続に成功すると、リモートサーバーがServers一覧に表示されます。

リモートサーバー上でStackを作成

リモートサーバーを追加した後は、通常のStackと同様に以下の手順で作成できます。

  1. 「Stacks」から「New Stack」を選択
  2. Serverでリモートサーバーを選択
  3. Stack名とdocker-compose.ymlの情報を入力
  4. 「Save」をクリック

これで、リモートサーバー上のコンテナもKomodoから一元管理できるようになります。

まとめ

PortainerからKomodoに移行することで、以下のメリットが得られました。

  • docker-compose.ymlをVS Codeで直接編集可能
  • Gitでのバージョン管理がスムーズ
  • 複数サーバーにまたがるコンテナを一元管理

docker-compose.ymlをコードとして管理したい方や、複数サーバーのコンテナを一元管理したい方には、Komodoをお勧めします。

Discussion