Dockerネットワークではなくホストネットワークを使用してアプリを再構築するにはどうすればよいですか?

こんにちは、

Web UI を介してアップグレードを実行すると、Discourse が以下を実行するように指示することがあります。

cd /var/discourse
git pull
./launcher rebuild app

rebuild プロセスは GitHub に複数回接続しますが、私のサーバーがホストされている中国では GitHub が部分的にブロックされているため、GitHub へのアクセスを改善するために HTTP/HTTPS プロキシを設定する必要があります。プロキシなしとプロキシありでの YouTube へのアクセスを比較した結果は以下の通りです。

root@iosre:/var/discourse# wget https://youtube.com
--2021-06-10 23:55:05--  https://youtube.com/
Resolving youtube.com (youtube.com)... 66.220.152.17, 2001::3d6f:fadc
Connecting to youtube.com (youtube.com)|66.220.152.17|:443... ^C
root@iosre:/var/discourse# export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
root@iosre:/var/discourse# wget https://youtube.com
--2021-06-10 23:56:12--  https://youtube.com/
Connecting to 127.0.0.1:7890... connected.
Proxy request sent, awaiting response... 301 Moved Permanently
Location: https://www.youtube.com/ [following]
--2021-06-10 23:56:13--  https://www.youtube.com/
Connecting to 127.0.0.1:7890... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’

index.html [  <=  ] 510.58K   813KB/s    in 0.6s    

2021-06-10 23:56:14 (813 KB/s) - ‘index.html’ saved [522830]

しかし、./launcher rebuild image を実行すると、スクリプトはアプリに入り、Docker 内ですべての操作を実行します。Docker 内のネットワーク環境はプロキシされたホストとは異なるため、YouTube にアクセスできず、rebuild はほとんどの場合失敗します。

root@iosre:/var/discourse# ./launcher enter app
root@iosre-app:/var/www/discourse# wget https://youtube.com
--2021-06-10 15:59:57--  https://youtube.com/
Resolving youtube.com (youtube.com)... 69.171.248.128, 2001::d238:33c1
Connecting to youtube.com (youtube.com)|69.171.248.128|:443... ^C
root@iosre-app:/var/www/discourse# export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
root@iosre-app:/var/www/discourse# wget https://youtube.com
--2021-06-10 16:00:10--  https://youtube.com/
Connecting to 127.0.0.1:7890... failed: Connection refused.

質問ですが、特に ./launcher rebuild app において、Docker 内でホストのプロキシを利用するにはどうすればよいでしょうか?

「いいね!」 2

もしかすると、Replace rubygems.org with taobao mirror to resolve network error in China をご覧ください。

また、中国向けのテンプレートも含まれています。templates フォルダで確認できますが、何をしているのかははっきりとはわかりません。

(あまり良い回答ではありませんが、2 日経っても回答がないようなので。)

「いいね!」 4

Jay さん、ありがとうございます!中国向けテンプレートは、taobao/アリババがホストする gems.ruby-china.com を用いて rubygems.org をミラーリングしています。

このアイデアに触発され、github.com を国内のサイト(できればアリババがホストするもの)でミラーリングしてみたいと思います。

「いいね!」 3

@snakeninny さん、質問の意図を正しく理解できていれば、以下のようなコマンドが必要かもしれません:

/var/discourse/launcher rebuild app --docker-args --net=host --skip-mac-address

この場合、おそらく app.yml の expose セクションを修正する必要があります(実際にコンテナがどのポートでリッスンしているかを確認するには、netstat -ltupen を実行してください)。

「いいね!」 2

イワン、ありがとう!これを試したのですが、app.yml の expose セクションを修正していません。どのように設定すればよいでしょうか?

「いいね!」 1

テキストエディタで app.yml を開き、「expose」を探してください。

「いいね!」 1

app.yml の expose セクションには以下が表示されます:

expose:
  - "30080:80"   # ホストのポート 80 をコンテナのポート 80 (http) に転送
  - "2222:22" # ホストのポート 2222 をコンテナのポート 22 (ssh) に転送

ホストのポート 443 (https) をコンテナのポートに転送する必要がありますか?どのコンテナのポートに転送すべきでしょうか?

「いいね!」 1

以前は動作していませんでしたか?リバースプロキシが HTTPS 処理を行っていると思われます。

「いいね!」 1

いいえ、そうではありません。前述の通り、ホストでは YouTube にアクセスできますが、Docker 内ではできません。

「いいね!」 1

設定が少し複雑すぎて、問題の原因を特定するのが難しいですね。まずはリバースプロキシを使わずにセットアップすることをお勧めします。その後、以下のガイドを参考にしてください。

既存の Apache サイトがあるサーバーに Discourse を設定する方法
または
Discourse と同じマシンで他のウェブサイトを動かす

「いいね!」 2

@snakeninny さん、遅くなり申し訳ありません。

expose セクションで 30080:80 という設定をされているとのことですので、Nginx や Apache などでプロキシリクエストを設定するだけで大丈夫です。

以下は、私の Nginx 設定の例です(私は 30080 ではなく 2080 を使用しています)。

/etc/nginx/sites-available/00-default-ssl.conf

server {
...

        location / {
                # これは Docker を通常(ブリッジモード)で実行する際に Nginx で使用されます
                proxy_pass      http://example.com:2080/;
                
                # Docker ネットワークがホストモード(--net=host)の場合に使用される 2 行
                #proxy_pass      http://example.com:3000/;
                #proxy_redirect  http://example.com:2080/ https://example.com;

                proxy_read_timeout 90;
                proxy_http_version 1.1;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;

                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;

                error_page 502 =502 /errorpages/discourse_offline.html;
                proxy_intercept_errors on;

    # 特定の IP からのリクエストをアクセスログから除外する場合があります
    if ( $remote_addr = "x.x.x.x" )
    {
        access_log off;
    }
        }

location /errorpages/ {
    alias /var/www/errorpages/;
}
}

コンテナをホストモード(--net=host)で実行する場合は、プロキシ設定を 3000 ポートを使用するように切り替え、リダイレクト(上記の例のようにおそらく https)を設定することを検討してください。

「いいね!」 2