데몬 프록시 구성
데몬 프록시 구성 (Daemon proxy configuration)
조직에서 인터넷 연결에 프록시 서버를 사용한다면 Docker 데몬이 프록시 서버를 사용하도록 구성해야 할 수도 있어요. 데몬은 Docker Hub 및 기타 레지스트리에 저장된 이미지에 접근하고, Docker swarm의 다른 노드에 도달하기 위해 프록시 서버를 사용해요.
이 페이지는 Docker 데몬용 프록시를 구성하는 방법을 설명해요. Docker CLI의 프록시 설정 구성 지침은 Docker CLI가 프록시 서버를 사용하도록 구성하기를 참고하세요.
Important
daemon.json에 지정된 프록시 구성은 Docker Desktop이 무시해요. Docker Desktop을 사용한다면 Docker Desktop 설정으로 프록시를 구성할 수 있어요.
출처: 문서
본문
이 설정을 구성하는 두 가지 방법이 있어요:
- 구성 파일 또는 CLI 플래그로 데몬 구성
- 시스템에 환경 변수 설정
데몬을 직접 구성하는 것이 환경 변수보다 우선해요.
데몬 구성 (Daemon configuration)
daemon.json 파일에서 또는 dockerd 명령의 --http-proxy 또는 --https-proxy 플래그용 CLI 플래그를 사용해 데몬의 프록시 동작을 구성할 수 있어요. daemon.json을 사용한 구성이 권장돼요.
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "http://proxy.example.com:3128",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
구성 파일을 변경한 후 프록시 구성이 적용되도록 데몬을 재시작해요:
$ sudo systemctl restart docker
환경 변수 (Environment variables)
Docker 데몬은 시작 환경에서 다음 환경 변수를 확인해 HTTP 또는 HTTPS 프록시 동작을 구성해요:
HTTP_PROXYhttp_proxyHTTPS_PROXYhttps_proxyNO_PROXYno_proxy
systemd 유닛 파일 (systemd unit file)
Docker 데몬을 systemd 서비스로 실행 중이라면 docker 서비스의 변수를 설정하는 systemd drop-in 파일을 만들 수 있어요.
루트리스 모드 주의 루트리스 모드에서 Docker를 실행할 때는 systemd 구성 파일의 위치가 달라요. 루트리스 모드에서 Docker는 사용자 모드 systemd 서비스로 시작되며, 각 사용자의 홈 디렉토리의
~/.config/systemd/<user>/docker.service.d/에 저장된 파일을 사용해요. 또한systemctl은sudo없이--user플래그로 실행해야 해요. 루트리스 모드로 Docker를 실행 중이라면 "Rootless mode" 탭을 선택하세요.
다음은 일반(루트) 모드 절차:
docker서비스용 systemd drop-in 디렉토리를 만들어요:
$ sudo mkdir -p /etc/systemd/system/docker.service.d
HTTP_PROXY환경 변수를 추가하는/etc/systemd/system/docker.service.d/http-proxy.conf라는 파일을 만들어요:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
HTTPS 요청을 프록시하려면 HTTPS_PROXY 환경 변수를 설정해요:
[Service]
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
여러 환경 변수를 설정할 수 있어요. HTTP와 HTTPS 프록시를 둘 다 설정하려면:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
Note
#?!()[]{}같은 프록시 값의 특수 문자는%%를 사용해 이중 이스케이프해야 해요. 예를 들어:
[Service]
Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%[email protected]:3128/"
- 프록시 없이 접촉해야 하는 내부 Docker 레지스트리가 있다면
NO_PROXY환경 변수로 지정할 수 있어요.NO_PROXY변수는 프록시에서 제외해야 할 호스트의 쉼표 구분 값을 담는 문자열을 지정해요. 호스트를 제외하기 위해 지정할 수 있는 옵션은 다음과 같아요:- IP 주소 프리픽스 (
1.2.3.4) - 도메인 이름, 또는 특수 DNS 레이블 (
*) - 도메인 이름은 그 이름과 모든 하위 도메인에 일치해요. 앞에 "."이 있는 도메인 이름은 하위 도메인에만 일치해요. 예를 들어 도메인
foo.example.com과example.com이 주어졌을 때:example.com은example.com과foo.example.com에 일치하고,.example.com은foo.example.com에만 일치해요
- 단일 별표(
*)는 프록시가 수행되지 않음을 나타냄 - 리터럴 포트 번호는 IP 주소 프리픽스(
1.2.3.4:80)와 도메인 이름(foo.example.com:80)에서 허용됨
- IP 주소 프리픽스 (
예시:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
- 변경 사항을 플러시하고 Docker를 재시작해요
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
- 구성이 로드되고 변경 사항과 일치하는지 확인해요. 예를 들어:
$ sudo systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=http://proxy.example.com:3128 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
다음은 루트리스 모드 절차:
docker서비스용 systemd drop-in 디렉토리를 만들어요:
$ mkdir -p ~/.config/systemd/user/docker.service.d
HTTP_PROXY환경 변수를 추가하는~/.config/systemd/user/docker.service.d/http-proxy.conf라는 파일을 만들어요:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
HTTPS 요청을 프록시하려면 HTTPS_PROXY 환경 변수를 설정해요:
[Service]
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
여러 환경 변수를 설정할 수 있어요. HTTP와 HTTPS 프록시를 둘 다 설정하려면:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
Note
#?!()[]{}같은 프록시 값의 특수 문자는%%를 사용해 이중 이스케이프해야 해요. 예를 들어:
[Service]
Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%[email protected]:3128/"
- 프록시 없이 접촉해야 하는 내부 Docker 레지스트리가 있다면
NO_PROXY환경 변수로 지정할 수 있어요.NO_PROXY변수는 프록시에서 제외해야 할 호스트의 쉼표 구분 값을 담는 문자열을 지정해요. 호스트를 제외하기 위해 지정할 수 있는 옵션은 다음과 같아요:- IP 주소 프리픽스 (
1.2.3.4) - 도메인 이름, 또는 특수 DNS 레이블 (
*) - 도메인 이름은 그 이름과 모든 하위 도메인에 일치해요. 앞에 "."이 있는 도메인 이름은 하위 도메인에만 일치해요. 예를 들어 도메인
foo.example.com과example.com이 주어졌을 때:example.com은example.com과foo.example.com에 일치하고,.example.com은foo.example.com에만 일치해요
- 단일 별표(
*)는 프록시가 수행되지 않음을 나타냄 - 리터럴 포트 번호는 IP 주소 프리픽스(
1.2.3.4:80)와 도메인 이름(foo.example.com:80)에서 허용됨
- IP 주소 프리픽스 (
예시:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
- 변경 사항을 플러시하고 Docker를 재시작해요
$ systemctl --user daemon-reload
$ systemctl --user restart docker
- 구성이 로드되고 변경 사항과 일치하는지 확인해요. 예를 들어:
$ systemctl --user show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=http://proxy.example.com:3128 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp