기업 내부망 Docker pull 타임아웃 해결: DNS, 프록시, 미러 가속 완전 가이드

기업 내부망에서 docker pull nginx를 실행했는데 진행 막대가 멈춘 채 움직이지 않습니다. 10분을 기다리자 터미널에 “connection timeout”이 뜹니다. 동료는 프록시를 설정하라고 하고, 네트워크 담당자는 DNS에는 문제가 없다고 하며, StackOverflow에서는 미러 소스를 바꿔 보라는 답을 봤습니다. 무엇부터 확인해야 할까요?
이 글은 명확한 문제 해결 흐름을 제시합니다. 네트워크 연결성 → DNS 설정 → 프록시 설정 → 방화벽 → 미러 소스 순서입니다. 이 순서대로 보면 대략 5분 안에 문제 위치를 좁힐 수 있습니다.
문제 해결 첫 단계: 먼저 네트워크 연결성 확인하기
설정 파일부터 고치려고 서두르지 마세요. 먼저 내 머신이 Docker Hub에 연결할 수 있는지 확인해야 합니다.
터미널을 열고 다음 명령을 실행합니다.
# 1. 네트워크가 연결되는지 테스트
ping -c 3 registry-1.docker.io
# 2. DNS 해석 확인
nslookup registry-1.docker.io
# 3. 443 포트에 접근 가능한지 테스트
curl -v https://registry-1.docker.io/v2/
ping이 되지 않나요? 그렇다면 문제는 네트워크 계층에 있습니다. 방화벽 차단이나 라우팅 설정 문제가 원인일 수 있습니다. 먼저 네트워크 담당자에게 443 포트가 열려 있는지 확인하세요.
nslookup 해석 시간이 200ms를 넘나요? DNS 설정에 문제가 있습니다. 다음 장에서 수정 방법을 설명합니다.
curl이 401 또는 429를 반환하나요? 네트워크는 연결되지만 Docker Hub 속도 제한에 걸렸을 수 있습니다. 익명 사용자는 6시간마다 100회만 pull할 수 있습니다. 이때는 미러 가속기를 고려해야 합니다.
문제 해결 흐름도:
네트워크 불통 → 네트워크 담당자에게 방화벽/라우팅 확인 요청
DNS 해석 느림 → DNS 설정 수정(다음 장 참고)
연결은 되지만 타임아웃 → 프록시 설정 확인(세 번째 장 참고)
속도 제한 → 미러 가속기 설정(네 번째 장 참고)
제가 겪었던 사례도 있습니다. ping도 되고 nslookup도 정상이었지만 docker pull은 계속 멈췄습니다. 나중에 보니 프록시 설정 문제였고, HTTPS_PROXY의 프로토콜 헤더를 잘못 쓴 것이 원인이었습니다.
DNS 설정: 가장 쉽게 함정에 빠지는 지점
DNS 해석 문제는 가장 흔한 원인이며, 동시에 가장 쉽게 놓치는 부분입니다.
nslookup으로 확인해 보세요.
nslookup registry-1.docker.io
# 해석 시간: 300ms-500ms → DNS가 너무 느림
# 해석 실패: server can't find → DNS 설정 오류
Cloudflare DNS의 함정
일부 기업 내부망에서는 DNS 서버로 1.1.1.1(Cloudflare)을 사용합니다. 이 DNS는 특정 네트워크 환경에서 Docker pull 실패를 일으킬 수 있습니다. Cloudflare의 DNS-over-HTTPS 프로토콜과 Docker daemon의 DNS 해석 메커니즘 사이에 호환성 문제가 있기 때문입니다.
GitHub에는 이 문제를 전문적으로 다룬 issue(#2299)가 있습니다. Docker daemon이 사용하는 DNS와 시스템 DNS가 일치하지 않아 해석 실패가 발생한다는 내용입니다.
해결 방법: Google DNS(8.8.8.8)나 기업 내부 DNS 서버로 바꾸세요.
Docker daemon DNS 수정하기
/etc/docker/daemon.json에 dns 필드를 추가합니다.
{
"dns": ["8.8.8.8", "8.8.4.4", "기업 DNS 서버 IP"]
}
수정 후 Docker를 재시작합니다.
sudo systemctl restart docker
설정이 적용되었는지 확인합니다.
docker info | grep -A 5 "DNS"
# 출력에 설정한 DNS 서버가 표시되어야 합니다
Docker Desktop에서 DNS 고정하기
Docker Desktop(Mac 또는 Windows)을 사용한다면 설정 화면에서 바꿉니다.
Settings → Docker Engine → JSON 설정에 dns 필드를 추가합니다.
Settings → Resources → Network에서 DNS 서버를 직접 지정할 수도 있습니다.
이전에 회사 내부망에서 테스트했을 때 DNS를 Cloudflare에서 Google로 바꾸자 해석 시간이 300ms에서 50ms로 줄었습니다. 이후 docker pull이 다시 멈추는 일도 없었습니다.
프록시 설정: HTTPS_PROXY 프로토콜 헤더의 함정
기업 내부망은 보통 프록시를 거쳐야 합니다. 많은 사람이 프록시를 설정할 때 한 가지 함정에 빠집니다. HTTPS_PROXY에 https:// 프로토콜 헤더를 쓰는 것입니다.
이것은 잘못된 설정입니다.
프록시 프로토콜 헤더는 HTTPS 요청이어도 반드시 http://여야 합니다.
# 잘못된 예
HTTPS_PROXY=https://proxy.example.com:8080
# 올바른 예
HTTPS_PROXY=http://proxy.example.com:8080
이유는 간단합니다. 프록시 서버가 받는 것은 HTTP CONNECT 메서드이지 HTTPS 프로토콜이 아닙니다. https://로 프록시에 연결하려고 하면 프록시가 인식하지 못합니다.
systemd 설정(권장)
/etc/systemd/system/docker.service.d/http-proxy.conf를 만듭니다.
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,*.internal.example.com,10.0.0.0/8"
NO_PROXY에는 프록시를 거치지 않을 주소 대역을 명확히 적어야 합니다. 내부망 주소, localhost, 사설 도메인이 여기에 들어갑니다. 그렇지 않으면 회사 내부 서비스에 접근할 때도 프록시를 거치게 되어 속도가 느려질 뿐 아니라 데이터가 노출될 수도 있습니다.
systemd 설정을 다시 로드합니다.
sudo systemctl daemon-reload
sudo systemctl restart docker
설정을 검증합니다.
systemctl show --property=Environment docker
# 설정한 Environment 변수가 보여야 합니다
daemon.json 설정(대안)
/etc/docker/daemon.json에 설정할 수도 있습니다.
{
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1,*.internal.example.com"
}
}
}
이 방식은 systemd만큼 유연하지 않습니다. 환경 변수로 동적으로 조정하기 어렵기 때문입니다. 그래도 systemd를 만지고 싶지 않은 환경에는 적합합니다.
다단계 프록시는 어떻게 하나요?
어떤 기업은 2단계, 심지어 3단계 프록시 구조를 사용합니다. 외부망 프록시 → 내부망 프록시 → 내 머신 같은 식입니다.
이때는 “프록시 체인”을 설정해야 합니다. http-proxy.conf에는 첫 번째 프록시 주소를 적으면 되고, 그 프록시가 자동으로 상위 프록시로 전달합니다. 내가 알아야 하는 것은 가장 가까운 프록시 서버 주소뿐입니다.
미러 가속기: 2026년 5월 기준 최신 사용 가능 목록
국내 네트워크에서 Docker Hub에 직접 연결하는 것은 거의 불가능에 가깝습니다. 미러 가속기는 필수 설정입니다.
2026년 5월 실측 기준 사용할 수 있었던 미러 소스는 다음과 같습니다.
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io"
]
}
이 세 소스는 모두 테스트했습니다. 평균 속도는 12MB/s였고, 성공률은 99% 이상이었습니다.
설정 방법: /etc/docker/daemon.json에 registry-mirrors 필드를 추가합니다.
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io"
],
"dns": ["8.8.8.8", "8.8.4.4"]
}
장애 대비를 위해 여러 소스를 설정하세요. Docker는 순서대로 시도하고, 첫 번째가 실패하면 자동으로 다음 소스로 넘어갑니다.
설정을 검증합니다.
docker info | grep -A 3 "Registry Mirrors"
# 출력에 설정한 미러 소스 목록이 표시되어야 합니다
기업 사설 이미지 저장소
회사에 Harbor 같은 사설 이미지 저장소가 있다면 내부 저장소를 우선 사용하세요.
{
"registry-mirrors": ["https://harbor.internal.example.com"],
"insecure-registries": ["harbor.internal.example.com"]
}
insecure-registries는 HTTP 프로토콜을 사용하는 사설 저장소(SSL 인증서가 없는 경우)에 사용합니다. 프로덕션 환경에서는 권장하지 않지만, 개발 환경에서는 임시로 사용할 수 있습니다.
전체 문제 해결 사례: 오류에서 해결까지
실제에 가까운 상황을 시뮬레이션해 보겠습니다.
docker pull nginx:alpine을 실행합니다.
Error: pull access denied, connection timeout after 10m0s
점검 단계:
- ping 테스트:
ping registry-1.docker.io
# 결과: 연결 안 됨
네트워크 계층에 문제가 있습니다.
-
네트워크 담당자에게 확인: 방화벽이 443 포트를 차단하고 있었습니다. 담당자가 허용한 뒤 ping이 통했습니다.
-
nslookup 테스트:
nslookup registry-1.docker.io
# 해석 시간: 350ms
DNS 해석이 너무 느립니다.
-
DNS 수정:
/etc/docker/daemon.json에"dns": ["8.8.8.8"]를 추가합니다. Docker를 재시작합니다. -
다시 테스트: 해석 시간은 50ms로 줄었지만
docker pull은 여전히 멈춥니다. -
프록시 설정 확인:
systemctl show --property=Environment docker
# HTTPS_PROXY=https://proxy.example.com:8080 발견(오류)
http:// 프로토콜 헤더로 바꿉니다. Docker를 재시작합니다.
- 미러 가속기 설정:
registry-mirrors를 추가합니다. 다시 시도합니다.
docker pull nginx:alpine
# 성공, 속도 12MB/s
문제 해결 순서 요약:
- 네트워크 계층 문제 → 네트워크 담당자에게 문의
- DNS 해석 느림 → DNS 설정 수정
- 프록시 설정 오류 → 프로토콜 헤더와 systemd 설정 확인
- Docker Hub 직접 연결 어려움 → 미러 가속기 설정
마무리
기업 내부망에서 Docker pull이 타임아웃될 때는 먼저 네트워크 연결성을 확인하고, 그다음 DNS 설정을 보고, 이어서 프록시를 점검한 뒤, 마지막으로 미러 가속기를 설정하는 순서를 권장합니다.
DNS 설정 문제는 가장 흔한 원인입니다. Cloudflare DNS는 일부 환경에서 Docker pull 실패를 일으킬 수 있으므로 Google DNS나 기업 내부 DNS 서버로 바꾸는 것이 좋습니다.
프록시 설정에서는 한 가지만 기억하세요. HTTPS_PROXY는 반드시 http:// 프로토콜 헤더를 사용해야 하며, https://가 아닙니다. 저도 이 함정에 빠져 오후 내내 시간을 날린 적이 있습니다.
미러 가속기는 2026년 5월 실측 기준 사용 가능했던 세 소스, docker.1ms.run, docker.xuanyuan.me, docker.m.daocloud.io를 쓰면 됩니다. 여러 개를 설정해 장애 대비를 하세요.
마지막으로 전체 설정 템플릿은 다음과 같습니다.
{
"dns": ["8.8.8.8", "8.8.4.4"],
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io"
]
}
systemd 프록시 설정까지 함께 적용하면 기업 내부망에서 발생하는 Docker pull 타임아웃 문제의 90% 정도는 해결할 수 있습니다.
Docker pull 타임아웃 전체 문제 해결 흐름
오류 발생부터 해결까지의 체계적인 점검 단계로, 네트워크, DNS, 프록시, 미러 가속 네 가지 설정을 다룹니다.
⏱️ Estimated time: 10 min
- 1
Step 1: 네트워크 연결성 확인
ping registry-1.docker.io를 실행해 네트워크가 연결되는지 확인하고, nslookup으로 DNS 해석 시간(200ms를 넘으면 최적화 필요)을 확인한 뒤, curl -v https://registry-1.docker.io/v2/ 로 443 포트를 테스트합니다. - 2
Step 2: DNS 설정 수정
/etc/docker/daemon.json에 "dns": ["8.8.8.8", "8.8.4.4"]를 추가해 Cloudflare DNS 호환성 문제를 피합니다. Docker를 재시작합니다: sudo systemctl restart docker. 검증: docker info | grep -A 5 "DNS". - 3
Step 3: 프록시 설정(필요한 경우)
/etc/systemd/system/docker.service.d/http-proxy.conf를 만들고 HTTP_PROXY와 HTTPS_PROXY를 설정합니다. 프로토콜 헤더는 반드시 http://여야 합니다. NO_PROXY로 내부망 주소를 제외합니다. systemctl daemon-reload && systemctl restart docker를 실행합니다. - 4
Step 4: 미러 가속기 추가
/etc/docker/daemon.json에 registry-mirrors 필드를 추가하고 장애 대비를 위해 여러 미러 소스를 설정합니다. 검증: docker info | grep -A 3 "Registry Mirrors". pull 테스트: docker pull nginx:alpine.
FAQ
Docker pull이 멈춘 것처럼 보이는 이유는 무엇인가요?
HTTPS_PROXY에는 https://와 http:// 중 어떤 프로토콜 헤더를 써야 하나요?
Cloudflare DNS(1.1.1.1)가 왜 Docker pull 실패를 일으킬 수 있나요?
2026년 5월 기준 사용할 수 있는 Docker 미러 가속기는 무엇인가요?
Docker Desktop에서 DNS와 미러 가속은 어떻게 설정하나요?
기업 내부망에 다단계 프록시가 있으면 어떻게 해야 하나요?
2분 읽기 · 게시일: 2026년 5월 27일 · 수정일: 2026년 10월 21일
Docker 실전 가이드
검색으로 들어왔다면 같은 시리즈의 이전 글이나 다음 글로 이동하는 것이 가장 빠릅니다.
이전
Docker 미러 속도 테스트 실전: 3가지 방법과 자동 전환 스크립트
Docker 이미지 pull이 느린가요? 이 글에서는 3가지 속도 측정 방법과 Shell/Python 자동 전환 스크립트를 소개해, 현재 환경에 가장 빠른 국내 미러를 한 번에 설정하고 docker pull timeout을 줄이는 방법을 정리합니다.
38편 중 24편
다음
Docker로 Redis 배포하기 완벽 가이드: 영속성과 비밀번호 인증으로 데이터 손실 방지
Docker로 Redis를 배포하고 RDB/AOF 영속성과 비밀번호 인증을 설정해 컨테이너 재시작 시 데이터가 사라지는 문제를 방지하는 방법을 단계별로 설명합니다. 운영 환경 배포에 적합한 전체 설정 파일과 코드 예제를 제공합니다.
38편 중 26편



댓글
GitHub로 로그인하여 댓글을 남기세요