5分で完了:コンテナを「不可視」にする方法
複雑なネットワーク設定なしで、コンテナをVPN経由で通信させたい場合、Gluetunが最適な選択肢です。これは、アプリケーションを包み込むサイドカーコンテナとして機能します。以下は、SurfsharkやProtonVPN(Wireguard対応で200〜300Mbpsの高速通信が可能)で私がよく使用しているdocker-composeのテンプレートです。
version: "3"
services:
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
environment:
- VPN_SERVICE_PROVIDER=surfshark
- VPN_TYPE=wireguard
- WIREGUARD_PRIVATE_KEY=YOUR_PRIVATE_KEY
- SERVER_COUNTRIES=Vietnam
restart: always
my-app:
image: alpine
container_name: my-app
network_mode: "service:gluetun" # ここが重要なポイントです
command: sh -c "apk add curl && sleep 3600"
depends_on:
- gluetun
docker compose up -dコマンドを実行した後、以下のコマンドでIPを確認して結果をチェックしてください。
docker exec my-app curl ifconfig.me
自宅のプロバイダー(ViettelやFPTなど)のIPではなく、別のIPが表示されれば「匿名化」は成功です。
なぜOSにVPNをインストールするよりもGluetunの方が実用的なのか?
通常、VPSでVPNを有効にすると、すべてのトラフィックがトンネルを通過するため、速度が制限されます。これは、高速なレスポンスが必要なNginxやデータベースを運用している場合には非常に不便です。Gluetunはこの問題をスマートに解決します.TorrentクライアントやWebスクレイパーのような「機密性」が必要なものだけをVPN経由にし、それ以外は通常通りのネットワークで高速に動作させることができます。
ネットワークスタックの共有メカニズム
Gluetunは、コンテナ内にセキュアなトンネルを作成します。Dockerのnetwork_mode機能を利用することで、他のコンテナがGluetun’のネットワークシステムに「乗り移る」ことができます。このとき、アプリケーションコンテナは独自のIPを持たず、VPNプロバイダーのすべてのネットワーク設定を共有します。
アプリケーションからのすべてのリクエストは、確立されたトンネルを強制的に通過します。もしトンネルが切断された場合、トラフィックも即座に停止するため、非常に安全です。
環境変数に関する注意点
初心者が陥りやすいミスは、プロバイダー名の指定間違いです。GluetunはMullvad、NordVPNからProtonVPNまで幅広くサポートしていますが、プロバイダーごとに設定項目が異なります。
- VPN_SERVICE_PROVIDER: プロバイダー名を小文字で指定(例:mullvad)。
- VPN_TYPE:
openvpnよりも約30%軽量で高速なwireguardを推奨します。 - WIREGUARD_PRIVATE_KEY: 提供された.confファイルから取得します。
よくある失敗は、長いキーをYAMLファイルにコピー&ペーストする際に、余計な空白が入ったりインデントが崩れたりすることです。**設定ファイルを確実なものにするために、私はよくJSON/YAMLをtoolcraft.app/ja/tools/developer/json-formatterに貼り付けて整形し直しています。括弧を一つずつ手動で確認する手間が省けます。**
高度な設定:Web UIにアクセスできない問題の修正
初めてGluetunを使う人の約90%が、「アプリは起動しているのに、ブラウザでIP:ポートを入力しても何も表示されないのはなぜ?」という疑問を持ちます。
ポートマッピングの逆転ルール
アプリケーションコンテナがネットワークをGluetunに「貸し出して」いるため、外部に公開したいすべてのポート(qBittorrentの8080ポートなど)は、gluetunサービス側で宣言する**必要があります**。
services:
gluetun:
ports:
- 8080:8080 # アプリのポートはここに配置する必要があります
qbittorrent:
network_mode: "service:gluetun"
ローカルネットワーク(LAN)アクセス
Gluetunのファイアウォールが厳格すぎて、個人のPCからの接続さえブロックされることがあります。UIにアクセスできない場合は、名前解決の競合を避けるためにDOT=offを追加してDNS over TLSを無効にしてみてください。
トンネルの「稼働状況」を監視するには、HTTP_CONTROL_SERVER_ADDRESS: :8000を有効にします。これにより、VPNが正常か停止しているかをチェックするための小さなAPIが提供されます。
実際の運用経験
1. キルスイッチを忘れないこと
この機能はデフォルトで有効になっています。サーバーのメンテナンスやネットワークの遅延でVPN接続が切れた場合、Gluetunは即座にコンテナのインターネット接続を遮断します。これにより、データスクレイピングやTorrentのダウンロード中に実際のIPが漏洩するのを防ぎます。これは非常に重要なリスク回避です。
2. ログを読んで素早くエラーを修正する方法
アプリがネットワークに繋がらないときは、推測するのではなく、すぐに以下のコマンドを実行してください。
docker logs gluetun
auth failedという行が表示されたら、PrivateKeyを再確認してください。no servers foundと出る場合は、選択した国(SERVER_COUNTRIES)にWireguard標準をサポートするサーバーがない可能性が高いです。
3. シンガポールや香港のサーバーを優先する
VPSがベトナムにある場合は、Pingを30-50msに抑えるためにシンガポールのサーバーを選択してください。アメリカやヨーロッパのサーバーを選ぶと、Pingが200msを超え、クローラースクリプトなどの動作が極端に遅くなることがあります。
4. 名前解決エラーを避けるためのDNS最適化
一部のプロバイダーがVPNのDNSをブロックしており、トンネルが確立されていてもping google.comができないことがあります。最も簡単な修正方法は、GluetunにCloudflareのDNSを強制的に使用させることです。
- DOT=off
- DNS_ADDRESS=1.1.1.1
ルーティングの仕組みさえ理解してしまえば、DockerをVPN経由で運用するのは非常に簡単です。スムーズなシステム構築ができることを願っています。もし不明な点があれば、下のコメント欄で質問してください!

