DockerHub 접근이 불가능한 서버에 Discourse 설치하기

@sam Sam, 제 회사 네트워크에서 Docker Hub 접근이 차단되었습니다. 여러 환경에서 Discourse용 Docker를 실행 중이며 업그레이드가 필요합니다. 당연히 실패하네요:

Error response from daemon: Get https://registry-1.docker.io/v2/: http: server gave HTTP response to HTTPS client
Error response from daemon: Get https://registry-1.docker.io/v2/: http: server gave HTTP response to HTTPS client
Unable to find image 'discourse/base:2.0.20230502-0058' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: http: server gave HTTP response to HTTPS client.

제가 업그레이드를 수행하는 가장 쉬운 방법은 해당 네트워크에 속하지 않은 다른 머신을 사용해 최신 discourse base 이미지를 다운로드한 후, 이를 업그레이드 대상 머신으로 가져오는 것 같습니다. 그리고 나서 Discourse나 launcher가 Docker Hub에서 가져오지 않고 로컬에서 찾도록 강제해야 합니다. 이 방법이 가능할 것 같다는 여러 스레드를 봤지만 명확한 가이드는 없었습니다. 어떻게 하면 될까요?

docker save와 docker load가 이를 도와줄 것입니다.

@Falco 저장과 로드를 어떻게 하는지 구체적인 예시 명령어를 알려주실 수 있을까요? 예를 들어, 무엇을 어디에 저장해야 하고, 로드를 위한 전체 명령어는 무엇인지요?

이 게시물의 아이디어를 여러 번 성공적으로 사용해 보았습니다

https://stackoverflow.com/a/26226261

내일 데스크톱에서 더 구체적인 예를 만들어 보겠습니다

@Falco - 정말 감사합니다. 데스크톱 예시를 기대하고 있습니다… '업그레이드’를 넘어서 호스트 사이트(들)를 지워버릴까 봐 걱정되니, 제가 이걸 제대로 이해하고 있는지 확인하고 싶습니다.

저희 회사에는 외부로 이전할 수 없는 특정 정보가 담긴 Discourse 도커 사이트가 있는데, 회사 규정 등으로 인해 외부로 옮길 수 없습니다. 이런 사이트가 4개 있습니다. 이름은 다음과 같습니다: np.falcoisgreat.com, stg.falcoisgreat.com, tst.falcoisgreat.com, www.falcoisgreat.com. 이 사이트들은 모두 약 4개 버전이 뒤처져 있는 상태입니다. 런처가 최신 Docker 기반 이미지를 가져오려고 연결을 시도할 때 더 이상 Docker Hub에 접근할 수 없습니다.

그래서, 인터넷 자유가 보장된 외부 세계(실제 인터넷 환경)에서 최신 Discourse Docker 기반 이미지를 받아오기 위해 새로운 Ubuntu 서버에 Discourse 도커를 띄웠습니다(실제로는 https://discourse1.codeplus.cloud에서). 이제 저는 콘텐츠나 기타什么东西 없이 새로운 이미지만 가져온 뒤, 아마도 docker save로 tar 파일로 압축한 다음, curl이나 sftp를 사용해 np.falcoisgreat.com으로 그 tar 파일을 가져와 docker load를 사용하려는 계획입니다.

이 과정의 구체적인 사항은 아직 잘 모르지만, 직접 시도해 보고 문서를 읽으며 알아볼 것입니다. 다만 제가 걱정하는 것은 'np.falcoisgreat.com’의 현재 콘텐츠와 구성이 지워지는 것입니다. 물론 백업을 할 것이지만, 아무것도 지우지 않는 방법을 아는 것이 저에게는 최선입니다. 이 해결책이 제가 생각한 대로 동작하도록 의도된 것인지 확인해 주실 수 있을까요?

감사합니다!

다음과 같이 설정하세요:

  • server1: 인터넷에 접근할 수 있는 서버

  • server2: DockerHub에 접근할 수 없는 서버

다음 작업을 수행하세요:

ssh root@server1
docker pull discourse/base:2.0.20230502-0058


# server1이 server2에 접근할 수 있는 경우
docker save discourse/base:2.0.20230502-0058 | bzip2 | ssh root@server2 docker load
# 완료될 때까지 기다린 후 server1에서 나옵니다
ssh root@server2
cd /var/discourse
./launcher rebuild app


# server1이 server2에 접근할 수 없는 경우
docker save -o /tmp/discourse-base-image.tar discourse/base:2.0.20230502-0058
# USB 드라이브, FTP, 플로피 디스크 등을 사용하여 파일을 server2로 전송합니다
ssh root@server2
docker load -i /tmp/discourse-base-image.tar 
cd /var/discourse
./launcher rebuild app

정말 멋지네요. 그건 몰랐어요.

그렇다면 유일한 핵심은 discourse/base:2.0.20230502-0058을 어떻게, 그리고 언제 변경해야 하는지를 아는 것입니다.

그리고 저는 그게 단순히 다음과 같은 명령어라고 생각해요.

cd /var/discourse
git pull
DISCOURSE_BASE=$(grep -e ^image= $DISCOURSE_DOCKER_SRC/launcher|cut -d'"' -f2)
docker pull $DISCOURSE_BASE

그리고 save 명령어에 대해서도 마찬가지입니다.

지금까지 잘 진행되고 있습니다. @Falco 감사합니다. 두 환경이 업그레이드되었습니다!