Szybki wstęp o obrazach wieloarchitekturowych
Obrazy wieloarchitekturowe to doskonałe narzędzie, szczególnie przy wdrażaniu aplikacji w środowiskach z różnymi architekturami. Pomimo dominacji architektury x86, coraz większą popularność zyskują procesory ARM, a także pojawiają się urządzenia o architekturze RISC-V. Ponieważ te architektury nie są ze sobą kompatybilne, pojawia się problem uruchomienia obrazów stworzonych dla jednej architektury na urządzeniach z inną architekturą. Na przykład, obraz zbudowany na komputerze z procesorem x86 nie zadziała na Raspberry Pi z procesorem ARM. Częstym rozwiązaniem jest ponowne budowanie obrazu na docelowym urządzeniu, jednak nie jest to wygodne ani optymalne. Tutaj z pomocą przychodzą obrazy wieloarchitekturowe. Docker dostarcza narzędzie do budowania takich obrazów. Proces polega na jednoczesnym tworzeniu obrazów w osobnych emulatorach dla każdej architektury, a na końcu Docker łączy je w jeden wspólny obraz. Dzięki temu otrzymujemy jeden uniwersalny obraz, który można wdrożyć na urządzeniach z różnymi architekturami procesorów.
Od czego zacząć?
Pierwszym krokiem powinno być sprawdzenie, czy obraz bazowy wspiera interesujące nas architektury. Najprościej zrobić to na DockerHub. W liście tagów obrazu znajdziesz informacje o wspieranych architekturach.
Przykładowy projekt
Kolejnym krokiem jest projekt, który chcemy uruchomić. W naszym przykładzie jest to prosty skrypt PHP.
<?php declare(strict_types=1);
$date = new DateTime();
$date->modify('+1 day');
echo 'Tomorrow will be: ' . $date->format('H:i:s d.m.Y') . ' // LASEROVSKY.NET';
Dla takiego prostego skryptu PHP, również Dockerfile jest bardzo prosty i bazuje na oficjalnym obrazie PHP.
FROM php:8.3.11-alpine
COPY ./script.php script.php
CMD ["php", "script.php"]
Standardowe uruchomienie tego projektu wyglądałoby następująco:
docker build --tag laserovsky/docker-multiarch-example:single-arch .
docker run laserovsky/docker-multiarch-example:single-arch
Jednakże, tak zbudowany obraz jest przygotowany tylko dla architektury maszyny, na której został zbudowany — w tym przypadku x86.
buildx
Rozwiązaniem tego problemu jest buildx, który jest częścią Dockera. Dzięki buildx można stworzyć builder wieloarchitekturowy. Aby to zrobić, wystarczy jednorazowo uruchomić polecenie:
docker buildx create --use
Od tego momentu możemy budować obrazy wieloarchitekturowe. Niestety, obrazy zbudowane tym sposobem nie będą widoczne na liście lokalnych obrazów. Dlatego uruchomienie ich tak, jak w poprzednim przykładzie, nie będzie możliwe. Najlepszym rozwiązaniem tego problemu jest zalogowanie się do rejestru Dockera (domyślnie DockerHub, ale można skorzystać z innego rejestru) i zbudowanie obrazu za pomocą buildx z flagą --push. Po zakończeniu budowania, obraz zostanie przesłany do rejestru, skąd będzie można go uruchomić na dowolnym systemie operacyjnym.
docker login
Aby zbudować powyższy projekt dla architektur x86, ARM i RISC-V, wystarczy wykonać:
docker buildx build --push --platform linux/amd64,linux/arm64/v8,linux/riscv64 --tag laserovsky/docker-multiarch-example:multi-arch .
Tak powstały obraz możesz uruchomić na swoim komputrze x86, RaspberryPi na ARM oraz na MangoPi na RISC-V. Obrazy wieloarchitekturowe można budować dla dowolnej liczby architektur, o ile obraz bazowy wspiera te architektury.
Podsumowanie
Budowanie obrazów wieloarchitekturowych to potężne narzędzie, które pozwala na wdrażanie aplikacji na różnych platformach bez konieczności dostosowywania obrazów do każdej z nich. Dzięki Dockerowi i jego narzędziom, takim jak buildx, proces ten jest łatwiejszy niż kiedykolwiek. Mam nadzieję, że ten przewodnik pomógł Ci zrozumieć, jak zacząć budować takie obrazy i jak je wykorzystać w swoich projektach. Obraz który powstał w trakcie pisania tego artykułu dostępny jest do sprawdzenia tutaj.
Dziękuję za przeczytanie! Jeśli chcesz dowiedzieć się więcej na temat konteneryzacji, Dockera lub innych technologii, sprawdź pozostałe artykuły na blogu.