Docker가 때때로 github.com에 연결하지 못합니다

./launcher rebuild app 명령으로 Discourse를 업그레이드하려는 도중 문제가 발생했습니다.

fatal: unable to access 'https://github.com/discourse/REPO.git/': Failed to connect to github.com port 443: Connection timed out

그러나 문제는 다음과 같습니다. 때로는 discourse 자체에서도 이 오류가 발생합니다. 하지만 변경 사항 없이 즉시 다시 시도하면 성공할 수도 있지만, 그 경우 플러그인 중 하나에서 실패할 수 있습니다. 모든 플러그인을 제거하면 discourse 연결이 실패하거나, 성공하여 전체 빌드가 완료되기도 합니다.

다음과 같은 답변을 확인했습니다.

하지만 컨테이너 네트워크를 어떻게 디버깅해야 하는지 알지 못합니다.

링크하신 스레드에 명시된 문제와 정확히 일치하지는 않는 것 같고, 실제로는 간헐적으로 발생하는 문제인 것으로 보입니다. 간헐적 문제는 진단하기가 가장 어렵습니다. 하지만 수동으로 fetch를 시도해 볼 수 있습니다. 저는 다음과 같이 해 보았는데, 이는 무해한 작업입니다:

# cd /var/discourse/
# ./launcher enter app
x86_64 arch detected.
# wget -O - -v https://github.com/discourse/logster.git/ |wc
--2023-01-04 15:30:25--  https://github.com/discourse/logster.git/
Resolving github.com (github.com)... 140.82.121.4
Connecting to github.com (github.com)|140.82.121.4|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://github.com/discourse/logster/ [following]
--2023-01-04 15:30:25--  https://github.com/discourse/logster/
Reusing existing connection to github.com:443.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘STDOUT’

-                                                  [ <=>                                                                                                 ] 231.22K  --.-KB/s    in 0.06s   

2023-01-04 15:30:26 (3.99 MB/s) - written to stdout [236767]

   2751   15860  236767
#

"github.com"이 합리적인 IP 주소로 해석되었고, 연결이 이루어져 데이터를 반환한 것을 확인할 수 있습니다. 실제로 컨테이너 내부에서 실행된 명령어는 컨테이너 외부에서 실행될 때와 매우 유사하게 동작했으며, 이는 예상된 결과입니다.

잘 알려진 호스팅 업체에서 지원되는 설치 방법을 사용하고 계신가요?

첫 번째 시도는

Connecting to github.com (github.com)|140.82.121.4|:443... failed: Connection timed out.
Retrying.

기본 설치 방법

‘잘 알려진’을 어떻게 정의하느냐에 따라 다르지만, 꽤 큰 업체입니다

OK, 적어도 합리적인 IP 주소를 시도하고 있긴 합니다. 라우팅, 방화벽, 또는 호스팅 회사 레벨에서 문제가 있는 것 같습니다.

컨테이너 외부에서 테스트를 다시 실행하면 컨테이너에 특화된 문제인지, 아니면 더 일반적인 Linux 문제인지 확인할 수 있습니다.

컨테이너에 특화된 문제입니다. 컨테이너를 수정한 적이 없고 사이트도 약 1.5년 된 것인데, 무엇이 이런 문제를 일으켰을지 이해하기가 어렵습니다.

음, 그러니까 컨테이너 밖에서는 해당 테스트를 안정적으로 실행할 수 있나요?

혹시 앱의 app.yml 파일을 비공개 처리한 버전으로 공유해 주실 수 있을까요? (무슨 문제가 일어나고 있는지 전혀 감이 오지 않지만, 누군가가 뭔가 알아챌 수도 있을 것 같습니다.)

현재 설치된 버전은 언제 설치된 것인가요? 대시보드 기준으로 어떤 버전이고 어떤 ID를 사용 중인가요?

네, 가능합니다.

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Lets Encrypt(https)를 추가하려면 아래 두 줄의 주석을 해제하세요
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"
  db_shared_buffers: "128MB"
  #db_work_mem: "40MB"
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en
  UNICORN_WORKERS: 2
  DISCOURSE_HOSTNAME: domain.example.com

  #DOCKER_USE_HOSTNAME: true

  DISCOURSE_DEVELOPER_EMAILS: 'some@emails.com'

  DISCOURSE_SMTP_ADDRESS: smtp.domain.com
  DISCOURSE_SMTP_PORT: port
  DISCOURSE_SMTP_USER_NAME: email@email.com
  DISCOURSE_SMTP_PASSWORD: "password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값은 true)
  DISCOURSE_SMTP_DOMAIN: domain.com
  DISCOURSE_NOTIFICATION_EMAIL: email@email.com

  ## Lets Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 받으려면 아래 주석을 해제하세요
  LETSENCRYPT_ACCOUNT_EMAIL: email@email.com

  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Docker 컨테이너는 상태(stateless)를 유지하지 않으며, 모든 데이터는 /shared에 저장됩니다
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 플러그인은 여기에 추가합니다
## 자세한 내용은 https://meta.discourse.org/t/19157 참고
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/discourse-math.git
          - git clone https://github.com/discourse/discourse-reactions.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-cakeday.git
          - git clone https://github.com/discourse/discourse-akismet.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-gamification
          - git clone https://github.com/discourse/discourse-checklist
          - git clone https://github.com/discourse/discourse-footnote
          - git clone https://github.com/discourse/discourse-yearly-review
          - git clone https://github.com/discourse/discourse-encrypt.git

## 빌드 후 실행할 사용자 정의 명령어
run:
  - exec: echo "Beginning of custom commands"
  - exec: echo "End of custom commands"

참고: 플러그인 없이 앱을 빌드해 보았습니다. discourse 자체를 가져오지 못하거나 목록의 3번째 또는 4번째 플러그인을 클론하는 데 실패합니다(즉, 플러그인이 2~3개일 때 3~4번째 시도에야 앱을 빌드할 수 있다는 뜻입니다).

3.0.0.beta15로 업그레이드를 시도하기 직전에는 2.9.0.beta14였습니다. 구체적인 ID는 기억나지 않지만, 마지막으로 업그레이드된 시점은 12월 25~26일 무렵이었습니다.

사용 중인 제공업체에 대해 더 구체적으로 말씀해 주시면 훨씬 도움이 될 것입니다. 네트워크의 복잡성 측면에서 제공업체마다 차이가 매우 큽니다.

이런 상태로 문제를 해결하려고 하면 훨씬 더 오래 걸릴 가능성이 높습니다.

정보를 제한하려는 의도는 아니었습니다. 해당 회사가 서구 회사가 아니라서 회사 이름만으로는 여러분에게 어떤 정보가 될지 의문이 있었기 때문입니다. 해당 인스턴스는 러시아 최대 호스팅 업체인 reg.ru에서 호스팅되고 있었습니다. 어쨌든 이번에는 그쪽 지원도 도움이 되지 않았습니다(보통은 꽤 괜찮은 편인데). 그래서 제 사이트를 Digital Ocean으로 이전했습니다. 동일한 설정과 Docker 설치에 사용했던 동일한 절차로 진행했는데, 모든 것이 정상적으로 작동했습니다(그리고 현재도 정상적으로 작동하는 것으로 보입니다).