Docker Engine 19.03 릴리스 노트

Docker Engine 19.03 릴리스 노트

Docker Engine 19.03 시리즈의 패치별 변경 사항을 정리한 문서예요. 19.03.0부터 19.03.15까지 보안 취약점 수정, 버그 픽스, 새로운 기능 추가가 어떻게 이루어졌는지 하나씩 살펴볼게요. 자신이 사용 중인 버전에 해당하는 부분을 찾아보시면 도움이 될 거예요.

출처: 공식문서

본문

19.03.15

2021년 2월 1일에 배포된 패치예요. 보안 관련 수정이 중심이에요.

보안

  • CVE-2021-21285: 잘못된 이미지가 docker 데몬을 크래시시키는 문제를 방지했어요.
  • CVE-2021-21284: 파일 권한을 잠가서 remapped root가 도커 상태에 접근하지 못하도록 했어요.
  • BuildKit으로 빌드할 때 AppArmor와 SELinux 프로필이 적용되도록 보장했어요.

클라이언트

  • 컨텍스트를 가져오기 전에 검사해서, 추출된 파일이 컨텍스트 저장소를 벗어나는 위험을 줄였어요.

19.03.14

2020년 12월 1일에 배포됐어요. containerd 보안 업데이트가 핵심이에요.

보안

  • CVE-2020-15257: 번들된 containerd 정적 바이너리를 v1.3.9로 업데이트했어요. moby/moby#41731 패키지 매니저로 설치한 경우 containerd.io 패키지도 함께 업데이트해야 해요.

빌더

  • apparmor 베타 버전을 올바르게 파싱하지 못해 빌드가 실패하던 문제를 고쳤어요. moby/moby#41542

네트워킹

  • swarmkit 서비스가 계속 시작에 실패할 때 panic이 발생하던 문제를 수정했어요. moby/moby#41635

런타임

  • 실제 오류 대신 뜬금없는 -EINVAL을 반환하던 문제를 고쳐, 올바른 오류를 반환하도록 했어요. moby/moby#41293

루트리스

  • systemd-tmpfiles가 state 디렉터리를 자동으로 정리하지 못하도록 잠금 처리했어요. moby/moby#41635
  • dockerd-rootless.sh가 새로운 containerd shim 소켓 경로 규약을 지원하도록 했어요. moby/moby#41557

로깅

  • gcplogs 드라이버의 메모리/연결 누수를 수정했어요. moby/moby#41522
  • awslogs 드라이버가 AWS imdsv2를 지원하게 됐어요. moby/moby#41494

19.03.13

2020년 9월 16일에 배포됐어요. BuildKit과 네트워킹 쪽 수정이 많았어요.

빌더

  • buildkit: 캐시 로직에서 nil 역참조가 발생하던 문제를 수정했어요. moby/moby#41279
  • buildkit: COPY/ADD 중 Unix 소켓을 일반 파일로 취급하도록 했어요. moby/moby#41269
  • buildkit: SELinux 환경과 무관하게 일관된 COPY 캐싱이 되도록 시스템/보안 xattr을 계산에서 제외했어요. moby/moby#41222
  • buildkit: --cache-from 동작을 더 안정적으로 만들었어요. moby/moby#41222
  • buildkit: 캐시 내보내기 중 CPU를 태우는 무한 루프를 수정했어요. moby/moby#41185

클라이언트

  • Golang 1.13.15로 업그레이드했어요. docker/cli#2674
  • ~/.docker/config.json 파일 권한 문제를 수정했어요. docker/cli#2631
  • build: 높이가 0인 터미널에서 panic이 발생하던 문제를 수정했어요. docker/cli#2719
  • windows: 콘솔의 개행 문자 관련 잠재적 문제를 수정했어요. docker/cli#2623

네트워킹

  • 실패 시 네트워크 샌드박스를 정리하도록 했어요. moby/moby#41081
  • deadline 관련 오류를 사용자에게 전달해서, 오류 메시지가 너무 얕게 나오던 문제를 수정했어요. moby/moby#41312
  • netns 파일 디스크립터가 누수되던 문제를 수정했어요. moby/moby#41287

루트리스

런타임

Windows

  • servercore 이미지를 사용할 때 Windows 컨테이너 시작 시간이 느려지던 문제를 수정했어요. moby/moby#41192

19.03.12

2020년 6월 18일에 배포됐어요.

클라이언트

  • 여러 config 파일을 사용할 때(예: Docker Desktop에서 Windows와 WSL2) 레지스트리에서 로그아웃이 안 되던 버그를 수정했어요. docker/cli#2592
  • 컨텍스트 메타데이터를 읽지 못하던 회귀 문제를 수정했어요. docker/cli#2586
  • Golang 1.13.12로 업그레이드했어요. docker/cli#2575

네트워킹

런타임

19.03.11

2020년 6월 1일에 배포됐어요. IPv6 보안 취약점 수정이 포함된 중요한 패치예요.

네트워크

IPv6 라우터 광고를 비활성화해서 주소 스푸핑을 방지했어요. CVE-2020-13401

설명

Docker 기본 구성에서 컨테이너 네트워크 인터페이스는 호스트로 연결되는 가상 이더넷 링크(veth 인터페이스)예요. 이 구성에서는 컨테이너 안에서 root 권한으로 프로세스를 실행할 수 있는 공격자가 기본 구성에 포함된 CAP_NET_RAW 능력을 이용해 호스트에 임의의 패킷을 보내고 받을 수 있어요.

호스트에서 IPv6가 완전히 비활성화되어 있지 않다면(커널 cmdline의 ipv6.disable=1), 일부 인터페이스에 IPv6가 구성되거나 구성되지 않은 채로 남아요. 이때 IPv6 포워딩은 비활성화되어 있을 가능성이 높아요. 즉 /proc/sys/net/ipv6/conf//forwarding == 0인 경우가 많죠. 또한 기본적으로 /proc/sys/net/ipv6/conf//accept_ra == 1이에요. 이 두 sysctl이 결합되면 호스트가 라우터 광고를 수락하고 이를 사용해 IPv6 스택을 구성하게 돼요.

공격자는 컨테이너에서 "rogue" 라우터 광고를 보내 호스트를 재구성해서, 호스트의 IPv6 트래픽 일부 또는 전체를 공격자가 제어하는 컨테이너로 리다이렉트할 수 있어요.

이전에 IPv6 트래픽이 전혀 없었더라도, DNS가 A(IPv4) 및 AAAA(IPv6) 레코드를 반환하면 많은 HTTP 라이브러리가 먼저 IPv6로 연결을 시도한 다음 IPv4로 폴백하기 때문에 공격자에게 응답할 기회를 주게 돼요. 호스트에 작년 apt의 RCE(CVE-2019-3462) 같은 취약점이 있다면 공격자가 호스트로 권한을 승격할 수도 있어요.

Docker 컨테이너에는 기본적으로 CAP_NET_ADMIN이 없기 때문에 공격자는 MitM에 필요한 IP를 구성할 수 없고, iptables로 NAT나 REDIRECT를 할 수 없으며, IP_TRANSPARENT도 사용할 수 없어요. 하지만 CAP_NET_RAW를 사용해 사용자 공간에서 tcp/ip 스택을 구현할 수는 있어요.

관련 이슈는 kubernetes/kubernetes#91507에서 확인할 수 있어요.

19.03.10

2020년 5월 29일에 배포됐어요.

클라이언트

  • 이전 버전 엔진과의 버전 협상 문제를 수정했어요. docker/cli#2538
  • hostname을 통해 SSH 플래그가 설정되지 않도록 했어요. docker/cli#2560
  • DOCKER_CLI_EXPERIMENTAL 값이 유효하지 않을 때 panic이 발생하던 문제를 수정했어요. docker/cli#2558
  • Go 1.13.11로 업그레이드해서 s390x에서 발생할 수 있는 panic을 방지했어요. docker/cli#2532

네트워킹

런타임

  • Go 1.13.11로 업그레이드해서 s390x에서 발생할 수 있는 panic을 방지했어요. moby/moby#40978

패키징

  • ARM64에서 ARM 빌드가 실패하던 문제를 수정했어요. moby/moby#41027

19.03.9

2020년 5월 14일에 배포됐어요. 여러 부분에서 안정성이 개선됐어요.

빌더

  • buildkit: 여러 이미지를 병렬로 빌드할 때 동시 맵 쓰기 panic이 발생하던 문제를 수정했어요. moby/moby#40780
  • buildkit: userns 환경에서 스테이지 간에 root가 아닌 소유 파일의 chown이 안 되던 문제를 수정했어요. moby/moby#40955
  • Windows에서 불필요한 임시 파일이 생성되지 않도록 했어요. moby/moby#40877

