πŸ“š μ±…/도컀 κ΅κ³Όμ„œ

도컀 κ΅κ³Όμ„œ 16μž₯ μ–΄λ””μ„œλ“  μ‹€ν–‰ν•  수 μžˆλŠ” 도컀 이미지 λ§Œλ“€κΈ° : λ¦¬λˆ…μŠ€, μœˆλ„, 인텔, ARM

MyeongDev 2024. 12. 30. 23:12
728x90
λ°˜μ‘ν˜•

16μž₯ μ–΄λ””μ„œλ“  μ‹€ν–‰ν•  수 μžˆλŠ” 도컀 이미지 λ§Œλ“€κΈ° : λ¦¬λˆ…μŠ€, μœˆλ„, 인텔, ARM

  • 닀쀑 μ•„ν‚€ν…μ²˜ μ΄λ―Έμ§€λŠ” μ—¬λŸ¬ 개의 λ³€μ’… 이미지 ν˜•νƒœλ‘œ λΉŒλ“œλ˜κ³  λ ˆμ§€μŠ€νŠΈλ¦¬μ— ν‘Έμ‹œλœλ‹€.
  • 닀쀑 μ•„ν‚€ν…μ²˜ 이미지λ₯Ό λ‚΄λ €λ°›μœΌλ € μ‹œλ„ν•˜λ©΄, λ„μ»€λŠ” ν˜„μž¬ μ»΄ν“¨ν„°μ˜ μ•„ν‚€ν…μ²˜μ™€ μš΄μ˜μ²΄μ œμ— μΌμΉ˜ν•˜λŠ” λ³€μ’… 이미지λ₯Ό λ°›μ•„ μ˜¨λ‹€.

16.1 닀쀑 μ•„ν‚€ν…μ²˜ 이미지가 μ€‘μš”ν•œ 이유

  • AWS λŠ” ARM ν”„λ‘œμ„Έμ„œλ₯Ό μ‚¬μš©ν•˜λŠ” 가상 머신을 μ œκ³΅ν•œλ‹€.
  • μΈν…”μ΄λ‚˜ AMD ν”„λ‘œμ„Έμ„œλ₯Ό μ‚¬μš©ν•˜λŠ” 가상 머신에 λΉ„ν•΄ 단가가 거의 μ ˆλ°˜μ΄λ‹€.
  • ARM ν”„λ‘œμ„Έμ„œμ˜ μΈμŠ€νŠΈλŸ­μ…˜μ€ 인텔과 AMD ν”„λ‘œμ„Έμ„œμ—μ„œ μ‚¬μš©ν•˜λŠ” x64 μΈμŠ€νŠΈλŸ¬μ…˜κ³Ό ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”λ‹€.
  • 이미지 μ•„ν‚€ν…μ²˜μ™€ μ»΄ν“¨ν„°μ˜ μ•„ν‚€ν…μ²˜κ°€ μΌμΉ˜ν•΄μ•Όλ§Œ 이미지λ₯Ό 내렀받을 수 μžˆλ‹€.
# 64λΉ„νŠΈ ARM ν”„λ‘œμ„Έμ„œμš© λΉŒλ“œ
$ docker build -t diamol/ch16-whoami:linux-arm64 --platform linux/arm64 .

$ docker image inspect diamol/ch16-whoami:linux-arm64 -f '{{.Os}}/{{.Architecture}}'

linux/arm64

$ docker info -f '{{.OSType}}/{{.Architecture}}'

linux/aarch64

16.2 닀쀑 μ•„ν‚€ν…μ²˜ 이미지λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ Dockerfile 슀크립트

