🔧 Tworzenie i publikowanie własnych obrazów Docker dla aplikacji PHP

Dziś zagłębimy się w proces tworzenia własnych obrazów Docker, publikowania ich na Docker Hub oraz wykorzystywania w projektach i potokach CI/CD.

📋 Spis treści

Dlaczego warto tworzyć własne obrazy Docker?

Tworzenie własnych obrazów Docker oferuje kilka istotnych korzyści:

  1. Standaryzacja: Zapewnienie, że wszyscy deweloperzy i środowiska używają identycznych konfiguracji PHP.
  2. Efektywność: Skrócenie czasów budowania poprzez wstępną instalację popularnych zależności.
  3. Zgodność: Wymuszanie wymagań bezpieczeństwa i zgodności we wszystkich środowiskach.
  4. Specjalizacja: Dostosowanie obrazów do konkretnych potrzeb aplikacji.
  5. Kontrola: Niezależne zarządzanie wersjami PHP i rozszerzeniami od kodu aplikacji.
  6. Skalowalność: Uproszczenie skalowania poprzez standaryzację jednostek wdrożeniowych.

W naszych poprzednich artykułach używaliśmy własnego obrazu PHP (dommin/php-8.4-fpm), który jest wstępnie skonfigurowany z PHP 8.4, popularnymi rozszerzeniami oraz narzędziami takimi jak Node.js i Composer. Zobaczmy, jak ten obraz został stworzony i jak możesz zbudować własny.

Planowanie własnego obrazu PHP

Przed zbudowaniem własnego obrazu, zdefiniuj swoje wymagania:

Kluczowe aspekty do rozważenia:

  1. Obraz bazowy: Wybór odpowiedniego obrazu opartego na Debianie (php:8.4-fpm).
  2. Rozszerzenia PHP: Lista rozszerzeń PHP, których Twoje aplikacje zazwyczaj potrzebują.
  3. Pakiety systemowe: Identyfikacja zależności systemowych dla rozszerzeń PHP i narzędzi.
  4. Dodatkowe narzędzia: Decyzja, czy potrzebujesz narzędzi takich jak Composer, Node.js czy Git.
  5. Uprawnienia użytkownika: Rozważenie sposobu obsługi uprawnień plików między hostem a kontenerem.
  6. Rozmiar vs. funkcjonalność: Balans między rozmiarem obrazu a potrzebną funkcjonalnością.

Przykład wymagań:

Dla aplikacji Laravel możesz potrzebować:

  • PHP 8.4 z FPM
  • Rozszerzenia: PDO, MySQL, PostgreSQL, GD, Zip, BCMath, Redis, itp.
  • Composer
  • Node.js i NPM
  • Git dla zależności Composera

Budowanie własnego obrazu PHP

Przeanalizujmy i ulepszmy Dockerfile używany do budowania naszego własnego obrazu PHP 8.4:

FROM php:8.4-fpm

ARG USER_ID=1000
ARG GROUP_ID=1000

RUN apt-get update && apt-get install -y --no-install-recommends \
    git curl unzip zip \
    libpng-dev libjpeg-dev libwebp-dev libfreetype6-dev \
    libonig-dev libxml2-dev libzip-dev \
    imagemagick libmagick++-dev \
    libpq-dev \
    autoconf g++ make \
    supervisor \
    rsync  \
    wget gnupg2 \
    && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
    && apt-get install -y nodejs \
    && npm install -g npm@latest \
    && pecl install redis imagick xdebug \
    && docker-php-ext-enable redis imagick xdebug \
    && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
    && docker-php-ext-install -j$(nproc) \
        pdo_mysql pdo_pgsql mysqli \
        zip bcmath pcntl intl \
        gd opcache \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list \
    && apt-get update \
    && apt-get install -y google-chrome-stable \
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN groupmod -g ${GROUP_ID} www-data \
    && usermod -u ${USER_ID} -g www-data www-data \
    && mkdir -p /var/www /var/log/supervisor /var/run/supervisor \
    && chown -R www-data:www-data /var/www /var/log/supervisor /var/run/supervisor

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www