클라이언트

  • 한 글자로 된 볼륨 이름에서 panic이 발생하던 문제를 수정했어요. docker/cli#2471
  • 간단한 명령에서 긴 타임아웃이 발생하지 않도록 데몬 기능 감지를 지연시켰어요. docker/cli#2442
  • Windows에서 docker context inspect가 더 빨라졌어요. docker/cli#2516
  • Golang 1.13.10으로 업그레이드했어요. docker/cli#2431
  • gopkg.in/yaml.v2를 v2.2.8로 업그레이드했어요. docker/cli#2470

로깅

  • 이미 닫힌 로그 파일을 다시 닫으면서 컨테이너 로그가 회전되지 않던 문제를 수정했어요. moby/moby#40921

네트워킹

  • 재시작 시 발생할 수 있는 panic을 수정했어요. moby/moby#40809
  • 기본 브리지의 Subnet 필드에 올바른 네트워크 값을 할당하도록 했어요. moby/moby#40565

런타임

  • /etc/subuid/etc/subgid에 UID로 네임스페이스를 생성할 때 docker가 크래시되던 문제를 수정했어요. moby/moby#40562
  • ARM 플랫폼 매칭을 개선했어요. moby/moby#40758
  • overlay2: backing filesystem을 표시하도록 했어요. moby/moby#40652
  • CRIU를 v3.13 "Silicon Willet"으로 업데이트했어요. moby/moby#40850
  • 레지스트리 v2 schema1 폐지 경고를 모든 레지스트리 오류에서가 아니라, 폴백이 성공했을 때만 표시하도록 했어요. moby/moby#40681
  • Windows 로그 파일에 FILE_SHARE_DELETE를 사용하도록 했어요. moby/moby#40563
  • Golang 1.13.10으로 업그레이드했어요. moby/moby#40803

루트리스

  • rootlesskit-docker-proxy가 권한 있는 포트를 노출할 때 상세한 오류 메시지를 반환하도록 했어요. moby/moby#40863
  • /etc/subuid/etc/subgid의 숫자 ID를 지원해요. moby/moby#40951

보안

  • apparmor: userns에 필요한 규칙이 누락된 것을 추가했어요. moby/moby#40564
  • SELinux: relabeling 시 ENOTSUP 오류가 감지되지 않던 문제를 수정했어요. moby/moby#40946

스웜

  • 서비스 로그에서 멈춤 현상이 없도록 로거의 리필률을 높였어요. moby/moby#40628
  • 재부팅 후 단일 swarm 매니저가 Down 상태로 멈춰 있던 문제를 수정했어요. moby/moby#40831
  • tasks.db가 무한정 커지지 않도록 했어요. moby/moby#40831

19.03.8

2020년 3월 10일에 배포됐어요.

런타임

  • 일부 nscd 구성에서 CVE-2019-14271 완화 조치를 개선했어요.

19.03.7

2020년 3월 3일에 배포됐어요.

빌더

  • builder-next: 코너 케이스에서 발생하던 교착 상태 문제를 수정했어요. moby/moby#40557

런타임

  • overlay: modprobe exec 호출을 제거했어요. moby/moby#40462
  • selinux: 파일 레이블을 설정할 때 더 나은 오류 메시지를 표시하도록 했어요. moby/moby#40547
  • 초기 통계 수집 속도를 높였어요. moby/moby#40549
  • rootless: XDG_CONFIG_HOME에서 certs.d를 사용하도록 했어요. moby/moby#40461
  • Golang 1.12.17로 업그레이드했어요. moby/moby#40533
  • google.golang.org/grpc를 v1.23.1로 업그레이드했어요. moby/moby#40566
  • containerd 바이너리를 v1.2.13으로 업데이트했어요. moby/moby#40540
  • 엣지 케이스에서 중지된 컨테이너가 실행 중으로 표시되던 문제를 방지했어요. moby/moby#40555
  • 잠재적 잠금 문제를 방지했어요. moby/moby#40604

클라이언트

19.03.6

2020년 2월 12일에 배포됐어요.

빌더

  • builder-next: ssh 포워딩에 최신 서명 해시를 허용했어요. docker/engine#453
  • builder-next: 트리거 후 onbuild 규칙을 정리하도록 했어요. docker/engine#453
  • builder-next: userns가 활성화된 상태에서 디렉터리 권한 문제를 수정했어요. moby/moby#40440
  • Windows 1903에서 docker build가 실패하던 문제를 수정하기 위해 hcsshim을 업그레이드했어요. docker/engine#429