닀쀑 μ•„ν‚€ν…μ²˜ 이미지λ₯Ό λ§Œλ“€ 수 μžˆλŠ” 방법은 크게 두가지가 μžˆλ‹€.

  • λ©€ν‹° μŠ€ν…Œμ΄μ§€ Dockerfile 슀크립트λ₯Ό μ΄μš©ν•΄ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ†ŒμŠ€μ½”λ“œλ₯Ό λΉŒλ“œν•˜κ³  νŒ¨ν‚€μ§• ν•œλ‹€.
  • 기반 이미지가 닀쀑 μ•„ν‚€ν…μ²˜ 이미지일 경우, λΉŒλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λ„μ»€μ—”μ§„μ˜ μ•„ν‚€ν…μ²˜μ™€ μΌμΉ˜ν•˜λŠ” 변쒅을 μ‚¬μš©ν•œλ‹€.

λ‹€λ§Œ, λΉŒλ“œμ— μ‚¬μš©λ˜λŠ” 이미지가 닀쀑 μ•„ν‚€ν…μ²˜λ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ„ 경우 μœ„μ˜ 방법은 μ‚¬μš©ν•  수 μ—†λ‹€.

이 경우 Dockerfile 슀크립트λ₯Ό μ•„ν‚€ν…μ²˜λ‚˜ μš΄μ˜μ²΄μ œλ³„λ‘œ λ”°λ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

닀쀑 μ•„ν‚€ν…μ²˜ 이미지λ₯Ό λ§Œλ“€ 경우 Dockerfile 의 CMD μΈμŠ€νŠΈλŸ­μ…˜μ—λŠ” λͺ¨λ“  μš΄μ˜μ²΄μ œμ—μ„œ μ§€μ›ν•˜λŠ” λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

16.3 닀쀑 μ•„ν‚€ν…μ²˜ 이미지λ₯Ό λ ˆμ§€μŠ€νŠΈλ¦¬μ— ν‘Έμ‹œν•˜κΈ°

  • 이미지λ₯Ό 닀쀑 μ•„ν‚€ν…Œμ²˜ μ΄λ―Έμ§€λ‘œ λ§Œλ“€λ €λ©° λ§€λ‹ˆνŽ˜μŠ€νŠΈμ™€ ν•¨κ»˜ 이미지 λ ˆμ§€μŠ€νŠΈλ¦¬μ— ν‘Έμ‹œν•΄μ•Ό ν•œλ‹€.
  • λ©”λ‹ˆνŽ˜μŠ€νŠΈλž€ μ—¬λŸ¬ 개의 λ³€μ’… 이미지λ₯Ό ν•˜λ‚˜μ˜ 이미지 νƒœκ·Έλ‘œ λ¬ΆλŠ” 메타데이터λ₯Ό λ§ν•œλ‹€.
  • λ©”λ‹ˆνŽ˜μŠ€νŠΈμ—λŠ” 이미지 λ³€μ’… λͺ©λ‘μ΄ λ‹΄κΈ°λŠ”λ°, 이미지가 λ¨Όμ € λ ˆμ§€μŠ€νŠΈλ¦¬μ— ν‘Έμ‹œλœ μƒνƒœμ—¬μ•Ό ν•œλ‹€.
  • 즉, λ³€μ’… 이미지λ₯Ό λͺ¨λ‘ ν‘Έμ‹œν•œ λ‹€μŒ λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κ³  ν‘Έμ‹œν•΄μ•Ό ν•œλ‹€.
$ docker image tag diamol/ch16-folder-list:linux-amd64 "$dockerId/ch16-folder-list:linux-amd64"

$ docker image tag diamol/ch16-folder-list:linux-arm64 "$dockerId/ch16-folder-list:linux-arm64"

$ docker image tag diamol/ch16-folder-list:linux-arm "$dockerId/ch16-folder-list:linux-arm"

$ docker image push "$dockerId/ch16-folder-list"

$ docker manifest inspect diamol/base

