๐ ์ฆ๋ถ(+ ๋ณ๋ ฌ) ์์ฑ + ๋ชฉ๋ก =โค๏ธ
buildx๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ qemu๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๊ตญ ๊ตฌ์กฐ์ docker ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ถํ๊ณ ์ด๋ฅผ ๋ค์ค ์์น ์ด๋ฏธ์ง๋ก docker hub์ ๋ฐํํฉ๋๋ค.
๋ฌธ์์ ํฌํจ๋ ๋จ๊ณ:
์์ ํญ๋ชฉ
docker์์ ์คํ๋๋ ํ๋ก์ ํธ๋ฅผ ์์ํด ๋ด ์๋ค.๋ค์๊ณผ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ์ ํฉ๋๋ค.
ํ๋ซํผ.
๋ช ์ธ์).
๋ค์์ ์์ ์์ฉ ํ๋ก๊ทธ๋จ์ด๋ค
// app.js
const http = require('http');
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, () => {
console.log(`Server running at %j`, server.address());
});
์ด๊ฒ์ Dockerfile์ ๋ํ ๋ณด์ถฉ์
๋๋ค. (์ข์ง ์์ต๋๋ค.)FROM node:14-alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
WORKDIR /app
COPY ./app.js ./app.js
CMD [ "node", "/app/app.js" ]
EXPOSE 3000
๋จ๊ณ 1.1: ์ค์
์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ฅผ ์ํํ๋ ค๋ฉด ๋ค์์ ์ค์ ํด์ผ ํฉ๋๋ค.
๋ฑ๋กํ
๋จ๊ณ 1.1.1: ๋ ์ง์คํธ๋ฆฌ
์ฐ์ v2 ๋ฑ๋กํ๋ฅผ ์์ํ์ฌ ์์ ํ์ง ์์
localhost:5000
์ผ๋ก ๊ณต๊ฐํฉ๋๋ค.docker run --rm --name registry -p 5000:5000 registry:2
๋จ๊ณ 1.1.2:qemu,binfmt,buildx
ํ์ฌ
qemu
, binfmt
๊ตฌ์ฑ์ ์ค์ ํ์ฌ qemu
์ ์ฌ์ฉํ๊ณ ํน์ํ buildx
์ปจํ
์ด๋๋ฅผ ์์ฑํ์ฌ ์ก์ธ์คํ ์ ์์ต๋๋ค.ํธ์คํธ ๋คํธ์ํฌ.
sudo apt-get install qemu-user-static
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create \
--name builder \
--driver docker-container \
--driver-opt network=host \
--use
docker buildx inspect builder --bootstrap
tonistiigi/binfmt --install all
์ docker ์ฉ๊ธฐ๋ก์ "๋ถ์์ฉ์ด ์์"์ผ๋ก binfmt
์ ์ค์ ํฉ๋๋ค.ํธ์คํธ์ ๊ตฌ์ฑ
--driver-opt network=host
ํธ์คํธ์์ ์คํ ์ค์ธ buildx
์ปจํ
์ด๋๋ฅผ registry
ํธ์คํธ์ ์ฐ๊ฒฐlocalhost:5000
.buildx inspect --bootstrap
์contianer๋ฅผ ์์ํ์ฌ ์ ๋ณด๋ฅผ ์ธ์ํฉ๋๋ค.๋จ๊ณ 1.2: ๊ตฌ์ถ
์ฐธ๊ณ : ์ผํ๋ก ๊ตฌ๋ถ๋ ํ๋ซํผ ๋ชฉ๋ก์ ์ ๊ณตํ๋ฉด Buildx ์์ฒด๊ฐ ๊ตฌ์ถ์ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค
buildx build
๋ช
๋ น์ --platform
ํ์ง๋ก ํ๋ค.๋ด ์ง๋ฌธ๊ณผ ์ด ๊ธ์ ์ด ๋ชจ๋ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์
--platforms
์ ํฌํจํ๋ค๋ฉด๋ง์ฝ ํ๋ซํผ ์ค ํ๋๊ฐ ์คํจํ๋ค๋ฉด, ์ ์ฒด ๊ตฌ์ถ์ ์คํจ๋ก ํ์๋๊ณ , ์๋ฌด๊ฒ๋ ์ป์ง ๋ชปํ ๊ฒ์ ๋๋ค.
๋ ๋ค๋ฅธ ์ฉ๋ก๋ ์ฌ๋ฌ ๊ฐ์ ์์นํ ๋ฌธ ์ด๋ฏธ์ง์ ํจ๊ป ์์นํ ๋ฌธ์ ํน์ ํ ์ ์ฅ์๋ฅผ ์ ์กํ๊ธฐ๋ฅผ ์ํ ์๋ ์๋ค๋ ๊ฒ์ด๋ค.
์:
docker.io/app/app
, docker.io/arm64v8/app
๋ฐ docker.io/amd64/app
)๋ ๋ค๋ฅธ ์ํฉ์ ๋ด๊ฐ ์ฌ๋ฌ ๋์ ์ค์ ๊ธฐ๊ณ์ ๊ตฌ์ถํ ๊ฒ์ด๋ค. ์ด ๊ธฐ๊ณ๋ค์ ๋ณธ ๊ธฐ๊ณ๊ฐ
arm/v6
, arm/v7
๊ณผ arm64/v8
์ ๊ฐ์ง๊ณ ์๋ค.CPU (์๋ก ๋ค๋ฅธ PI์ ์ ์ฌํ CPU๋ก ๊ตฌ์ฑ๋ ์ง๋จ).
์ด๋ฐ ์์ผ๋ก ๊ตฌ์ถํ๊ณ ์ถ์ ์ด์ ๊ฐ ๋ ๋ง์ ๊ฑฐ์์.๐คท.
ํ์ฌ ์ฐ๋ฆฌ๋ ๋ณธ ์์
buildx
๊ตฌ์ถ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ๋ค๋ฅธ ์ฒด๊ณ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ ์ค๋น๊ฐ ๋์ด ์๋ค.base
alpine
์ด๋ฏธ์ง๋ ๋ค์ ์ํคํ
์ฒ๋ฅผ ์ง์ํฉ๋๋ค.docker buildx build \
--tag localhost:5000/app:linux-amd64 \
--platform linux/amd64 \
--load \
--progress plain \
. > /dev/null 2>&1 &
docker buildx build \
--tag localhost:5000/app:linux-arm-v6 \
--platform linux/arm/v6 \
--load \
--progress plain \
.> /dev/null 2>&1 &
docker buildx build \
--tag localhost:5000/app:linux-arm-v7 \
--platform linux/arm/v7 \
--load \
--progress plain \
.> /dev/null 2>&1 &
docker buildx build \
--tag localhost:5000/app:linux-arm64-v8 \
--platform linux/arm64/v8 \
--load \
--progress plain \
.> /dev/null 2>&1 &
docker buildx build \
--tag localhost:5000/app:linux-ppc64le \
--platform linux/ppc64le \
--load \
--progress plain \
.> /dev/null 2>&1 &
docker buildx build \
--tag localhost:5000/app:linux-s390x \
--platform linux/s390x \
--load \
--progress plain \
.> /dev/null 2>&1 &
wait
์๋ฃ๋๋ฉด docker images
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ณ ํ์ํฉ๋๋ค.$ docker images
...
localhost:5000/app linux-arm64-v8 e3ec56e457e6 About a minute ago 115MB
localhost:5000/app linux-arm-v7 ab770e5be5d1 About a minute ago 106MB
localhost:5000/app linux-ppc64le 3a328d516acf About a minute ago 126MB
localhost:5000/app linux-s390x 73e064c0c3d4 About a minute ago 119MB
localhost:5000/app linux-amd64 f6260fedf498 About a minute ago 116MB
localhost:5000/app linux-arm-v6 5a1fb75b0a45 2 minutes ago 110MB
...
--load
์ด๋ฏธ์ง๋ฅผ ๋ก์ปฌ docker์ ๋ณด๋ผ ํ์๊ฐ ์์ต๋๋ค. buildx
์ ๋ก์ปฌ ๋ฑ๋กํ๋ก ์ง์ ์ ์กํ ์ ์์ต๋๋ค.์ด ์์์, ์ด ๊ทธ๋ฆผ๋ค์ ์ถ๊ฐ ์ ์ฐจ๋ก ๋ฐ์ด๋ฃ์ด์ผ ํฉ๋๋ค
docker push --all-tags -q localhost:5000/app
2๋จ๊ณ: ์ฒดํฌ๋ฆฌ์คํธ
์ด์ ์ฐ๋ฆฌ๋ ์ด ๊ทธ๋ฆผ๋ค์ ํฐ ๋ชฉ๋ก์ ์กฐํฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
docker manifest create --insecure
localhost:5000/app:1.0.0 \
localhost:5000/app:linux-amd64 \
localhost:5000/app:linux-arm-v6 \
localhost:5000/app:linux-arm-v7 \
localhost:5000/app:linux-arm64-v8 \
localhost:5000/app:linux-ppc64le \
localhost:5000/app:linux-s390x
docker manifest push localhost:5000/app:1.0.0
STEP 3.1: Skopeo
๋ง์ง๋ง ๋จ๊ณ๋ ๋ชฉ๋ก ๋ชฉ๋ก์ ๋ณต์ฌํ๊ณ ๋งํฌ๋blob๋ง ๋ณต์ฌํฉ๋๋ค.์ด๋ฅผ ์ํด
skopeo
์ด ํ์ํฉ๋๋ค.์ด๊ฒ์ ์์ฃผ ์ข์ ๋ฑ๋ก ๋๊ตฌ๋ค.
ํผ ์์ค ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๊ฑฐ๋, ubuntu 20.04์ ๋ํด์๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง
kubic
ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ฐธ๊ณ : ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ ํ์๋ ์์ต๋๋ค. ์ค์น ์ง์นจ์ ๋ฐ๋ฅด๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
https://github.com/containers/skopeo/blob/master/install.md
OS="x$(lsb_release --id -s)_$(lsb_release --release -s)"
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/${OS}/ /" > /etc/apt/sources.list.d/skopeop.kubic.list
wget -qO- "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/${OS}/Release.key" | apt-key add -
apt-get update
apt-get install -y skopeo
ํ์ฌ, ์ฐ๋ฆฌ์ ๋ก์ปฌ ๋ฑ๋กํ๊ฐ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๊ฐ ๋ณต์ ๋ฅผ ์๋ํ ๋, skopeo
์ ๋ถํ์ ํ๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ๋ช
ํํ๊ฒ์์ ๋ฑ๋กํ์ ์์ ํ์ง ์๊ฒ ์ฐ๊ฒฐํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
[[registry]]
location = 'localhost:5000'
insecure = true
์ด ํ์ผ์ /etc/containers/registries.conf.d/localhost-5000.conf
์ ์์ฑ๋จ๊ณ 3.2: ๋ณต์
๋ง์ง๋ง ๋จ๊ณ๋
localhost:5000/app:1.0.0
์ hertzg/example:app-1.0.0
์ผ๋ก๋ง ๋ณต์ ํ๋ ๊ฒ์
๋๋ค.์ฐ์ , ๊ทํ๋ ๋ชฉํ ๋ฑ๋กํ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ถ ๊ฒ์ฆ์ ํด์ผ ํ ์๋ ์์ต๋๋ค
skopeo login docker.io
์ด์ ์ ํฌ๊ฐ ๋๋์ด ๊ทธ๋ฆผ์ ๋ณต์ฌํ ์ ์๊ฒ ๋์ด์.skopeo copy \
--all \
docker://localhost:5000/app:1.0.0 \
docker://docker.io/hertzg/example:app-1.0.0
์๊ฐ์ด ์ข ๊ฑธ๋ฆด ์๋ ์์ง๋ง, ์์ฑ๋๋ฉด docker hub์ ๊ฒ์ฌํ๊ฑฐ๋, ๋์์์ ๊ทธ๋ฆผ์ ๋๋๊ทธํ๊ณ ์คํํ ์ ์์ต๋๋ค๊ฑด์ถํ๋ค
docker run --rm -it hertzg/example:app-1.0.0
์ด๋ ๊ฒ๋๊ตฌ์ฑ
ํ์ง ์ฌ์ง
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ์ฆ๋ถ(+ ๋ณ๋ ฌ) ์์ฑ + ๋ชฉ๋ก =โค๏ธ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/hertzg/how-to-build-images-for-multiple-platforms-kind-of-incrementally-using-docker-buildx-50ikํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค