도커 네트워크 대신 호스트 네트워크를 사용하여 앱을 다시 빌드하는 방법은 무엇인가요?

안녕하세요,

웹 UI를 통해 업그레이드를 수행할 때 occasionally 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 내부에서 모든 작업을 수행합니다. 이때 네트워크 환경은 프록시가 설정된 호스트와 다르며, 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 내부에서 호스트의 프록시를 활용할 수 있는 방법이 무엇인지입니다.

아마도 Replace rubygems.org with taobao mirror to resolve network error in China 를 참고해 보실 수 있습니다.

포함할 수 있는 중국용 템플릿도 있습니다. templates 폴더에서 확인하실 수 있습니다. 정확히 어떤 역할을 하는지는 잘 모르겠습니다.

(매우 좋은 답변은 아니지만, 이틀이 지났는데도 아직 답변이 없으시니 참고해 보시기 바랍니다.)

제이, 고마워요! 중국 템플릿은 rubygems.org를 gems.ruby-china.com으로 미러링하며, 이는 타오바오/알리바바에서 호스팅되고 있습니다.

그 아이디어에 영감을 받아, 이번에는 github.com을 국내 호스팅으로 미러링해 보려 합니다. 가능하면 알리바바에서 호스팅되길 바랍니다.

Hi @snakeninny, 질문을 올바르게 이해했다면, 다음과 같은 것이 필요할 수 있습니다:

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

이 경우 app.yml을 수정해야 할 가능성이 높으며, expose 섹션(실제 컨테이너의 리스닝 포트를 찾으려면 netstat -ltupen을 확인하세요)을 확인해 보세요.

Ivan님 감사합니다! 해당 작업을 수행했지만 app.yml의 expose 섹션을 수정하지 않았습니다. 어떻게 수정해야 하나요?

텍스트 편집기로 컨테이너의 app.yml 파일을 열고 "expose"를 찾아보세요.

app.yml의 expose 섹션에서 다음을 볼 수 있습니다:

expose:
  - "30080:80"   # 호스트 포트 80을 컨테이너 포트 80(http)으로 포워딩
  - "2222:22" # 호스트 포트 2222를 컨테이너 포트 22(ssh)으로 포워딩

호스트 포트 443(https)을 컨테이너 포트에 포워딩해야 하나요? 어떤 컨테이너 포트에 포워딩해야 하나요?

이전에는 작동하지 않았나요? 리버스 프록시가 HTTPS 관련 작업을 처리하고 있을 것으로 예상됩니다.

아니요, 그렇지 않았습니다. 제가 설명드린 대로 호스트에서는 YouTube에 접근할 수 있지만, Docker에서는 접근할 수 없습니다.

현재 설정이 너무 복잡해서 문제를 추측하기 어렵습니다. 먼저 리버스 프록시 없이 설정을 완료하는 것을 권장합니다. 그런 다음 기존 Apache 사이트가 있는 서버에 Discourse 설정하기 또는 Discourse와 같은 머신에서 다른 웹사이트 실행하기를 설정하세요.

Hi @snakeninny, 지연된 점 죄송합니다.

expose 섹션에서 설정하신 30080:80에 따라, Nginx/Apache 등에서 프록시 요청만 설정하시면 됩니다.

예를 들어, 제 Nginx 설정은 다음과 같습니다 (30080 대신 2080을 사용):

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

server {
...

        location / {
                # THIS IS USED WITH NGINX WHEN DOCKER IS RUN NORMALLY (BRIDGED MODE)
                proxy_pass      http://example.com:2080/;
                
                # THESE 2 LINES ARE USED IN CASE DOCKER NETWORK IS IN HOST MODE (--net=host)
                #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;

    # YOU MAY EXCLUDE REQUESTS FROM CERTAIN IP FROM ACCESS LOG
    if ( $remote_addr = "x.x.x.x" )
    {
        access_log off;
    }
        }

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

컨테이너를 호스트 모드(--net=host)로 실행할 경우, 리다이렉트(위 예시와 같이 https일 가능성이 높음)를 사용하여 3000 포트를 사용하도록 프록시 설정을 전환하는 것을 고려해야 합니다.