...
{
	"digest": ...,
	"arch": "amd64",
	"os": "linux"
}
{
	"digest": ...,
	"arch": "arm",
	"os": "linux"
}
{
	"digest": ...,
	"arch": "arm64",
	"os": "linux"
}
{
	"digest": ...,
	"arch": "amd64",
	"os": "windows"
}
  • λ‹€μ΄μ œμŠ€νŠΈλŠ” μ΄λ―Έμ§€μ˜ 유일 μ‹λ³„μžλ‘œ, ν•΄λ‹Ή λ³€μ’… 이미지 λ§€λ‹ˆνŽ˜μŠ€νŠΈμ˜ ν•΄μ‹œκ°’μ΄λ‹€.
  • λ§€λ‹ˆνŽ˜μŠ€νŠΈμ—λŠ” λŒ€μƒ μš΄μ˜μ²΄μ œμ™€ μ•„ν‚€ν…μ²˜ λ“± 이미지에 λŒ€ν•œ λ©”νƒ€λ°μ΄ν„°λ§Œ λ“€μ–΄ μžˆλ‹€.
  • λ§€λ‹ˆνŽ˜μŠ€νŠΈλŠ” λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ €μž₯λœλ‹€.
  • 닀쀑 μ•„ν‚€ν…μ²˜ μ΄λ―Έμ§€λŠ” λ§€λ‹ˆνŽ˜μŠ€νŠΈ 리슀트λ₯Ό κ°–λŠ”λ‹€.
  • λ§€λ‹ˆνŽ˜μŠ€νŠΈ λ¦¬μŠ€νŠΈλŠ” 같은 이미지 νƒœκ·Έλ‘œ λ¬Άμ΄λŠ” μ΄λ―Έμ§€λ“€μ˜ λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό λͺ¨μ€κ²ƒμœΌλ‘œ, μ΄κ²ƒλ˜ν•œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ €μž₯λœλ‹€.
$ 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"

$ docker manifest push "$dockerId/ch16-folder-list"

16.4 도컀 Buildxλ₯Ό μ‚¬μš©ν•΄ 닀쀑 μ•„ν‚€ν…μ²˜ 이미지 λΉŒλ“œν•˜κΈ°

  • Buildx λŠ” docker build λͺ…λ Ήμ˜ ν™•μž₯판 λŠλ‚Œμ΄λ‹€.
  • μ΅œμ ν™”λœ λΉŒλ“œ 엔진이 μ μš©λ˜μ–΄ λΉŒλ“œ μ„±λŠ₯이 λ›°μ–΄λ‚˜λ‹€.
  • docker build λͺ…령을 κ·ΈλŒ€λ‘œ λŒ€μ²΄ν•  수 있고, 크둜슀 ν”Œλž«νΌ λΉŒλ“œλ₯Ό μ§€μ›ν•œλ‹€.
    • κ·ΈλŸ¬λ‚˜, 아직 λͺ¨λ“  λͺ…λ Ήμ–΄λ₯Ό λŒ€μ²΄ν•  순 μ—†λ‹€.
  • 도컀 μ»¨ν…μŠ€νŠΈμ™€ ν†΅ν•©λ˜μ–΄ 있기 λ•Œλ¬Έμ— ν•œ 번의 λͺ…λ ΉμœΌλ‘œ μ—¬λŸ¬ λŒ€μ˜ μ„œλ²„μ—μ„œ λΉŒλ“œλ₯Ό μ§„ν–‰ν•  수 μžˆλ‹€.
  • Buildx λŠ” 아직 μœˆλ„μš° μ»¨ν…Œμ΄λ„ˆλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμœΌλ©°, 단일 파일둜 된 Dockerfile 슀크립트만 μ§€μ›ν•œλ‹€

λΉŒλ“œνŒœ ꡬ성

A. μ»¨ν…μŠ€νŠΈ 생성.

  • 운영 ν™˜κ²½μ—μ„œλŠ” μžλ™ν™” μ„œλ²„κ°€ Build λ₯Ό μƒμ„±ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ λœλ‹€.
  • μ  ν‚¨μŠ€ 같은 μžλ™ν™” μ„œλ²„μ—μ„œ μ»¨ν…μŠ€νŠΈλ₯Ό 생성해야 ν•œλ‹€.
  • μ›ν•˜λŠ” λŒ€μƒ μ•„ν‚€ν…μ²˜λ³„λ‘œ λ…Έλ“œλ₯Ό μ΅œμ†Œ ν•˜λ‚˜μ”© λ°°μΉ˜ν•˜κ³ , 각 λ…Έλ“œλ₯Ό κ°€λ₯΄ν‚€λŠ” 도컀 μ»¨ν…μŠ€νŠΈλ₯Ό λ§Œλ“ λ‹€.

