Docker Engine 25.0 릴리스 노트

Docker Engine 25.0 릴리스 노트

이 페이지에서는 Docker Engine 25.0 버전에서 달라진 점, 새로 추가된 기능, 알려진 문제, 그리고 수정된 내용을 정리해서 알려드릴게요. 어떤 부분이 바뀌었는지 궁금하신 분들은 차근차근 따라와 보시면 됩니다.

출처: 공식문서

25.0.5

2024-03-19

이번 릴리스에서 어떤 변경 사항들이 있었는지, 전체 pull request와 이슈 목록은 아래 GitHub 마일스톤에서 확인하실 수 있어요.

보안

이번 릴리스에는 CVE-2024-29018 보안 수정이 포함되어 있어요. 이 취약점은 권위 있는 DNS 서버를 통해 'internal' 네트워크에서 데이터가 외부로 유출될 수 있는 문제였어요.

버그 수정 및 개선

  • CVE-2024-29018: 'internal' 네트워크에만 연결된 컨테이너의 경우, 외부 DNS 서버로 요청을 전달하지 않도록 수정했어요. 이전에는 호스트의 DNS 서버가 systemd의 127.0.0.53 같은 루프백 주소에서 실행 중이면 요청이 외부로 전달되곤 했는데, 이제는 그런 동작을 막아요. moby/moby#47589

  • plugin: UserNS 환경에서 실행할 때 /etc/hosts 마운트가 제대로 동작하지 않던 문제를 고쳤어요. moby/moby#47588

  • rootless: open /etc/docker/plugins: permission denied 오류가 발생하던 문제를 해결했어요. moby/moby#47587

  • 여러 개의 docker build를 동시에 실행할 때 디스크 공간이 누수되던 문제를 수정했어요. moby/moby#47527

25.0.4

2024-03-07

이번 릴리스의 전체 변경 사항은 아래 GitHub 마일스톤에서 확인하실 수 있어요.

버그 수정 및 개선

  • Windows의 기본 "nat" 네트워크에서 컨테이너 DNS 이름이 동작하지 않던 문제를 복구했어요. moby/moby#47490
  • docker start 명령을 --checkpoint 옵션과 함께 사용할 때 실패하던 문제를 고쳤어요. moby/moby#47466
  • 기존 스웜 네트워크에 새로운 검증 규칙을 강제로 적용하지 않도록 했어요. moby/moby#47482
  • 내부 브리지 네트워크에서 호스트와 컨테이너 간 IP 연결이 되지 않던 문제를 복구했어요. moby/moby#47481
  • v25.0에서 도입된 회귀 문제를 수정했어요. 클래식 빌더가 Linux가 아닌 OS에서 생성된 xattrs가 포함된 tar 아카이브를 추가하지 못하던 문제였어요. moby/moby#47483
  • containerd 이미지 저장소: 이미지 pull 시 Pulling fs layer status 메시지가 출력되지 않던 문제를 고쳤어요. moby/moby#47484
  • API: 이전 버전과의 호환성을 유지하기 위해, 오래된 클라이언트(API 버전 < v1.44)를 사용할 때 읽기 전용 마운트가 기본적으로 비재귀적으로 동작하도록 했어요. moby/moby#47393
  • API: GET /images/{id}/json 응답에서 이미지 config에 Created 필드가 없는 경우, 이전에는 0001-01-01T00:00:00Z로 표시되던 것을 이제 필드를 생략하도록 변경했어요. moby/moby#47451
  • API: API 버전 <= 1.43에서는 GET /images/{id}/json 응답의 누락된 Created 필드를 0001-01-01T00:00:00Z로 채워 넣도록 했어요. moby/moby#47387
  • API: API 소켓 연결 실패 시 API 버전 협상 실패로 잘못 보고되던 회귀 문제를 수정했어요. moby/moby#47470
  • API: 컨테이너 생성 API 요청에서 컨테이너 전체 MAC 주소가 지정되었지만 NetworkMode 이름이나 ID가 NetworkSettings.Networks에 사용된 이름이나 ID와 다른 경우, 제공된 엔드포인트 구성을 유지하도록 했어요. moby/moby#47510

