私は Digital Ocean にサーバーを持っており、これを使用して複数の Docker コンテナーをデプロイし、リバース プロキシを使用して Nginx でそれらをホストしています。
私のサーバーには 2 つのドメインがリンクされています (単一のパブリック IP)。domain1.com と domain2.com という名前を付けます。
現在、Docker 上で 2 つのサービスが実行されています。Postgres (ポート 5432) と MySQL (ポート 3306) です。
リバース プロキシを設定して、domain1.com を localhost:5432 に、domain2.com を localhost:3306 に変換します。
server {
listen 80;
server_name domain1.com;
location / {
proxy_pass http://localhost:5432;
}
}
server {
listen 80;
server_name domain2.com;
location / {
proxy_pass http://localhost:3306;
}
}
ここで気になるのは、domain1.com:3306 にアクセスしようとすると、望まない接続が機能することです。各ドメインには、割り当てられたサービスからのみアクセスできるようにしたいのです。
たとえば、外部から domain1.com:5432 への telnet は機能しますが、domain2.com:3306 への telnet は機能しません。
誰か助けてくれませんか?
答え1
あなたはあなたのマイスクインスタンスはローカル (コンテナ ホスト) のみでリッスンするように設定されるため、エンド ユーザーは外部からアクセスできず、nginx とその他のローカル プロセスのみがアクセスできるようになります。
そのためには、正しい設定でイメージを再構築するだけです。マイ.cnf:
FROM mysql
COPY custom.cnf /etc/mysql/my.cnf
または、イメージを再構築せずに(実行前に)次のようにします。
docker run -v <path_to_custom.cnf>:/etc/mysql/conf.d
どこマイ.cnf次の設定が含まれている必要があります:
bind-address=<host_ip>
同じことがポストグレ。
編集1: 前回のコメント以降:
server{
listen 3306;
server_name domain2.com;
return 403;
}
逆に、トラフィックをブロックすることもできますnginxレベルですが、トラフィックを完全にブロックしてカーネルで処理されないようにしたい場合、例えばtelnetが接続拒否を表示するようにするには、レイヤー3とiptables。