Portainer

複数環境でDockerを動かすことが多くなり、ログの監視に毎回、docker logs <containername> -fと打ち込むのが面倒になってきたので、GUI管理画面を探したところPortainerというサービスを見つけた。

www.portainer.io

KubernetesSwarmも管理できるが、まだそれらのツールには手を出していないため今回はDockerだけに絞って導入のメモをしたいと思う。

必要環境

  • Docker
  • Web Browser

インストール

Portainerはコンテナ管理サービスなだけあって、既に公式がコンテナイメージを用意してくれている。 したがって、Dockerさえ動けばLinuxでもWSLでもVMでもどこでもインストールできる。

コマンドラインから起動しても良いが、ボリュームのマウント等で長くなるのでdocker-compose.ymlを用意した。

version: "3.4"

services:
  portainer:
    image: portainer/portainer-ce
    container_name: portainer
    ports:
      - 9000:9000
    restart: always
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: volume
        source: portainer
        target: /data

volumes:
  portainer:
    name: portainer_data
$ docker-compose up -d

portrainerという名前のコンテナが起動して9000番でリッスンしている。 これはhttp用のポートなので、https接続したい時は9443番を使う。

Windowsの場合

Windowsの場合、「/var/run/docker.sockがない」と怒られるので、.envファイルを用意して次を記入する。

COMPOSE_CONVERT_WINDOWS_PATHS=1

ブラウザーhttp://localhost:9000を見に行けばOK。

リモートのDockerと繋ぐ

リモートのDocker(以降、リモートDocker)と繋ぐには、リモートDockerのデーモンをtcpでリッスンさせておく必要がある。serviceファイルを編集して対応する。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H tcp://127.0.0.1:2376 -H fd:// --containerd=/run/containerd/containerd.sock # ここ
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

これで2376ポートでリッスンするのでPortainerのサイドバーのEnvironmentから追加する。 インターネットを介すときはTLSを施しておかないと危ない気がする。 私は面倒なのでsshのポートフォワーディングで対処してる。

$ ssh -l <username> <hostname> -fNL localhost:2376:<hostname>:2376