Przygotowanie Środowiska Programistycznego w Dockerze dla Początkujących

Przygotowanie Środowiska Programistycznego w Dockerze dla Początkujących

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
 
Sprawdzenie listy sieci w dockerze możemy sprawdzić poleceniem 
 
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.

We use cookies
Strona internetowa zbiera informację na potrzeby analizy ruchu odwiedzających (Google Analytics). Czy zgadzasz się na przetwarzanie danych?