Docker to narzędzie, które umożliwia wdrażanie aplikacji w odizolowanych kontenerach, co pozwala na efektywne zarządzanie środowiskiem programistycznym oraz eliminację problemów związanych z różnicami między środowiskami. W tym artykule omówimy, jak przygotować środowisko programistyczne w Dockerze, krok po kroku, dla początkujących. Skupimy się na konfiguracji sieci, bazy danych MySQL, narzędzi administracyjnych oraz serwera aplikacji opartego na Apache i PHP. Zdaję sobie sprawę, że nie jest to podejście w 100% zgodne z tym co robi się w firmach, ale na potrzeby nauki jest w sam raz.
1. Tworzenie Sieci Dockerowej
Pierwszym krokiem jest utworzenie sieci Dockerowej, która pozwoli na komunikację między kontenerami. Wykonujemy to poleceniem:
docker network create dev-net
docker network ls
2. Konfiguracja Kontenera MySQL
Następnie konfigurujemy kontener MySQL, który będzie służył jako baza danych dla naszej aplikacji. Wykorzystujemy poniższą komendę:
docker container run --detach --restart=always --name mariadb --network dev-net -p 3306:3306 -v mariadb-data:/var/lib/mysql --env MARIADB_USER=dbuser --env MARIADB_PASSWORD=T@jneHaslo --env MARIADB_ROOT_PASSWORD=TajneHas1o! mariadb:latest
3. Konfiguracja Kontenera phpMyAdmin
Aby zarządzać bazą danych MySQL, możemy skorzystać z narzędzia phpMyAdmin. Uruchamiamy kontener (z obsługą SSL) phpMyAdmin poniższą komendą:
docker container run --name phpmyadmin --restart=always -p 8081:443 -e UPLOAD_LIMIT=256M --link mariadb:db --network dev-net -v /etc/certs/lesinski.it:/etc/certs/lesinski.it:ro ravczy:phpmyadmin_ssl
Po wydania polecenia docekr container ls
powinny już pojawić się nasze dwa kontenery (z bazą danych oraz phpmyadminem połączone siecią net-dev)
4. Konfiguracja Serwera Aplikacji
Nadszedł czas, aby przygotować nasz serwer aplikacji. Wykorzystamy plik Dockerfile, aby zdefiniować środowisko kontenera. Tak przedstawia się plik stworzony przeze mnie, którego używam do nauki programowania:
# Użyj oficjalnego obrazu systemu Debian jako podstawowego obrazu
FROM debian:latest
# Aktualizuj system i zainstaluj niezbędne pakiety
RUN apt-get update && apt-get install -y \
lsb-release \
ca-certificates \
apt-transport-https \
software-properties-common \
gnupg2 \
iputils-ping \
wget \
openssh-server \
sudo
# Dodaj repozytorium PHP 8
RUN wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
RUN echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list
# Ponownie aktualizuj system
RUN apt-get update
# Zainstaluj Apache, PHP 8 i moduł PHP dla Apache
RUN apt-get install -y \
apache2 \
php8.2 \
libapache2-mod-php8.2 \
openssl \
nano \
php8.2-mysql \
php8.2-pdo \
php8.2-gd \
php8.2-xml \
php8.2-curl \
unzip
# Odkomentuj rozszerzenia w pliku php.ini
RUN sed -i 's/;extension=mysqli/extension=mysqli/' /etc/php/8.2/apache2/php.ini
RUN sed -i 's/;extension=pdo_mysql/extension=pdo_mysql/' /etc/php/8.2/apache2/php.ini
RUN sed -i 's/;extension=gd/extension=gd/' /etc/php/8.2/apache2/php.ini
RUN sed -i 's/;extension=rewrite/extension=rewrite/' /etc/php/8.2/apache2/php.ini
# Instalacja composera do instalacji np LARAVELA
COPY --from=composer/composer:latest-bin /composer /usr/bin/composer
# Włącz moduł SSL w Apache
RUN a2enmod ssl
# Włącz moduł rewrite w Apache
RUN a2enmod rewrite
# Skopiuj pliki konfiguracyjne do kontenera
COPY apache2.conf /etc/apache2/apache2.conf
COPY default-ssl.conf /etc/apache2/sites-available/default-ssl.conf
# Skopiuj własny certyfikat wildcard dla domeny lesinski.it
COPY lesinski.it.key /etc/ssl/private/lesinski.it.key
COPY lesinski.it.certificate.pem /etc/ssl/certs/lesinski.it.pem
# Skonfiguruj serwer Apache
RUN a2ensite default-ssl.conf
RUN a2dissite 000-default.conf
# Dodaj użytkownika linuxuser i przypisz do sudoers
RUN useradd -m -p $(openssl passwd -1 "TajneHasl0!")
linuxuser
RUN usermod -u 1026
linuxuser
RUN chsh -s /bin/bash
linuxuser
RUN echo "linuxuser ALL=PASSWD: ALL" > /etc/sudoers.d/linuxuser
# Otwórz porty 80 (HTTP) i 443 (HTTPS)
EXPOSE 80
EXPOSE 443
# Konfiguracja SSH
RUN mkdir /var/run/sshd
#RUN echo 'root:pass' | chpasswd
#RUN sed -i 's/#PermitRootLogin prohibity-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# Otwórz port 22 (SSH)
EXPOSE 22
# Uruchom serwer Apache w trybie dla pojedynczego procesu (-D FOREGROUND)
#CMD ["apachectl", "-D", "FOREGROUND"]
CMD service ssh start && apachectl -D FOREGROUND
Powyższy plik można zmodyfikować usuwając lub dodając kolejne komendy. Nie każdy może potrzebować obsługi SSL, ja chciałem akurat by połączenie z serwerem było szyfrowane.
Powyższy plik Dockerfile wrzucamy do własnego katalogu i dorzucamy jeszcze dwa pliki (konfigurracja apache oraz konfiguracja wirtualnych hostów).
Plik apache2.conf
ServerRoot "/etc/apache2"
Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
ServerSignature Off
IncludeOptional sites-enabled/*.conf
Oraz konfiguracja wirtualnego hosta
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
ServerName laravel.lesinski.it
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/certs/lesinski.it/lesinski.it.certificate.pem
SSLCertificateKeyFile /etc/certs/lesinski.it/lesinski.it.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
Zwracam uwagę, że to są moje przykłady, których używam do swoich potrzeb i nie odpowiadam za nieprawidłowe użycie powyższej dokumentacji.
Przygotowanie środowiska programistycznego w Dockerze może na początku wydawać się skomplikowane, ale dzięki odpowiedniej konfiguracji krok po kroku, możemy stworzyć izolowane i funkcjonalne środowisko, które ułatwi rozwijanie i testowanie aplikacji. Warto zrozumieć każdy krok konfiguracji, aby w pełni wykorzystać potencjał narzędzia Docker.
Pamiętaj również, że w powyższym artykule skupiliśmy się na podstawowych krokach przygotowania środowiska programistycznego w Dockerze. Istnieje wiele zaawansowanych możliwości, które można wykorzystać do optymalizacji procesu i dostosowania środowiska do swoich potrzeb.