패키징 업데이트

25.0.3

2024-02-06

이번 릴리스의 전체 변경 사항은 아래 GitHub 마일스톤에서 확인하실 수 있어요.

버그 수정 및 개선

  • containerd 이미지 저장소: 콘텐츠 저장소에서 매니페스트를 찾을 수 없을 때 docker image history 명령이 실패하던 문제를 고쳤어요. moby/moby#47348

  • 컨테이너를 재시작할 때 생성된 MAC 주소가 복원되지 않도록 하고, 사용자가 설정한 MAC 주소는 유지되도록 했어요. moby/moby#47304

참고

  • Docker Engine 25.0.0 버전으로 생성된 컨테이너는 MAC 주소가 중복될 수 있어요. 이런 컨테이너는 다시 생성해 주셔야 해요.
  • Docker Engine 25.0.0 또는 25.0.1에서 사용자 정의 MAC 주소로 생성된 컨테이너는 25.0.2 버전에서 시작할 때 새 MAC 주소를 받게 돼요. 이것도 역시 컨테이너를 다시 생성해야 해요.
  • docker save <image>@<digest> 명령이 매니페스트가 없는 OCI 아카이브를 생성하던 문제를 수정했어요. moby/moby#47294

  • RHEL 및 CentOS 7에서 MTU가 1500보다 큰 브리지 네트워크를 생성할 수 없던 버그를 고쳤어요. moby/moby#47308, moby/moby#47311

  • internal 네트워크에서 컨테이너 간 통신이 안 되던 버그를 수정했어요. moby/moby#47303

  • 데몬 옵션인 ipv6 값이 무시되던 버그를 고쳤어요. moby/moby#47310

  • 다이제스트 리비전을 사용해 pull을 설치하려고 할 때 패닉이 발생하던 버그를 수정했어요. moby/moby#47323

  • 관리되는 containerd 슈퍼바이저에서 발생할 수 있는 경쟁 조건(race condition)을 수정했어요. moby/moby#47313

  • systemd 버전 255에서 journald 로그 드라이버가 컨테이너 로그를 제대로 따라가지 못하던 문제를 고쳤어요. moby/moby#47243

  • seccomp: 커널 v5.17 ~ v6.7에서 추가된 syscall을 포함하도록 기본 seccomp 프로필을 업데이트했어요. 이로써 containerd에서 사용하는 프로필과 일치하게 됐어요. moby/moby#47341

  • Windows: 호스트 버전보다 오래된 Windows 버전을 기반으로 이미지를 빌드할 때 캐시가 사용되지 않던 문제를 수정했어요. moby/moby#47307, moby/moby#47337

패키징 업데이트

25.0.2

2024-01-31

이번 릴리스의 전체 변경 사항은 아래 GitHub 마일스톤에서 확인하실 수 있어요.

보안

이번 릴리스에는 Docker Engine 및 관련 구성 요소에 영향을 주는 다음과 같은 CVE 보안 수정이 포함되어 있어요.

CVE 구성 요소 수정 버전 심각도
CVE-2024-21626 runc 1.1.12 높음, CVSS 8.6
CVE-2024-23651 BuildKit 1.12.5 높음, CVSS 8.7
CVE-2024-23652 BuildKit 1.12.5 높음, CVSS 8.7
CVE-2024-23653 BuildKit 1.12.5 높음, CVSS 7.7
CVE-2024-23650 BuildKit 1.12.5 중간, CVSS 5.5
CVE-2024-24557 Docker Engine 25.0.2 중간, CVSS 6.9

위 취약점들이 잠재적으로 미칠 수 있는 영향은 다음과 같아요.

  • 호스트 파일시스템에 대한 무단 접근
  • 빌드 캐시 무결성 손상
  • CVE-2024-21626의 경우, 완전한 컨테이너 탈출로 이어질 수 있는 시나리오

