こんにちは、てつです!
今回は前回インストールしたDockerの機能を使って、2つの便利ツールを導入していこうと思います。
前回の記事は下に貼っておきますね。

はじめに
まず、今回導入するツールというのが、PortainerとNginx Proxy Manager になります。
この2つのツールの役割について少し説明しますね。
Portainer とは
簡単にいうと、「Docker専用の、ブラウザで動く超優秀なタスクマネージャー兼コントロールパネル」って感じです。
何をするツールというと、普通はDockerでコンテナを作ったり、消したり、ログを見たりするには、毎回長いLinuxコマンドを打ち込む必要があります。
しかし、Portainerを入れると、ブラウザ上のボタンをポチッとクリックするだけで、コンテナの起動・停止・削除ができるようになります。
感覚的にDockerを操作できるようになるってことですね。
グラフで各コンテナのCPU、メモリとかの使用量が見れるんで結構便利です。
あと、エラーログとかもボタン一つで表示してくれるっぽいです。僕はあんまり使ったことがないので使用感とかは分かりませんが。。。(笑)
Nginx Proxy Manager
一言でいうと、「自宅サーバー内の通信を整理し、正しい案内所へ誘導してくれる、ブラウザで動く優秀な交通整理員」って感じです。
自宅サーバーの中で、WordPressとかファイルサーバーなど複数のツールを動かすと、それぞれ「ポート番号(例::8080 や :9000)」っていう番号が割り当てられます。
アクセスする際に、毎回「http[:]//192.168.1.100:9000」のように数字を入力するのが意外とめんどうだったり、覚えてなかったりするんですよね。
このツールを使うと、名前でアクセスできるようになんですよね。
[http[:]//portainer.local]にアクセスが来たら、裏で動いている9000番のコンテナに繋ぐ」といった設定を、ブラウザの画面から一行入力するだけで自動化してくれます 。
これを「リバースプロキシ」っていいます。
あとは、ボタン一つで通信のSSL化(暗号化)もできるっぽいので今回試してみようかなと思います。自分はまだこの機能を使ったことがなかったので。
説明はいったんこの程度にしてきます。
要は、サーバーで起きていること視覚化してくれるツールを導入して管理体制を盤石にしようって感じです。
では次章から早速導入手順を説明していきます。
※文中の一部リンクにマスク処理をしております。
構築の流れ
今夏の構築流れはこんな感じです。
1. ルートディレクトリとなる server-ops を作成し、中に入る
2. 秘密情報をGitの管理から外す .gitignore を作成する
3. すべてのパスワードや変数を集約する .env ファイルを作成する
4. .env の変数を読み込む形で docker-compose.yml を作成する
5. コマンド一発で安全に一括起動する
今回のディレクトリの構成は以下のようにしようと思ってます。
server-ops/
├── .gitignore
├── .env
├── docker-compose.yml
└── docker-manager/
└── (将来、管理ツールの個別設定を置く場所)
それぞれの説明を少ししていきますね。
.gitignore:GitHubで管理するので、パスワードの塊である .env と、ツールが自動生成する生データ(npm_data/ など)をGitの追跡から完全に除外します。
.env:環境変数をここで一元管理する。参照するファイルを一個にしておく絞って、.gitignoreでの除外漏れを防ぐ。
docker-compose.yml :ルートに1個だけ配置する、全体のインフラの司令塔です。.env から変数を安全に読み込みます。
それぞれのツールごとに設定ファイルをおき、.envファイルを各階層に配置する案もあったのですが、以下のデメリットを鑑みてやめました。
1. パスワードの一括管理・変更が難しくなる
将来的に「セキュリティ向上のために共通のパスワードを定期変更しよう」となった際、すべてのフォルダを開いてそれぞれの .env を書き換える必要があり、修正漏れやミスの原因になります。
2. コンテナ間で「同じ値」を共有できなくなる
例えば、将来ファイルサーバーを追加して「データベース(MySQLなど)」を複数のツールで共有したくなった場合、DBのパスワードをそれぞれの .env に重複して書く必要が出てきます。値が同期ズレを起こすとシステムが動かなくなります。
3. .gitignore の設定漏れによる流出リスクが上がる
フォルダが増えるたびに、その中の .env がGitの監視対象から外れているかを気にする必要があります。ルートに1つだけであれば、ルートの .gitignore で一発で確実にガードできます。
ここまでで前提の説明は終わったので、そろそろ実際に導入していきます(笑)
導入編
作業ディレクトリの作成
まずホームディレクトリから今回サーバー管理ツールたちのディレクトリを作るところからやっていきます。
下記コマンドを実行して作業ディレクトリを作ります。
mkdir -p ~/server-ops/docker-manager
作れたら作業ディレクトリに移動します。
cd ~/server-ops
.gitignoreの作成
次に .gitignoreを作っていきましょう。
nano .gitignore
これでnanoエディタは開けので、下記の文言をコピペします。
# 秘密情報をGitに含めない
.env
# 各コンテナの実データ保存用フォルダ
npm_data/
npm_letsencrypt/
コピペ出来たら、Ctrl + O → Enter → Ctrl + Xで保存しましょう。
ここまで大丈夫ですかね?VS Codeなどのエディタを使ってる方はこの方法じゃなくてもできるのでお使いのエディタでやりやすい方法で編集するのがいいと思います。
nanoエディタは簡易的な書き込みとか修正はやりやすいんですけど、他のファイルと横断しながらの編集には向いてないのでケースバイケースでお使いください。
.envの作成
それでは .envファイルの編集に移りましょう。さきほどと同様に今回はnanoエディタで書き込みをします。
下記コマンドを実行します。
nano .env
そしたら、Nginx Proxy Managerで使うキーを保存します。僕はこんな感じです。
# --- Nginx Proxy Manager 設定 ---
NPM_ENCRYPTION_KEY=※ここはランダムな文字列
さっきの手順で保存します。
docker-composeの作成
最後に核となる設計図の作成に移ります。
例のごとく下記コマンドを実行しファイルの編集をします。(ここはnanoエディタでやりづらい人も多いと思います。)
nano docker-compose.yml
ファイルを編集していきます。
version: '3.8'
services:
# --- ① Portainer (Docker管理ツール) ---
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
# 指定のサブフォルダ(docker-manager)も、将来の設定用にマウント可能にしています
- ./docker-manager:/etc/portainer-config
# --- ② Nginx Proxy Manager (交通整理・リバースプロキシ) ---
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: always
ports:
- '80:80'
- '443:443'
- '81:81'
environment:
- DISABLE_HSTS_HEADER=0
#ルートの .env から秘密の鍵を安全に読み込む
- JWT_SECRET=${NPM_ENCRYPTION_KEY}
volumes:
# ルート配下にデータを保存する設定
- ./npm_data:/data
- ./npm_letsencrypt:/etc/letsencrypt
volumes:
portainer_data:
できましたか?ここまで来たら実際に立ち上げてみましょう。下記コマンドを実行します。
sudo docker compose up -d
下の画像みたいになっていれば成功です!

ブラウザで管理画面を開く
ここまでお疲れ様です。ここからは実際にブラウザを見れるかやっていきます。
自分のサーバーのIPアドレスと開いたポート番号をブラウザで打って開いてみます。
例:http://192.169.11.1:9000など
まずは、portainerの方を見ていきましょう、
上述したような感じでブラウザで検索するとアカウント作成画面が出ると思うので、ユーザーとPWを決めてログインしましょう。
そうすると以下のような画面になると思います。

クジラのマークのところをクリックして、Containersを押すと今動いてるコンテナの状態が見れます。
なんか壮観ですね。監視してるって感じがしますね。


次は、Nginx Proxy Managerの方を見ていきましょう。
さっきと同じようにブラウザで検索するとアカウント作成画面が出るので、任意のユーザー名とかで作ってみてください。そうすると下記のような画面に遷移すると思います。

今はまだ 0 Proxy Hosts となっていますが、ここを設定すると以下のような運用が可能になります。
ート番号からの解放: 「IPアドレス:9000」と打つ代わりに、「portainer.local」のような分かりやすい名前でアクセスできるようになります。
SSL証明書の自動管理(Let’s Encrypt): もし将来的にドメインを取得して外部公開(VPN越しではなく)する場合、ボタン一つで「https://」の暗号化設定を自動で行い、更新までやってくれます。
アクセス制限(Access Lists): 特定のコンテナに対して「IDとパスワードを知っている人だけ」という二重の壁を、プログラムを一切いじらずにこの画面から追加できます。
少し設定の方も解説させていただきますね。
Nginx Proxy Manager(NPM)設定手順
僕のPCの環境で行った実際の手順は以下の通りになります。
1 .Windows側の C:\Windows\System32\drivers\etc\hosts をメモ帳(管理者実行)で開く。
2. サーバーのIPアドレス portainer.local と追記して保存。
例:192.168.11.1 portainer.local
3. NPMの画面で「Proxy Hosts」→「Add Proxy Host」を選び、Domain Namesに portainer.local、Forward IPに 172.18.0.x(PortainerのIP)を入力。
※Forward IPの探し方: Portainerのコンテナ一覧画面に戻り、portainer コンテナの IP Address 列を見てください。そこにある数字(おそらく 172.18.0.x)をここに入力します
ここまでできれば、自宅サーバー内で下記のような連携環境が構築されたことになります!
1.名前解決 (Naming): Windows の hosts ファイルが「名前」と「サーバーIP」を紐づける。
2.リバースプロキシ (Proxying): サーバーの玄関口(NPM)が、「名前」を見て適切なコンテナ(Portainer等)へ通信を仕分けする。
3.コンテナ管理 (Orchestration): Docker がアプリケーションを隔離された環境で安定稼働させる。
また、新しいツールを入れたい時は以下の手順でやれば大丈夫です!
docker-compose.ymlに設定を追記してup -d。- NPM で新しい
Proxy Host(例:samba-config.local)を作る。 - Windows の
hostsに名前を追記。
セキュリティを固めたい時は、NPM の設定画面で 「Access List」 を作れば、特定の名前(例: npm.local)にだけ、さらに別のパスワードをかけることもできます。
最後に
ここまでお付き合いいただきありがとうございました!
Docker Composeを使って、便利ツールを二つ導入する様子をお届けしました。これで、コンテナ状態を監視できるようなり、通信のセキュリティ面もだんだんと改善されてきたと思います。
また、新しいツールを導入する体制を確立できたことも大きな前進であると思ってます!
これからもこの環境を使っていろいろなことやっていく所存です!
今回はここらへんで終わりにしたいと思います!
ご精読ありがとうございました!

コメント