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-netdocker 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 obrazuFROM debian:latest
# Aktualizuj system i zainstaluj niezbędne pakietyRUN 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 8RUN wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpgRUN echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list
# Ponownie aktualizuj systemRUN apt-get update
# Zainstaluj Apache, PHP 8 i moduł PHP dla ApacheRUN 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.iniRUN sed -i 's/;extension=mysqli/extension=mysqli/' /etc/php/8.2/apache2/php.iniRUN sed -i 's/;extension=pdo_mysql/extension=pdo_mysql/' /etc/php/8.2/apache2/php.iniRUN sed -i 's/;extension=gd/extension=gd/' /etc/php/8.2/apache2/php.iniRUN sed -i 's/;extension=rewrite/extension=rewrite/' /etc/php/8.2/apache2/php.ini
# Instalacja composera do instalacji np LARAVELACOPY --from=composer/composer:latest-bin /composer /usr/bin/composer
# Włącz moduł SSL w ApacheRUN a2enmod ssl
# Włącz moduł rewrite w ApacheRUN a2enmod rewrite
# Skopiuj pliki konfiguracyjne do konteneraCOPY apache2.conf /etc/apache2/apache2.confCOPY default-ssl.conf /etc/apache2/sites-available/default-ssl.conf
# Skopiuj własny certyfikat wildcard dla domeny lesinski.itCOPY lesinski.it.key /etc/ssl/private/lesinski.it.keyCOPY lesinski.it.certificate.pem /etc/ssl/certs/lesinski.it.pem
# Skonfiguruj serwer ApacheRUN a2ensite default-ssl.confRUN a2dissite 000-default.conf
# Dodaj użytkownika linuxuser i przypisz do sudoersRUN 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 80EXPOSE 443
# Konfiguracja SSHRUN 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} defaultPidFile ${APACHE_PID_FILE}Timeout 300KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 5User ${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.logLogLevel warnCustomLog ${APACHE_LOG_DIR}/access.log combinedServerSignature OffIncludeOptional sites-enabled/*.confOraz 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.