이번 릴리스에서 해결된 보안 문제에 대한 자세한 내용은 블로그 게시물을 참고해 주세요. 각 취약점에 대한 자세한 정보는 관련 보안 권고를 확인하시면 돼요.

패키징 업데이트

25.0.1

2024-01-23

이번 릴리스의 전체 변경 사항은 아래 GitHub 마일스톤에서 확인하실 수 있어요.

버그 수정 및 개선

  • API: Docker Engine v25.0으로 업그레이드하기 전에 생성된 잘못된 네트워크 구성을 가진 컨테이너에 대해 잘못된 HTTP 상태 코드가 반환되던 문제를 수정했어요. moby/moby#47159
  • 컨테이너의 IP 주소를 기반으로 생성된 MAC 주소가, 생성된 IP/MAC 주소가 재사용된 경우 컨테이너가 중지되고 재시작될 때 다시 생성되도록 했어요. moby/moby#47171
  • 빌드 중에 host-gateway-ip가 설정을 통해 지정되지 않았을 때 동작하지 않던 문제를 고쳤어요. moby/moby#47192
  • 컨테이너 이름을 두 번 변경할 수 없던 버그를 수정했어요. moby/moby#47196
  • 컨테이너를 inspect할 때 네트워크 별칭에 짧은 ID가 추가되던 문제를 고쳤어요. moby/moby#47182
  • 원격 빌드 컨텍스트가 Git 저장소인지 감지하는 데 문제가 있던 것을 수정했어요. moby/moby#47136
  • OCI 매니페스트에서 레이어 순서가 잘못되던 문제를 고쳤어요. moby/moby#47150
  • addr 또는 ip 마운트 옵션을 전달할 때 볼륨 마운트 오류가 발생하던 문제를 수정했어요. moby/moby#47185
  • 잘못된 네임스페이스로 인해 확장 속성을 설정할 수 없을 때 표시되는 오류 메시지를 개선했어요. moby/moby#47178
  • Swarm: start_interval이 컨테이너 구성에 전달되지 않던 문제를 수정했어요. moby/moby#47163

패키징 업데이트

25.0.0

2024-01-19

이번 릴리스의 전체 변경 사항은 아래 GitHub 마일스톤에서 확인하실 수 있어요.

참고

이전 Docker Engine 버전에서는 재귀 마운트(하위 마운트)가 읽기 전용 마운트를 지정해도 항상 쓰기 가능 상태로 마운트되었어요. 그런데 v25.0.0부터는 커널 버전 5.12 이상을 사용하는 호스트에서 동작이 변경되었어요. 이제 읽기 전용 바인드 마운트는 기본적으로 재귀적으로 읽기 전용이 돼요.

이전 릴리스와 동일한 동작을 원하신다면 --mount 플래그에 bind-recursive 옵션을 지정하면 돼요.

$ docker run --mount type=bind,src=SRC,dst=DST,readonly,bind-recursive=writable IMAGE

이 옵션은 -v 또는 --volume 플래그에서는 지원되지 않아요. 자세한 내용은 Recursive mounts 문서를 참고해 주세요.

