Docker CLI에 프록시 서버 사용하기

Docker CLI에 프록시 서버 사용하기 (Use a proxy server with the Docker CLI)

이 페이지는 컨테이너 안에서 환경 변수를 통해 Docker CLI가 프록시를 사용하도록 구성하는 방법을 설명해요.

이 페이지는 Docker Desktop용 프록시 구성 방법을 설명하지 않아요. 자세한 내용은 Docker Desktop이 HTTP/HTTPS 프록시를 사용하도록 구성하기를 참고하세요.

Docker Desktop 없이 Docker Engine을 실행 중이라면, Docker 데몬이 프록시를 사용하도록 구성하기를 참고해 Docker 데몬(dockerd) 자체의 프록시 서버를 구성하는 방법을 알아보세요.

컨테이너가 HTTP, HTTPS 또는 FTP 프록시 서버를 사용해야 한다면 여러 가지 방법으로 구성할 수 있어요:

  • Docker 클라이언트 구성
  • CLI를 사용해 프록시 설정

출처: 문서

본문

Note 안타깝게도 웹 클라이언트가 프록시 환경 변수를 처리하는 방식 또는 그 정의 형식에 대한 표준은 없어요. 이 변수들의 역사에 관심이 있다면 GitLab 팀의 이 블로그 포스트를 확인하세요: We need to talk: Can we standardize NO_PROXY?

Docker 클라이언트 구성 (Configure the Docker client)

~/.docker/config.json에 있는 JSON 구성 파일을 사용해 Docker 클라이언트용 프록시 구성을 추가할 수 있어요. 빌드와 컨테이너는 이 파일에 지정된 구성을 사용해요.

{
 "proxies": {
   "default": {
     "httpProxy": "http://proxy.example.com:3128",
     "httpsProxy": "https://proxy.example.com:3129",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
   }
 }
}

Warning 프록시 설정은 민감한 정보를 포함할 수 있어요. 예를 들어 일부 프록시 서버는 URL에 인증 정보를 포함해야 하거나, 그 주소가 회사 환경의 IP 주소나 호스트 이름을 노출할 수 있어요. 환경 변수는 컨테이너 구성에 평문으로 저장되므로 원격 API를 통해 검사하거나 docker commit을 사용할 때 이미지에 커밋될 수 있어요.

파일을 저장하면 구성이 활성화되며 Docker를 재시작할 필요는 없어요. 다만 구성은 새 컨테이너와 새 빌드에만 적용되고 기존 컨테이너에는 영향을 주지 않아요.

다음 표는 사용 가능한 구성 매개변수를 설명해요.

Property Description
httpProxy HTTP_PROXYhttp_proxy 환경 변수와 빌드 인자를 설정해요.
httpsProxy HTTPS_PROXYhttps_proxy 환경 변수와 빌드 인자를 설정해요.
ftpProxy FTP_PROXYftp_proxy 환경 변수와 빌드 인자를 설정해요.
noProxy NO_PROXYno_proxy 환경 변수와 빌드 인자를 설정해요.
allProxy ALL_PROXYall_proxy 환경 변수와 빌드 인자를 설정해요.

이 설정은 컨테이너용 프록시 환경 변수만 구성하는 데 사용되며, Docker CLI 또는 Docker Engine 자체의 프록시 설정으로는 사용되지 않아요. CLI와 데몬의 프록시 설정 구성은 환경 변수Docker 데몬이 프록시 서버를 사용하도록 구성하기 섹션을 참고하세요.

프록시 구성으로 컨테이너 실행하기 (Run containers with a proxy configuration)

컨테이너를 시작하면 컨테이너의 프록시 관련 환경 변수는 ~/.docker/config.json의 프록시 구성을 반영하도록 설정돼요.

예를 들어 이전 섹션에서 보여준 것 같은 프록시 구성을 가정하면, 실행하는 컨테이너의 환경 변수는 다음과 같이 설정돼요:

$ docker run --rm alpine sh -c 'env | grep -i  _PROXY'
https_proxy=http://proxy.example.com:3129
HTTPS_PROXY=http://proxy.example.com:3129
http_proxy=http://proxy.example.com:3128
HTTP_PROXY=http://proxy.example.com:3128
no_proxy=*.test.example.com,.example.org,127.0.0.0/8
NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8

프록시 구성으로 빌드하기 (Build with a proxy configuration)

빌드를 호출하면 Docker 클라이언트 구성 파일의 프록시 설정을 바탕으로 프록시 관련 빌드 인자가 자동으로 미리 채워져요.

이전 섹션에서 보여준 것 같은 프록시 구성을 가정하면, 빌드 중 환경 변수는 다음과 같이 설정돼요:

$ docker build \
  --no-cache \
  --progress=plain \
  - <<EOF
FROM alpine
RUN env | grep -i _PROXY
EOF
#5 [2/2] RUN env | grep -i _PROXY
#5 0.100 HTTPS_PROXY=https://proxy.example.com:3129
#5 0.100 no_proxy=*.test.example.com,.example.org,127.0.0.0/8
#5 0.100 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8
#5 0.100 https_proxy=https://proxy.example.com:3129
#5 0.100 http_proxy=http://proxy.example.com:3128
#5 0.100 HTTP_PROXY=http://proxy.example.com:3128
#5 DONE 0.1s

데몬별 프록시 설정 (Configure proxy settings per daemon)

~/.docker/config.jsonproxies 아래 default 키는 클라이언트가 연결하는 모든 데몬에 대한 프록시 설정을 구성해요. 개별 데몬에 대한 프록시를 구성하려면 default 키 대신 데몬의 주소를 사용해요.

다음 예시는 기본 프록시 구성과 tcp://docker-daemon1.example.com 주소의 Docker 데몬에 대한 no-proxy 재정의를 모두 구성해요:

{
 "proxies": {
   "default": {
     "httpProxy": "http://proxy.example.com:3128",
     "httpsProxy": "https://proxy.example.com:3129",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
   },
   "tcp://docker-daemon1.example.com": {
     "noProxy": "*.internal.example.net"
   }
 }
}

CLI를 사용해 프록시 설정하기 (Set proxy using the CLI)

Docker 클라이언트를 구성하는 대신 docker builddocker run 명령을 호출할 때 커맨드 라인에서 프록시 구성을 지정할 수 있어요.

커맨드 라인의 프록시 구성은 빌드에 --build-arg 플래그를, 프록시로 컨테이너를 실행할 때는 --env 플래그를 사용해요.

$ docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
$ docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis

docker build 명령에서 사용할 수 있는 모든 프록시 관련 빌드 인자 목록은 Predefined ARGs를 참고하세요. 이 프록시 값은 빌드 컨테이너에서만 사용할 수 있어요. 빌드 출력에는 포함되지 않아요.

빌드용 프록시 환경 변수 (Proxy as environment variable for builds)

빌드용 프록시 설정을 지정하는 데 Dockerfile ENV 명령을 사용하지 마세요. 대신 빌드 인자를 사용해요.

프록시에 환경 변수를 사용하면 구성이 이미지에 포함돼요. 프록시가 내부 프록시라면 그 이미지에서 만든 컨테이너에는 접근할 수 없을 수도 있어요.

이미지에 프록시 설정을 포함시키는 것은 값에 민감한 정보가 포함될 수 있으므로 보안 위험도 있어요.

더 알아보기 (Learn more)