Docker i budowanie obrazow wieloarchitekturowych

Programowanie 10.09.2024
01-primary-blue-docker-logo.png

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.

Lista wspieranych architektur obrazu PHP
Wspierane architektury przez obraz PHP

Przykładowy projekt

Kolejnym krokiem jest projekt, który chcemy uruchomić. W naszym przykładzie jest to prosty skrypt PHP.

/script.php
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.

/Dockerfile
Dockerfile
    
 
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:

bash
    
 
docker build --tag laserovsky/docker-multiarch-example:single-arch . 
docker run laserovsky/docker-multiarch-example:single-arch 

    
Wynik uruchomienia skryptu

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:

bash
    
 
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.

bash
    

docker login

    

Aby zbudować powyższy projekt dla architektur x86, ARM i RISC-V, wystarczy wykonać:

bash
    
 
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.