새로운 기능

  • 이제 데몬이 systemd의 기본 LimitNOFILE 값을 사용해요. 이전 Docker Engine 버전에서는 이 제한이 infinity로 설정되어 있었어요. 그런데 최근 systemd 버전에서 하드 리미트가 증가하면서, ulimit에 따라 동작을 조정하는 프로그램들이 많은 메모리를 소비하는 문제가 발생했어요. moby/moby#45534

    새로운 설정은 컨테이너가 호스트에서 실행되는 프로그램과 동일하게 동작하도록 만들어요. 다만 소프트 리미트를 기준으로 잘못된 가정을 하는 프로그램은 오동작할 수도 있어요. 이전 동작으로 되돌리려면 LimitNOFILE=1048576으로 설정하면 됩니다.

    이 변경 사항은 현재 docker build에서 BuildKit을 docker 드라이버로 사용할 때 생성되는 빌드 컨테이너에만 영향을 줘요. Docker Engine v29.0(containerd v2.1.5)부터는 이 제한이 빌드 컨테이너뿐만 아니라 모든 컨테이너에 적용될 예정이에요.

    systemd v240 이상에서 더 높은 ulimit로 인해 문제가 발생한다면, 시스템 drop-in 또는 override 파일을 추가해서 ulimit 설정을 직접 구성해 보시는 것도 좋아요. Flatcar Container Linux 문서에 이 주제에 대한 자세한 설명이 잘 나와 있으니 참고해 보세요.

  • OpenTelemetry 추적 기능이 추가되었어요. moby/moby#45652, moby/moby#45579

  • Linux에서 CDI 디바이스 지원이 추가되었어요. moby/moby#45134, docker/cli#4510, moby/moby#46004

  • 컨테이너 시작 기간 동안 헬스체크에 사용할 추가 간격을 지정할 수 있게 되었어요. moby/moby#40894, docker/cli#4405, moby/moby#45965

  • dockerd--log-format 플래그가 추가되어 로그 형식을 text(기본값) 또는 JSON으로 제어할 수 있어요. moby/moby#45737

  • 재귀적 읽기 전용 마운트를 지원해요. moby/moby#45278, moby/moby#46037

  • docker image ls --filter=until=<timestamp> 명령으로 타임스탬프 기반 이미지 필터링을 지원해요. moby/moby#46577

