こんにちは!今日は、Docker Swarmモードを運用する上で最も多く質問される内容の一つである、プライベートレジストリ認証とコンテナセキュリティネットワークについて詳しく掘り下げていきます。設計思想に基づき、単なるコマンドの説明を超えて、「なぜこのように設計されたのか」という洞察を共有します。👨🏫

1. –with-registry-auth、一体君は何者だ? 🤔
Docker Swarmでプライベートレジストリ(例:AWS ECR、Azure ACR、Self-hosted Harborなど)のイメージを使用するには、マネージャーノードでdocker loginを実行します。しかし、実際にデプロイすると、ワーカーノードがイメージを取得できず、「No such image」や「Access Denied」エラーを吐き出すことがあります。
この時、救世主のように登場するオプションが、まさに–with-registry-authです。
⚙️ 動作原理:認証トークンの旅
- マネージャーノード:docker loginによって取得した認証トークンを~/.docker/config.jsonに保存します。
- コマンド実行:ユーザーが–with-registry-authオプションとともにstack deployコマンドを実行します。
- トークン転送:マネージャーノードは、自身の認証情報をSwarm APIを通じて、該当サービスを実行するすべてのワーカーノードに一時的に転送します。
- イメージプル(Pull):ワーカーノードは、転送されたばかりのトークンを持ってレジストリにアクセスし、イメージをダウンロードします。
💡 重要ポイント:
この認証情報はワーカーノードに永続的に保存されません。
セキュリティのために、デプロイ時にのみ「一時的に」転送される揮発性データです。
2. 「毎回打つのが面倒なんだけど、自動化できないの?」 😫
結論から言うと、Dockerの公式設計上、このオプションをグローバルに(デフォルトで)有効にする方法はありません。セキュリティ専門家の視点から見ると、これは非常に妥当な設計です。
🔒 セキュリティ設計思想:明示的な制御
もしこのオプションがデフォルトであれば、どんなサービスがデプロイされるたびに、マネージャーの機密性の高い認証トークンがネットワークを介してすべてのノードにばらまかれることになります。これは最小権限の原則(Principle of Least Privilege)に違反します。特定のデプロイが認証を必要とするかどうかをオペレーターが明示的に決定することで、セキュリティ事故を予防しているのです。
🛠️ 現実的な解決策 (Tip)
毎回入力するストレスから解放されたいなら、Shell Aliasを積極的に活用しましょう。
Bash
# .bashrcまたは.zshrcに登録
alias dsd='docker stack deploy --with-registry-auth'
alias dsu='docker service update --with-registry-auth'
これで、dsd -c docker-compose.yml web の一行で、すべての認証問題が解決します。
3. 内部ネットワークセキュリティの核心:expose vs ports 🌐
Swarm環境でサービスを構成する際、外部公開が不要なDBや内部APIサーバーはどのように設定していますか?ここでexposeの真価が発揮されます。
| 区分 | ports (ポートフォワーディング) | expose (内部のみ) |
|---|---|---|
| アクセス性 | 外部インターネット/ホストからアクセス可能 | 同一Dockerネットワーク内でのみアクセス可能 |
| セキュリティ | 門を大きく開けた状態(危険露出) | 必要な内部協力者にのみ門を開ける |
| 用途 | Webサーバー(Nginx)、外部APIエンドポイント | データベース、Redis、内部マイクロサービス |
セキュリティ強化のため、「外部エントリポイント(Gateway)のみportsを開放し、残りはすべてexposeで隔離する」設計を推奨します。
4. 実践トラブルシューティング:OpenSearchセキュリティ初期化エラーとディスクフル 🚨
最近、OpenSearchをDocker Composeで起動しようとすると、次のようなメッセージが表示されることがあります。
opensearch security not initialized
このエラーは、セキュリティプラグインが有効になっているにもかかわらず、設定を格納する.securityインデックスが作成されていない場合に発生します。環境変数(OPENSEARCH_INITIAL_ADMIN_PASSWORD)を正しく設定しても解決しない場合、犯人はディスク容量(Disk Full)である可能性が高いです。
📉 ディスク容量とOpenSearchの関係
OpenSearch(Elasticsearch系)は、ディスク使用量が95%を超えると、データ保護のためにすべてのインデックスをRead-onlyモードにロックします。
- 問題発生:ディスクが満杯で.securityインデックスの作成に失敗。
- ログ確認:docker compose logsで「No space left on device」または「Disk watermark exceeded」を確認。
- 解決方法:
- docker system prune -aで不要なイメージ/ボリュームを整理。
- docker-compose down -vで破損したボリュームを完全に削除して再起動。
- 十分な空き容量(最低10GB以上推奨)を確保してから再デプロイ。
5. 終わりに:より良いDevOps環境のために 🏗️
Docker Swarmは、Kubernetesに比べて軽量で強力なツールです。しかし、–with-registry-authのようなオプションの意味を正確に理解していないと、運用中に予期せぬ障害(Image Pull Error)に遭遇することがあります。
今日見てきた内容をまとめると、次のようになります。
- –with-registry-authは、認証トークンをワーカーノードに転送するセキュリティ機構である。
- 面倒を解決するには、Alias(エイリアス)を使用しよう。
- exposeを通じて、サービス間の最小限のセキュリティ境界を構築しよう。
- インフラの基本は、リソース管理(ディスク容量)から始まる。
コメントを残す