네트워킹

  • exec-root의 컨트롤러 ID를 줄여 UNIX_PATH_MAX를 초과하지 않도록 했어요. docker/engine#424
  • drivers/overlay/encryption.go에서 발생하던 panic을 수정했어요. docker/engine#424
  • hwaddr 설정 시 udev와의 경쟁 조건을 수정했어요. docker/engine#439

런타임

19.03.5

2019년 11월 14일에 배포됐어요.

빌더

  • builder-next: 빌더 config에 entitlements를 추가했어요. docker/engine#412
  • builder-next: userns-remap과 함께 빌드 시크릿이나 ssh 포워딩을 사용할 때 발생하던 권한 오류를 수정했어요. docker/engine#420
  • builder-next: 이미 복사된 디렉터리 안의 심링크를 복사할 때 발생하던 문제를 수정했어요. docker/engine#420

패키징

  • RHEL 8 패키지를 지원해요.

런타임

  • Golang 1.12.12로 업그레이드했어요. docker/engine#418
  • RootlessKit v0.7.0으로 업데이트해서 slirp4netns를 mount namespace와 seccomp로 강화했어요. docker/engine#397
  • 이벤트 프로세서에서 GetContainer 오류를 전파하도록 수정했어요. docker/engine#407
  • OCI 이미지 push 문제를 수정했어요. docker/engine#405

19.03.4

2019년 10월 17일에 배포됐어요.

네트워킹

  • DOCKER-USER iptables 체인 문제를 해결하기 위해 libnetwork 변경을 롤백했어요. docker/engine#404

알려진 문제

기존

  • 대규모 클러스터 환경에서 docker information의 Swarm 섹션에 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304) 오류가 포함될 수 있어요. 이는 사용자의 실패나 잘못된 구성 때문이 아니므로 대응이 필요 없어요.
  • 모든 서비스를 새로 재배포할 때 오케스트레이터 포트 충돌이 발생할 수 있어요. 짧은 시간에 swarm 매니저 요청이 너무 많아지면 일부 서비스가 트래픽을 받지 못해 배포 후 404 오류가 발생할 수 있어요.
    • 해결 방법: docker service update --force로 모든 태스크를 재시작하세요.
  • CVE-2018-15664: 디렉터리 트래버설을 이용한 심링크 교환 공격이에요. 다음 패치에서 제대로 수정되기 전까지는 파일 작업 전에 docker pause로 컨테이너를 일시 중지하세요. moby/moby#39252
  • CVE 완화 조치로 인한 docker cp 회귀 문제가 있어요. docker cp의 소스를 /로 설정하면 오류가 발생해요.

19.03.3

2019년 10월 8일에 배포됐어요.

보안

빌더

  • builder-next: 서드파티 레지스트리의 digest를 올바르게 해석하도록 수정했어요. docker/engine#339
  • builder-next: 데몬이 소켓 활성화로 시작된 경우 userns 빌드가 동작하도록 수정했어요. docker/engine#373
  • builder-next: 세션에서 포워딩된 ssh 소켓 연결을 연결별로 해제하도록 수정했어요. docker/engine#373
  • builder-next: llbsolver에서 여러 캐시 importer 사용 시 오류가 나도록 수정했어요. docker/engine#373

클라이언트

  • Docker Template 0.1.6을 지원해요.
  • 과도한 앨리어싱이 포함된 YAML 파일로 인한 문제를 완화했어요. docker/cli#2119

런타임

  • Golang 1.12.10으로 업그레이드했어요. docker/engine#387
  • containerd 1.2.10으로 업그레이드했어요. docker/engine#385
  • Distribution: v2 schema1 매니페스트를 풀할 때 경고 로직을 수정했어요. docker/engine#368
  • POST /images/create에서 잘못된 platform 옵션을 제공하면 500 상태 코드를 반환하던 문제를 수정했어요. docker/engine#365
  • POST /build에서 잘못된 platform 옵션을 제공하면 500 상태 코드를 반환하던 문제를 수정했어요. docker/engine#365
  • 32비트 ARMv7에서 정렬되지 않은 struct 멤버로 인한 panic을 수정했어요. docker/engine#363
  • 존재하지 않는 컨테이너에 링크할 때 "invalid parameter"를 반환하도록 수정했어요. docker/engine#352
  • overlay2: 커널 5.2 이상에서 마운트 시 busy 오류가 나던 문제를 수정했어요. docker/engine#332
  • 잘못 구성된 시스템(예: 응답 없는 NFS 공유)에서 docker rmi가 멈춰 있던 문제를 수정했어요. docker/engine#335
  • exec된 프로세스의 차단 I/O 처리 문제를 수정했어요. docker/engine#296
  • jsonfile 로거: max-size가 설정되고 max-file=1일 때 로그 팔로우가 멈추던 문제를 수정했어요. docker/engine#378