버그 수정 및 개선

  • API: ValidateRestartPolicy에서 잘못된 정책에 대한 오류 메시지를 수정했어요. moby/moby#46352
  • API: /info 엔드포인트가 singleflight를 사용하도록 업데이트했어요. moby/moby#45847
  • -f로 Dockerfile 파일명을 지정하면서 동시에 stdin을 사용할 때 오류 메시지가 표시되도록 했어요. docker/cli#4346
  • --network 긴 형식에서 mac-addresslink-local-ip 필드를 지원해요. docker/cli#4419
  • docker container createdocker run 명령에서 여러 개의 --network 플래그를 지정할 수 있게 되었어요. moby/moby#45906
  • IPv6 서브넷이 지정되면 네트워크에서 IPv6를 자동으로 활성화하도록 했어요. moby/moby#46455
  • IPv6 전송을 통한 오버레이 네트워크를 지원해요. moby/moby#46790
  • 구성 리로드가 더 견고해졌어요. 리로드 과정에서 오류가 발생하면 어떤 구성 변경도 적용되지 않아요. moby/moby#43980
  • 라이브 복원(Live restore): 자동 제거(docker run --rm)로 설정된 컨테이너가 엔진 재시작 시 더 이상 강제로 제거되지 않아요. moby/moby#46857
  • 라이브 복원: 라이브 복원된 컨테이너는 데몬이 재시작될 때 헬스체크 시작 기간을 다시 부여받아요. moby/moby#47051
  • 컨테이너 헬스 상태를 디스크에 덜 자주 기록하여 플래시 저장 장치의 마모를 줄였어요. moby/moby#47044
  • 네트워크 이름이 고유하도록 보장했어요. moby/moby#46251
  • overlay2 레이어 메타데이터가 올바르게 유지되도록 했어요. moby/moby#46471
  • 이미지 pull 시 Downloading 진행 메시지가 제대로 표시되도록 수정했어요. moby/moby#46515
  • NetworkConnectContainerCreate의 데이터 검증을 개선하고, 모든 검증 오류를 한 번에 반환하도록 했어요. moby/moby#46183
  • IPv6 및 ip6tables가 활성화된 경우 com.docker.network.host_ipv4 옵션이 동작하도록 수정했어요. moby/moby#46446
  • containerd가 중지된 경우 데몬의 cleanupContainer가 제대로 동작하도록 수정했어요. moby/moby#46213
  • libnetwork 오류에 대해 잘못된 HTTP 상태 코드가 반환되던 문제를 수정했어요. moby/moby#46146
  • images/json API 필터 및 이미지 목록과 관련된 여러 문제를 수정했어요. moby/moby#46034
  • CIFS 볼륨이 FQDN을 올바르게 해석하도록 수정했어요. moby/moby#46863
  • userland-proxy-path 데몬 구성 옵션의 검증을 개선했어요. 이제 포트 매핑으로 컨테이너를 시작할 때 오류가 발생하는 대신, 데몬 시작 시 검증이 이루어져요. moby/moby#47000
  • 네트워크 모드가 짧은 네트워크 ID인 경우 컨테이너 인터페이스의 MAC 주소를 설정하도록 했어요. moby/moby#46406
  • 빌드 출력에서 사용되지 않은 빌드 인수를 표시하기 전에 정렬하도록 했어요. moby/moby#45917
  • docker image save의 tarball 출력이 이제 OCI를 준수해요. moby/moby#44598
  • 암호화된 오버레이 네트워크를 위해 데몬이 더 이상 INPUT iptables 체인 끝에 ACCEPT 규칙을 추가하지 않아요. 방화벽 구성에 따라 들어오는 암호화된 오버레이 네트워크 트래픽을 허용하는 규칙이 필요할 수 있어요. moby/moby#45280
  • 확장 속성이 있는 레이어를 호환되지 않는 파일시스템에 풀면, 확장 속성을 조용히 버리는 대신 이제 실패하도록 했어요. moby/moby#45464
  • 데몬 MTU 옵션을 BridgeConfig로 업데이트하고 Windows에서는 경고를 표시하도록 했어요. moby/moby#45887
  • 네트워크 생성 시 IPAM 구성을 검증해요. 또한 이번 릴리스 이전에 생성된 네트워크 중 --ip-range--subnet보다 큰 경우 자동으로 수정해요. moby/moby#45759
  • 내부 네트워크에만 연결된 컨테이너는 이제 기본 경로가 설정되지 않아서 connect syscall이 빠르게 실패해요. moby/moby#46603
  • containerd 이미지 저장소: push, pull, save에 대한 이미지 이벤트를 추가했어요. moby/moby#46405
  • containerd 이미지 저장소: 레거시 schema1 이미지 pull을 지원해요. moby/moby#46513
  • containerd 이미지 저장소: 모든 태그 push를 지원해요. moby/moby#46485
  • containerd 이미지 저장소: 레지스트리 토큰을 지원해요. moby/moby#46475
  • containerd 이미지 저장소: 이미지를 사용하는 컨테이너 수를 표시하는 기능을 추가했어요. moby/moby#46511
  • containerd 이미지 저장소: Dockerfile의 ONBUILD, MAINTAINER, HEALTHCHECK 명령과 관련된 버그를 수정했어요. moby/moby#46313
  • containerd 이미지 저장소: Pulling from 진행 메시지가 제대로 표시되도록 수정했어요. moby/moby#46494
  • containerd 이미지 저장소: sha256: 접두사를 사용한 잘린 ID로 이미지를 참조할 수 있게 되었어요. moby/moby#46435
  • containerd 이미지 저장소: docker images 명령이 기본적으로 중간 레이어를 표시하지 않도록 수정했어요. moby/moby#46423
  • containerd 이미지 저장소: 이미지를 가져올 때 지정된 플랫폼이 존재하는지 확인하는 로직을 수정했어요. moby/moby#46495
  • containerd 이미지 저장소: 클래식 빌더에서 여러 개의 ADD 또는 COPY 명령을 사용할 때 발생하던 오류를 수정했어요. moby/moby#46383
  • containerd 이미지 저장소: 이미지를 가져올 때 스택 오버플로 오류가 발생하던 문제를 수정했어요. moby/moby#46418
  • containerd 이미지 저장소: docker pull 진행 출력을 개선했어요. moby/moby#46412
  • containerd 이미지 저장소: 이미지 push 후 태그, 다이제스트, 크기를 출력하도록 했어요. moby/moby#46384
  • containerd 이미지 저장소: UpdateConfig에서 패닉이 발생하던 문제를 제거했어요. moby/moby#46433
  • containerd 이미지 저장소: 이미지 태그가 다이제스트와 유사한 경우 오류를 반환하도록 했어요. moby/moby#46492
  • containerd 이미지 저장소: docker image ls 명령이 이제 올바른 이미지 생성 시간과 날짜를 표시해요. moby/moby#46719
  • containerd 이미지 저장소: 사용자 네임스페이스 설정 처리와 관련된 문제를 수정했어요. moby/moby#46375
  • containerd 이미지 저장소: 모든 태그 pull(docker pull -a)을 지원해요. moby/moby#46618
  • containerd 이미지 저장소: 이미지 참조의 도메인 이름을 기본 레지스트리 인증 도메인으로 사용하도록 했어요. moby/moby#46779