B. Buildx μ„€μΉ˜ 및 ꡬ성

  • Buildx λŠ” 도컀 λͺ…λ Ήν–‰ λ„κ΅¬μ˜ ν”ŒλŸ¬κ·ΈμΈμ΄λ‹€.
  • Docker 18.09 이상 λ²„μ „μ—μ„œλŠ” 기본적으둜 μ œκ³΅λœλ‹€.
$ docker version

$ docker buildx version

$ docker run -rm -it docker/buildx:latest

$ docker-buildx install

$ docker buildx create --use --name ch16 --platform linux/amd64 node1

$ docker buildx create --append --name ch16 --platform linux/386 node2

$ docker buildx ls

C. Buildx λ₯Ό μ‚¬μš©ν•΄ λ³€μ’… 이미지 λΉŒλ“œ 및 ν‘Έμ‹œ

$ docker buildx build -t "$dockerId/ch16-folder-list-2" --platform linux/amd64,linux/386 --push .
  • Buildx λŠ” μ—¬λŸ¬ λΉŒλ”μ— Dockerfile μŠ€ν¬λ¦½νŠΈμ™€ λΉŒλ“œ μ»¨ν…μŠ€νŠΈλ₯Ό λ‚˜λˆ  μ£Όκ³  λΉŒλ“œλ₯Ό μ§€μ‹œν•œλ‹€.
  • 그리고, 각 λΉŒλ”μ˜ 둜그λ₯Ό μˆ˜μ§‘ν•˜κ³  λΉŒλ”μ—μ„œ λΉŒλ“œλœ 이미지λ₯Ό ν‘Έμ‹œν•œλ‹€.
  • λΉŒλ“œ μ„œλ²„λ§ˆλ‹€ μ›ν•˜λŠ” λŒ€μƒ ν”Œλž«νΌμ„ 지정해두면, 이듀 λͺ¨λ‘μ— λΉŒλ“œλ₯Ό μ§€μ‹œν•  수 μžˆλ‹€.

16.5 개발 λ‘œλ“œλ§΅κ³Ό 닀쀑 μ•„ν‚€ν…μ²˜ 이미지

IoT μž₯치λ₯Ό 지원해야 ν•˜λŠ” ν”„λ‘œμ νŠΈ ν˜Ήμ€ ν΄λΌμš°λ“œ μš΄μ˜λΉ„λ₯Ό 쀄여야 ν•˜λŠ” 상황이라면 닀쀑 μ•„ν‚€ν…μ²˜κ°€ ν•„μš”ν•  수 μžˆλ‹€.

Dockerfile μŠ€ν¬λ¦½νŠΈμ— λ‹€μŒ 두 κ°€μ§€ μ‚¬ν•­λ§Œ 미리 μ μš©ν•΄ λ†“λŠ”λ‹€λ©΄, 큰 어렀움 없이 닀쀑 μ•„ν‚€ν…μ²˜ μ΄λ―Έμ§€λ‘œ μ „ν™˜ν•  수 μžˆλ‹€.

  • FROM μΈμŠ€νŠΈλŸ­μ…˜μ— 항상 닀쀑 μ•„ν‚€ν…μ²˜ 이미지λ₯Ό 기반 μ΄λ―Έμ§€λ‘œ μ§€μ •ν•œλ‹€.
  • RUN, CMD μΈμŠ€νŠΈλŸ­μ…˜μ—λŠ” νŠΉμ • μš΄μ˜μ²΄μ œμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
728x90
λ°˜μ‘ν˜•