알려진 문제

신규

  • DOCKER-USER iptables 체인이 누락됐어요: docker/for-linux#810. 이 체인 위에서 추가적인 컨테이너 네트워크 트래픽 필터링을 할 수 없어요. DOCKER-USER 위에서 iptables 체인을 커스터마이징하지 않는다면 영향이 없어요.
    • 해결 방법: docker 데몬 시작 후 iptables 체인을 직접 추가하세요. 예를 들어:
iptables -N DOCKER-USER
iptables -I FORWARD -j DOCKER-USER
iptables -A DOCKER-USER -j RETURN

기존

  • 대규모 클러스터 환경에서 docker information의 Swarm 섹션에 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304) 오류가 포함될 수 있어요. 이는 사용자의 실패나 잘못된 구성 때문이 아니므로 대응이 필요 없어요.
  • 모든 서비스를 새로 재배포할 때 오케스트레이터 포트 충돌이 발생할 수 있어요. 짧은 시간에 swarm 매니저 요청이 너무 많아지면 일부 서비스가 트래픽을 받지 못해 배포 후 404 오류가 발생할 수 있어요.
    • 해결 방법: docker service update --force로 모든 태스크를 재시작하세요.
  • CVE-2018-15664: 디렉터리 트래버설을 이용한 심링크 교환 공격이에요. 다음 패치에서 제대로 수정되기 전까지는 파일 작업 전에 docker pause로 컨테이너를 일시 중지하세요. moby/moby#39252
  • CVE 완화 조치로 인한 docker cp 회귀 문제가 있어요. docker cp의 소스를 /로 설정하면 오류가 발생해요.

19.03.2

2019년 9월 3일에 배포됐어요.

빌더

  • Windows에서 COPY --from이 존재하지 않는 디렉터리로 복사되던 문제를 수정했어요. moby/moby#39695
  • builder-next: 메타데이터 명령이 history에 created time을 남기지 않던 문제를 수정했어요. moby/moby#39456
  • builder-next: 레이어 내보내기 오류 발생 시 진행 상황을 닫도록 수정했어요. moby/moby#39782
  • buildkit을 588c73e1e4로 업데이트했어요. moby/moby#39781

클라이언트

  • 비 Windows 환경에서 Windows 절대 경로 감지 문제를 수정했어요. docker/cli#1990
  • docker login --username에 대한 zsh 완성 스크립트를 수정했어요.
  • context: context create 시 일관된 출력이 나오도록 수정했어요. docker/cli#1985
  • HTTP 프록시 환경 변수 지원을 수정했어요. docker/cli#2059

로깅

네트워킹

  • 네트워킹이 비활성화된 컨테이너에 네트워크가 연결될 때 panic이 발생하던 문제를 방지했어요. moby/moby#39589

런타임

  • Golang 1.12.8로 업그레이드했어요.
  • 컨테이너에 XFS 디스크 할당량을 사용할 때 엔진 panic이 발생할 수 있던 문제를 수정했어요. moby/moby#39644

스웜

  • 여러 태스크가 있는 노드를 제거할 수 없던 문제를 수정했어요. docker/swarmkit#2867

알려진 문제

  • 대규모 클러스터 환경에서 docker information의 Swarm 섹션에 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304) 오류가 포함될 수 있어요. 이는 사용자의 실패나 잘못된 구성 때문이 아니므로 대응이 필요 없어요.
  • 모든 서비스를 새로 재배포할 때 오케스트레이터 포트 충돌이 발생할 수 있어요. 짧은 시간에 swarm 매니저 요청이 너무 많아지면 일부 서비스가 트래픽을 받지 못해 배포 후 404 오류가 발생할 수 있어요.
    • 해결 방법: docker service update --force로 모든 태스크를 재시작하세요.
  • FORWARD 체인에 iptables 규칙이 없어서 HOST에서 트래픽이 나가지 못하는 문제가 있어요. 누락된 규칙은 다음과 같아요:
/sbin/iptables --wait -C FORWARD -o docker_gwbridge -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables --wait -C FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  • 해결 방법: 스크립트와 cron 정의를 사용해 이 규칙을 다시 추가하세요. 스크립트에는 규칙 존재 여부를 확인하는 -C 명령과 규칙을 다시 추가하는 -A 명령이 포함되어야 해요. cron으로 예를 들어 매분마다 실행되도록 하세요.
  • 영향받는 버전: 18.09.1, 19.03.0
  • CVE-2018-15664: 디렉터리 트래버설을 이용한 심링크 교환 공격이에요. 다음 패치에서 제대로 수정되기 전까지는 파일 작업 전에 docker pause로 컨테이너를 일시 중지하세요. moby/moby#39252
  • CVE 완화 조치로 인한 docker cp 회귀 문제가 있어요. docker cp의 소스를 /로 설정하면 오류가 발생해요.

19.03.1

2019년 7월 25일에 배포됐어요.

보안

  • Glibc 환경의 chroot 내부에서 nsswitch 기반 설정을 로드할 때 발생하던 문제를 수정했어요. CVE-2019-14271

알려진 문제

  • 대규모 클러스터 환경에서 docker information의 Swarm 섹션에 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304) 오류가 포함될 수 있어요. 이는 사용자의 실패나 잘못된 구성 때문이 아니므로 대응이 필요 없어요.
  • 모든 서비스를 새로 재배포할 때 오케스트레이터 포트 충돌이 발생할 수 있어요. 짧은 시간에 swarm 매니저 요청이 너무 많아지면 일부 서비스가 트래픽을 받지 못해 배포 후 404 오류가 발생할 수 있어요.
    • 해결 방법: docker service update --force로 모든 태스크를 재시작하세요.
  • FORWARD 체인에 iptables 규칙이 없어서 HOST에서 트래픽이 나가지 못하는 문제가 있어요. 누락된 규칙은 다음과 같아요:
/sbin/iptables --wait -C FORWARD -o docker_gwbridge -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables --wait -C FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  • 해결 방법: 스크립트와 cron 정의를 사용해 이 규칙을 다시 추가하세요. 스크립트에는 규칙 존재 여부를 확인하는 -C 명령과 규칙을 다시 추가하는 -A 명령이 포함되어야 해요. cron으로 예를 들어 매분마다 실행되도록 하세요.
  • 영향받는 버전: 18.09.1, 19.03.0
  • CVE-2018-15664: 디렉터리 트래버설을 이용한 심링크 교환 공격이에요. 다음 패치에서 제대로 수정되기 전까지는 파일 작업 전에 docker pause로 컨테이너를 일시 중지하세요. moby/moby#39252
  • CVE 완화 조치로 인한 docker cp 회귀 문제가 있어요. docker cp의 소스를 /로 설정하면 오류가 발생해요.

19.03.0

2019년 7월 22일에 배포된 19.03 시리즈의 첫 버전이에요. 많은 기능이 추가되고 개선됐어요.

빌더

  • COPY --from이 소유권을 보존하도록 수정했어요. moby/moby#38599
  • builder-next:
    • 인라인 캐시 지원 --cache-from이 추가됐어요. docker/engine#215
    • 출력 구성이 허용됐어요. moby/moby#38898
    • gcr workaround 토큰 캐시를 수정했어요. docker/engine#212
    • 다운로드 오류 시 stopprogress가 호출되도록 했어요. docker/engine#215
    • BuildKit이 systemd의 resolv.conf를 사용하도록 했어요. docker/engine#260
    • buildkit 출력 설정이 허용됐어요. docker/cli#1766
    • 무시할 경로를 위해 Dockerfile 전용 dockerignore 파일(예: Dockerfile.dockerignore)을 찾도록 했어요. docker/engine#215
    • x86, arm, arm64 바이너리에 대해 프로세스 실행 가능 여부를 자동으로 감지해요. docker/engine#215
    • buildkit을 1f89ec1로 업데이트했어요. docker/engine#260
    • 기본적으로 Dockerfile 프론트엔드 docker/dockerfile:1.1을 사용해요. docker/engine#215
    • COPY/ADD 작업에 더 이상 외부 이미지가 필요 없어요. docker/engine#215