EXPOSE 9000

CMD ["php-fpm"]

Wyjaśnienie kluczowych komponentów:

  1. Obraz bazowy: Używa oficjalnego obrazu PHP 8.4 FPM.
  2. Dostosowanie użytkownika: Pozwala na dostosowanie ID użytkownika/grupy do uprawnień hosta.
  3. Zależności systemowe: Instaluje biblioteki wymagane dla rozszerzeń PHP.
  4. Node.js: Instaluje Node.js 22.x i npm do budowania zasobów frontendowych.
  5. Rozszerzenia PHP: Instaluje i włącza popularne rozszerzenia PHP dla Laravel.
  6. Composer: Kopiuje Composera z oficjalnego obrazu Composer.
  7. Uprawnienia: Dostosowuje uprawnienia użytkownika i ustawia katalog roboczy.
  8. Udostępnienie portu: Udostępnia port 9000 dla PHP-FPM.

Publikowanie na Docker Hub

Docker Hub to największe repozytorium obrazów kontenerowych. Publikowanie tam swojego obrazu czyni go dostępnym dla Twojego zespołu, potoków CI/CD i potencjalnie szerszej społeczności.

1. Utwórz konto na Docker Hub

Jeśli jeszcze go nie masz, zarejestruj się na Docker Hub.

2. Utwórz repozytorium

  1. Kliknij "Create Repository" na swoim panelu Docker Hub
  2. Nadaj mu odpowiednią nazwę (np. username/php)
  3. Dodaj opis i ustaw widoczność (publiczne lub prywatne)
  4. Kliknij "Create"

3. Zaloguj się do Docker Hub z CLI

docker login

Wprowadź swoją nazwę użytkownika i hasło Docker Hub po wyświetleniu monitu.

4. Zbuduj swój obraz

docker build -t username/php:8.4-fpm -f ./Dockerfile .

5. Wypchnij swój obraz na Docker Hub

docker push username/php:8.4-fpm

6. Zweryfikuj przesłanie

Odwiedź swoje repozytorium na Docker Hub, aby upewnić się, że obraz został pomyślnie przesłany.

Automatyzacja budowania z GitHub Actions

Ręczne budowanie i wypychanie obrazów może być żmudne. Zautomatyzujmy to za pomocą GitHub Actions.

Oto plik workflow, którego używasz (upewnij się, że Twoje sekrety są poprawnie skonfigurowane):

name: Build images

on:
  push:
    branches:
      - main

env:
  PHP_IMAGE: dommin/php-8.4-fpm:latest

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Build images
        run: docker build -t $PHP_IMAGE -f ./8.4-fpm/Dockerfile .
      - name: Push images
        run: docker push $PHP_IMAGE

Podsumowanie

Budowanie własnych obrazów Docker dla aplikacji PHP oferuje znaczące korzyści w zakresie standaryzacji, efektywności i kontroli. Automatyzując proces budowania i publikacji za pomocą GitHub Actions, możesz zapewnić, że Twoje obrazy są zawsze aktualne i łatwo dostępne dla projektów i potoków CI/CD.

Własne obrazy to potężne narzędzie w arsenale DevOps, umożliwiające standaryzację środowiska PHP w środowiskach deweloperskich, testowych i produkcyjnych, jednocześnie zachowując elastyczność dostosowania do konkretnych wymagań aplikacji.

Kod źródłowy

Śledź mnie na LinkedIn, aby otrzymywać więcej wskazówek o DevOps i Laravel!

Czy chciałbyś dowiedzieć się więcej o Dockerze, PHP lub CI/CD? Daj znać w komentarzach poniżej!

Komentarze (0)
Zostaw komentarz

© 2025 Wszelkie prawa zastrzeżone.