- 도커 데스크톱을 사용하면 다양한 아키텍처의 리눅스 이미지를 빌드할 수 있다.
- 하지만 이들 이미지를 다중 아키텍처 이미지로 만들려면 매니페스트와 함께 이들 이미지를 레지스트리에 푸시해야 한다.
- 매니페스트란 여러 개의 변종 이미지를 하나의 이미지 태그로 묶는 메타데이터를 말하며, 도커 명령행 도구로 만들어 레지스트리에 푸시한다.
- 매니페스트에는 이미지 변종의 목록이 담기는데, 이들 이미지가 먼저 레지스트리에 푸시된 상태여야 한다.
- 결국 전체 절차는 변종 이미지를 모두 푸시한 다음 매니페스트를 작성하고 푸시하는 과정이다.
실습 앞서 빌드한 folder-list 애플리케이션의 변종 이미지를 푸시한다. 여러분은 diamol 단체 계정에 푸시할 권한이 없으므로 이미지 푸시 전에 먼저 여러분의 도커 허브 계정이 포함된 태그를 이미지에 부여해야 한다.
001) # 도커 계정 이름을 환경 변수로 정의한다
002) ➜ dockerId='woogiereal'
003)
004) # 이미지에 도커 계정 이름이 포함된 태그를 부여한다
005) ➜ docker image tag diamol/ch16-folder-list:linux-amd64 "$dockerId/ch16-folder-list:linux-amd64"
006) ➜ docker image tag diamol/ch16-folder-list:linux-arm64 "$dockerId/ch16-folder-list:linux-arm64"
007) ➜ docker image tag diamol/ch16-folder-list:linux-arm "$dockerId/ch16-folder-list:linux-arm"
008)
009) # 이미지를 도커 허브에 푸시한다
010) ➜ docker image push --all-tags "$dockerId/ch16-folder-list"
011) The push refers to repository [docker.io/woogiereal/ch16-folder-list]
012) linux-amd64: digest: sha256:7b8f80a017be9d2affffdc8098e167c0cd0f715927d66111e7578272f613e4ba size: 1151
013) linux-arm: digest: sha256:35fb59cda3c52d45f2ac777e89931683acaee715d2848be0d68947effe22f862 size: 1151
014) linux-arm64: digest: sha256:31b6813c27932b373b85cb176e5eebd086734774dcb1838047dc1cac3e5aeb6d size: 1151
- 레지스트리는 이미지의 대상 아키텍처 정보는 알고 있기 때문에 도커 엔진이 이미지를 내려받으려 할 때 이 정보를 제공한다.
- 나의 환경에서 이 실습을 실행한 결과를 그림 16-8에 실었다.
- 이미지 메타데이터에는 해당 이미지의 대상 아키텍처 종류가 함께 기재된다.
실습 명령행 도구에서 매니페스트 관련 명령을 쓸 수 있는지 확인하라. 이 책의 기반 이미지의 매니페스트 정보를 확인하면 된다.
- 출력된 내용을 보면 이미지 식별을 위한 다이제스트 값과 대상 운영체제, 아키텍처 정보가 표시된다.
001) ➜ docker manifest inspect diamol/base
002) {
003) "schemaVersion": 2,
004) "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
005) "manifests": [
006) {
007) "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
008) "size": 738,
009) "digest": "sha256:c11d706f8c0530dca8b23ab645b8d865175b5b1b9fe17f235d483a626806181b",
010) "platform": {
011) "architecture": "amd64",
012) "os": "linux"
013) }
014) },
015) {
016) "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
017) "size": 738,
018) "digest": "sha256:251dc0254f092f2134fe308c5d60a178ab5dd4498219f077da078db0bfcd8557",
019) "platform": {
020) "architecture": "arm",
021) "os": "linux"
022) }
023) },
024) {
025) "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
026) "size": 738,
027) "digest": "sha256:bd5e8ce69bca67190f789625870f8130d67069c4761b36ed7ecfa6dcbc6fdfd7",
028) "platform": {
029) "architecture": "arm64",
030) "os": "linux"
031) }
032) },
033) {
034) "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
035) "size": 1334,
036) "digest": "sha256:f483dd98e256bf8ef4e160b2021791b2cda33cd650457921ffbd6fc0b1c15638",
037) "platform": {
038) "architecture": "amd64",
039) "os": "windows",
040) "os.version": "10.0.17763.1817"
041) }
042) }
043) ]
044) }
- 001: diamol/base는 이 책에 나오는 다른 모든 이미지의 기반 이미지로 쓰이는 다중 아키텍처 이미지다. 이 이미지는 윈도용은 나노 서버, 리눅스용은 알파인 리눅스를 기반 이미로 한다.
- 009: 다이제스트는 이미지의 유일 식별자로, 해당 변종 이미지 매니페스트의 해시값이다. 이 매니페스트에는 대상 운영체제와 아키텍처 정보도 들어있다.
이미지와 매니페스트, 매니페스트 리스트의 관계
- 이미지와 마찬가지로 매니페스트도 로컬 컴퓨터에 먼저 생성된 후 레지스트리로 푸시된다.
- 엄밀히 말하면 여기서 만드는 것은 매니페스트 리스트(manifest list)로, 두 개 이상의 이미지를 하나의 이미지 태그로 묶어 주는 역할을 한다.
- 모든 이미지는 이미 매니페스트를 하나씩 갖고 있으며 레지스트리에서 이 매니페스트에 담긴 정보를 볼 수 있다.
- 그러나 레지스트리에서 하나 이상의 매니페스트 정보를 반환한다면 그 이미지는 다중 아키텍처 이미지다.
- 비유하자면, 매니페스트 리스트는 이미지 태그의 목록 같은 것이다.
- 그리고 매니페스트 리스트의 이름이 다중 아키텍처 이미지의 이름이 된다.
- 우리가 지금까지 빌드해 온 모든 이미지는 이미지 태그를 통해 대상 운영체제와 아키텍처를 구분했다.
- 태그 없이 같은 이름으로 매니페스트를 만들면, 이 이미지는 Latest 태그가 적용된 다중 아키텍처 이미지가 된다.
- 또 대상 운영체제와 아키텍처 정보에 더해 버전 넘버가 포함된 태그를 부여함으로써 이미지를 푸시할 수도 있다.
- 이 경우 다중 아키텍처 태그는 버전 넘버가 된다.
실습 모든 리눅스 대상 변종 이미지를 모든 매니페스트를 생성한 다음, 도커 허브에 푸시하라. 매니페스트의 이름이 이 다중 아키텍처 이미지의 이미지 태그가 된다.
# 매니페스트 이름과 해당 매니페스트에 포함시킬 모든 이미지 태그를 열거해 매니페스트를 생성한다
➜ docker manifest create "$dockerId/ch16-folder-list" "$dockerId/ch16-folder-list:linux-amd64" "$dockerId/ch16-folder-list:linux-arm64" "$dockerId/ch16-folder-list:linux-arm"
Created manifest list docker.io/woogiereal/ch16-folder-list:latest
# 생성한 매니페스트를 도커 허브에 푸시한다
➜ docker manifest push "$dockerId/ch16-folder-list"
sha256:f9da618f57c76dccd9b29bdc2d9acc94fce8effd2a95ce9bfa2e84806b592da8
# 도커 허브상의 자신의 페이지에서 이미지 목록을 확인한다
- 도키 허브에서 이미지 정보를 확인해 보면 latest 태그가 달린 변종 이미지가 여러 개 있는 것을 볼 수 있다.
- 각각 대상 운영체제와 아키텍처, 이미지 식별을 위한 다이제스트 값이 표시된다.
- 리눅스 도커 엔진을 사용 중인 독자는 이들 이미지를 사용해 바로 컨테이너를 실행할 수 있다.
- 인텔 혹은 AMD 컴퓨터에서는 amd64 버전 이미지
- AWS AI 인스턴스나 라즈베리파이 4를 사용한다면 arm64 버전 이미지
- 라즈베리 파이 3 이전 버전을 사용한다면 arm 버전 이미지를 내려받는다.
- 이들 ARM 프로세서용 이미지는 도커 데스크톱에서 에뮬레이션 기능을 사용해 빌드한 것이다.
- 에뮬레이션 기능이 느리고 네이티브 모드에 비해 Dockerfile 인스트럭션이 다르게 동작하는 경우도 있지만, 상황에 따라서는 정말 유용한 기능이다.