클라이언트

  • docker update--pids-limit 플래그가 추가됐어요. docker/cli#1765
  • 서비스에 대한 sysctl 지원이 추가됐어요. docker/cli#1754
  • compose 파일에서 template_driver를 지원해요. docker/cli#1746
  • Windows에서 --device를 지원해요. docker/cli#1606
  • Data Path Port 구성을 지원해요. docker/cli#1509
  • 빠른 컨텍스트 전환 명령이 추가됐어요. docker/cli#1501
  • --mount type=bind,bind-nonrecursive,... 지원이 추가됐어요. docker/cli#1430
  • 노드당 최대 레플리카 수를 지원해요. docker/cli#1612
  • 이미지를 조용히 풀 수 있는 옵션이 추가됐어요. docker/cli#882
  • 별도의 --domainname 플래그가 추가됐어요. docker/cli#1130
  • docker stack deploy에서 시크릿 드라이버를 지원해요. docker/cli#1783
  • 서비스의 CredentialSpecs로 swarm Configs를 사용할 수 있어요. docker/cli#1781
  • --security-opt systempaths=unconfined 지원이 추가됐어요. docker/cli#1808
  • CLI 플러그인을 작성하고 실행하기 위한 기본 프레임워크가 추가됐어요. docker/cli#1564 docker/cli#1898
  • Docker App을 v0.8.0으로 업그레이드했어요. docker/docker-ce-packaging#341
  • Docker buildx를 지원해요. docker/docker-ce-packaging#336
  • Docker Assemble v0.36.0을 지원해요.
  • Docker Cluster v1.0.0-rc2를 지원해요.
  • Docker Template v0.1.4를 지원해요.
  • Docker Registry v0.1.0-rc1을 지원해요.
  • google.golang.org/grpc를 v1.20.1로 업그레이드했어요. docker/cli#1884
  • CLI가 docker run에 드라이버별 옵션을 전달하도록 변경됐어요. docker/cli#1767
  • Golang 1.12.5로 업그레이드했어요. docker/cli#1875
  • docker system info 출력이 클라이언트와 데몬 관련 정보를 분리해서 보여줘요. docker/cli#1638
  • (Experimental) Kubernetes를 대상으로 할 때 compose 파일 서비스 구성에서 x-pull-secret: some-pull-secret을 지원해요. docker/cli#1617
  • (Experimental) Kubernetes를 대상으로 할 때 compose 파일 서비스 구성에서 x-pull-policy: <Never|Always|IfNotPresent>를 지원해요. docker/cli#1617
  • cp, save, export: 비정규 파일을 덮어쓰지 않도록 했어요. docker/cli#1515
  • 스택 파일에서 npipe 볼륨 타입을 허용해요. docker/cli#1195
  • tty 초기 크기 오류를 수정했어요. docker/cli#1529
  • 환경 변수에서 레이블 값을 복사할 때 발생하던 문제를 수정했어요. docker/cli#1671

API

  • API 버전을 v1.40으로 업데이트했어요. moby/moby#38089
  • /info 엔드포인트에 경고를 추가하고, 감지를 데몬으로 옮겼어요. moby/moby#37502
  • /_ping 엔드포인트에 HEAD 메서드를 지원해요. moby/moby#38570
  • /_ping 엔드포인트의 캐시를 비활성화하는 Cache-Control 헤더를 추가했어요. moby/moby#38569
  • /versioncontainerd, runc, docker-init 버전을 추가했어요. moby/moby#37974
  • 문서화되지 않은 /grpc 엔드포인트를 추가하고 BuildKit 컨트롤러를 등록했어요. moby/moby#38990

실험적

보안

  • mount: BindOptions.NonRecursive를 추가했어요 (API v1.40). moby/moby#38003
  • seccomp: io_pgetevents()를 허용 목록에 추가했어요. moby/moby#38895
  • seccomp: 4.8 이상 커널에서 ptrace(2)를 허용했어요. moby/moby#38137