패키징 업데이트

제거된 기능

  • API: GET /images/jsonGET /images/{id}/json 엔드포인트에서 VirtualSize 필드를 제거했어요. moby/moby#45469
  • 더 이상 사용되지 않는 devicemapper 스토리지 드라이버를 제거했어요. moby/moby#43637
  • 더 이상 사용되지 않는 오케스트레이터 옵션을 제거했어요. docker/cli#4366
  • Debian Upstart init 시스템 지원을 제거했어요. moby/moby#45548, moby/moby#45551
  • --oom-score-adjust 데몬 옵션을 제거했어요. moby/moby#45484
  • 더 이상 사용되지 않는 ~/.dockercfg 파일에 대한 경고를 제거했어요. docker/cli#4281
  • logentries 로깅 드라이버를 제거했어요. moby/moby#46925

사용 중단 예정

  • API 버전 1.24 미만은 더 이상 사용되지 않아요. 사용 중단 공지
  • docker searchIsAutomated 필드와 is-automated 필터는 더 이상 사용되지 않아요. 사용 중단 공지
  • API: /images/{id}/json(docker image inspect)의 ContainerContainerConfig 속성은 더 이상 사용되지 않아요. moby/moby#46939

알려진 제한 사항

tar 파일의 확장 속성

이번 릴리스에서는 tar 아카이브를 처리하는 코드가 더 엄격해졌어요. 확장 속성(xattr)을 쓰지 못할 때 오류를 발생시키도록 변경되었어요. macOS의 tar 구현은 기본적으로 tar 파일을 만들 때 추가 확장 속성을 생성해요. 그런데 이러한 속성 접두사는 유효한 Linux xattr 네임스페이스 접두사가 아니기 때문에, Docker가 해당 파일을 처리하려고 하면 오류가 발생해요. 예를 들어, Dockerfile의 ADD 명령으로 tar 파일을 사용하려고 하면 다음과 같은 오류 메시지가 나타날 수 있어요.

failed to solve: lsetxattr /sftp_key.ppk: operation not supported

확장 속성 검증과 관련된 오류 메시지는 v25.0.1에서 더 많은 컨텍스트를 포함하도록 개선되었지만, Docker가 해당 파일을 처리할 수 없는 제한은 여전히 남아 있어요. macOS tar를 기본 인자로 생성한 tar 파일을 Docker에서 사용하면 오류가 발생할 거예요.

macOS에서 생성된 tar 파일을 Docker에서 사용해야 한다면 다음과 같은 방법을 시도해 볼 수 있어요.

  • macOS tar 명령에 --no-xattr 플래그를 사용해서 모든 확장 속성을 제거하세요. 확장 속성을 보존해야 한다면 이 방법은 권장되지 않아요.

  • macOS에서 tarball을 만들 때 기본 tar 대신 gnu-tar를 설치해서 사용하세요. Homebrew로 gnu-tar를 설치하려면 다음 명령을 실행하면 돼요.

$ brew install gnu-tar

설치가 끝나면 gnu-tar 바이너리를 PATH에 추가해 주세요. 예를 들어 .zshrc 파일을 업데이트하면 됩니다.

$ echo 'PATH="/opt/homebrew/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc

더 알아보기 (Learn more)