런타임

  • 비 root 사용자로 dockerd를 실행하는 루트리스 모드를 허용했어요. moby/moby#380050
  • rootless: lxc-user-nic SUID 바이너리에 대한 선택적 지원을 제공해요. docker/engine#208
  • NVIDIA GPU를 지원하기 위해 HostConfig에 DeviceRequests를 추가했어요. moby/moby#38828
  • Windows에서 --device를 지원해요. moby/moby#37638
  • Linux에서 memory.kernelTCP를 지원해요. moby/moby#37043
  • Windows 자격 증명 사양을 엔진에 직접 전달할 수 있어요. moby/moby#38777
  • docker update에서 pids-limit을 지원해요. moby/moby#32519
  • 정확한 capabilities 목록을 지원해요. moby/moby#38380
  • daemon: 기본적으로 'private' ipc 모드를 사용해요. moby/moby#35621
  • daemon: 시작 작업에 세마포어 기반 WaitGroup을 사용하도록 전환했어요. moby/moby#38301
  • docker.sock 소유권을 위해 /etc/group 파일을 파싱하는 대신 idtools.LookupGroup을 사용해서 api.go doesn't respect nsswitch.conf 문제를 수정했어요. moby/moby#38126
  • cli: 다중 참조 필터를 사용할 때 이미지 필터 문제를 수정했어요. moby/moby#38171
  • Golang 1.12.5로 업그레이드했어요. docker/engine#209
  • containerd를 1.2.6으로 업그레이드했어요. moby/moby#39016
  • runc를 1.0.0-rc8, opencontainers/selinux를 v1.2.2로 업그레이드했어요. docker/engine#210
  • google.golang.org/grpc를 v1.20.1로 업그레이드했어요. docker/engine#215
  • 대규모 병렬 컨테이너 생성/제거 시 aufs와 레이어 저장소의 성능을 최적화했어요. moby/moby#39135 moby/moby#39209
  • chroot Tar/Untar에 root를 전달하도록 했어요 (CVE-2018-15664). moby/moby#39292
  • /dev 바인드 마운트와 함께 docker --init을 사용할 때 발생하던 문제를 수정했어요. moby/moby#37665
  • --device-read-bps 옵션 사용 시 장치 번호가 255보다 클 때 올바른 장치 번호를 가져오도록 수정했어요. moby/moby#39212
  • 경로가 분명히 존재하는데 Path does not exist 오류가 나던 문제를 수정했어요. moby/moby#39251

네트워킹

스웜

로깅

  • Windows에서 gcplogs 드라이버를 활성화했어요. moby/moby#37717
  • RFC5424 syslog 형식에 제로 패딩을 추가했어요. moby/moby#38335
  • journald 로그 이벤트에 IMAGE_NAME 속성을 추가했어요. moby/moby#38032

폐지

  • 이미지 매니페스트 v2 schema1을 폐지하고 v2 schema2를 권장해요. 향후 Docker 버전에서는 v2 schema1 지원이 완전히 제거될 예정이에요. moby/moby#39365
  • v1.10 migrator를 제거했어요. moby/moby#38265
  • 자동 선택 시 폐지된 스토리지 드라이버를 건너뛰도록 했어요. moby/moby#38019
  • aufs 스토리지 드라이버를 폐지하고 경고를 추가했어요. moby/moby#38090
  • 17.09 지원을 제거했어요.

폐지된 플래그와 API에 대한 자세한 내용은 폐지 정보에서 대상 제거 날짜를 확인할 수 있어요.

알려진 문제

  • 대규모 클러스터 환경에서 docker information의 Swarm 섹션에 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304) 오류가 포함될 수 있어요. 이는 사용자의 실패나 잘못된 구성 때문이 아니므로 대응이 필요 없어요.
  • 모든 서비스를 새로 재배포할 때 오케스트레이터 포트 충돌이 발생할 수 있어요. 짧은 시간에 swarm 매니저 요청이 너무 많아지면 일부 서비스가 트래픽을 받지 못해 배포 후 404 오류가 발생할 수 있어요.
    • 해결 방법: docker service update --force로 모든 태스크를 재시작하세요.
  • FORWARD 체인에 iptables 규칙이 없어서 HOST에서 트래픽이 나가지 못하는 문제가 있어요. 누락된 규칙은 다음과 같아요:
/sbin/iptables --wait -C FORWARD -o docker_gwbridge -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables --wait -C FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  • 해결 방법: 스크립트와 cron 정의를 사용해 이 규칙을 다시 추가하세요. 스크립트에는 규칙 존재 여부를 확인하는 -C 명령과 규칙을 다시 추가하는 -A 명령이 포함되어야 해요. cron으로 예를 들어 매분마다 실행되도록 하세요.
  • 영향받는 버전: 18.09.1, 19.03.0
  • CVE-2018-15664: 디렉터리 트래버설을 이용한 심링크 교환 공격이에요. 다음 패치에서 제대로 수정되기 전까지는 파일 작업 전에 docker pause로 컨테이너를 일시 중지하세요. moby/moby#39252
  • CVE 완화 조치로 인한 docker cp 회귀 문제가 있어요. docker cp의 소스를 /로 설정하면 오류가 발생해요.

더 알아보기