Docker – łączymy kontener MySQL z kontenerem Apache/PHP oraz instalacja WordPress’a

 Docker – łączymy kontener MySQL z kontenerem Apache/PHP oraz instalacja WordPress’aMając już podstawy Dockera za sobą pokażemy jak przy jego pomocy możemy uruchomić własną stronę opartą na popularnym systemie zarządzania treścią WordPress. Aby było to możliwe potrzebujemy serwer www wraz z obsługą PHP oraz bazę danych MySQL. W tym celu zbudujemy dwa kontenery, na pierwszym uruchomimy bazę danych, na drugim serwer www. Pliki strony zmapujemy z naszego lokalnego dysku do kontenera na którym będzie działać webserver.

Kontener z bazą danych MySQL

Użyjemy oficjalnego obrazu MySQL z Docker Hub. W konsoli wpisujemy:

docker pull mysql

Kiedy obraz znajdzie się na naszym dysku, uruchamiamy kontener:

docker run --name wp-mysql --rm -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wpdb -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=wppassword mysql

Polecenie dosyć długie, więc wyjaśnijmy poszczególne argumenty:

  • --name wp-mysql – przydzielamy nazwę naszemu kontenerowi. Dzięki temu możemy się do niego odwoływać korzystając z jego nazwy, zamiast jego identyfikatora
  • --rm – kontener zostanie automatycznie usunięty po jego zatrzymaniu.
  • -e – ustawia zmienną środowiskową w kontenerze. Obraz mysql obsługuje kilka takich zmiennych:
    MYSQL_ROOT_PASSWORD – ustawia hasło do bazy danych dla użytkownika root
    MYSQL_DATABASE – tworzy bazę danych po starcie kontenera
    MYSQL_USER – nazwa użytkownika, któremu zostaną nadane pełne prawa (superuser) do bazy zdefiniowanej w MYSQL_DATABASE.
    MYSQL_PASSWORD – hasło dla użytkownika MYSQL_USER

Sprawdzimy czy połączenie do bazy danych jest w ogóle możliwe, najpierw potrzebujemy adres IP kontenera:

docker inspect wp-mysql | grep -i ipaddress
        "IPAddress": "172.17.0.2",

Następnie zalogujemy się do bazy korzystając ze zdefiniowanych wcześniej danych dostępowych:

mysql -N -u wpuser -pwppassword -h 172.17.0.2 wpdb -e "select database()"
+------+
| wpdb   |
+------+

Jak widać dostęp jest możliwy, przechodzimy dalej.

Budujemy kontener z obsługą PHP i MySQL

W poprzedniej części zbudowaliśmy własny kontener oparty na obrazie centos:6, w którym następnie doinstalowaliśmy pakiet httpd. Użyjemy ponownie tej metody, potrzebujemy tylko trochę więcej pakietów. Tworzymy plik Dockerfile:

FROM centos:6
MAINTAINER  ITCore 

RUN yum -y upgrade && yum -y install httpd php php-mysql && yum clean all

# Simple startup script to avoid some issues observed with container restart 
ADD start-httpd.sh /start-httpd.sh
RUN chmod -v +x /start-httpd.sh

EXPOSE 80

CMD ["/start-httpd.sh"]

oraz plik start-httpd.sh:

#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND

Budujemy własny obraz:

docker build -t tech-itcore/centos6-httpd-php-mysql .

Po krótkiej chwili nowy obraz jest gotowy:

docker images tech-itcore/*
REPOSITORY                            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
tech-itcore/centos6-httpd-php-mysql   latest              bdfa916ce0f3        3 minutes ago       438.3 MB

Łączymy kontenery ze sobą

Teraz najważniejsza część. Uruchomimy nowy kontener oraz połączymy go z działającym już kontenerem mysql, przez co uzyska on dostęp do bazy danych. Dodatkowo pliku projektu zmapujemy do kontenera z lokalnego dysku. Tym sposobem możemy łatwo zainstalować np. wtyczkę, bez ingerencji w samym kontenerze.

mkdir wordpress

docker run -p 80:80 -it --rm --name wp-apache --link wp-mysql:mysql -v "$PWD/wordpress":/var/www/html tech-itcore/centos6-httpd-php-mysql

Poniżej krótkie wyjaśnienie niektórych parametrów:

  • -p 80:80 – udostępmniamy port 80 kontenera na porcie 80 lokalnego hosta.
  • --link wp-mysql:mysql – łączymy (linkujemy) kontener z drugim wp-mysql. Wartość po dwukropku to alias, dlatego podczas łączenia z bazą danych zamiast podawać adres IP wystarczy, że wpiszemy mysql jako nazwę hosta.
  • -v "$PWD/wordpress":/var/www/html – montujemy aktualny podkatalog wordpress z aktualnego katalogu (zmienna $PWD) do katalogu /var/www/html kontenera.

Możemy teraz zainstalować wordpress’a w podkatalogu wordpress:

wget https://pl.wordpress.org/wordpress-4.3.1-pl_PL.tar.gz
tar xf wordpress-4.3.1-pl_PL.tar.gz
cd wordpress
cp wp-config-sample.php wp-config.php

Podajemy poprawne dane do bazy danych w pliku wp-config.php. Zwróćmy uwagę na poprawną nazwę hosta dla bazy danych. Jest to alias, którego użyliśmy podczas łączenia ze sobą kontenerów (–link wp-mysql:mysqlmysql.

vim wp-config.php
define('DB_NAME', 'wpdb');
define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'wppassword');
define('DB_HOST', 'mysql');

Pozostaje nam tylko uruchomić przeglądarkę a w pasku adresu wpisać adres IP kontenera na którym uruchomiony jest serwer www i… gotowe!

 docker inspect wp-apache | grep -i ipaddr
        "IPAddress": "172.17.0.3",

Docker - instalacja WordPressa

docker - instalacja wordpressa, kontenery z mysql, php oraz apache

  1. A po co w ogóle tworzyć kontenery osobne dla php mysql i jakiś OS. Nie kumam. Wyjaśnij może jakie praktyczne zastosowanie ma coś takiego bo ja nie widze sensu :sad:

    • Tworzysz projekt na php7.1 i bazę oracle i nagle dostajesz klienta, który wymaga php5.4 i mysql, możesz wtedy zainstalować php5.4 i mysql i mieć uruchomione jednocześnie wszystko, albo zrobić to w dockerze.
      Oprócz tego piszesz coś w springu i nie potrzebujesz apache ani php, to jeśli masz je w dockerze, to nie marnujesz zasobów na niepotrzebne procesy, a odpalasz tylko tomcata i odpowiednią bazę.
      Ja to tak rozumiem i w takim celu zamierzam stosować.

  2. Można zrobić kontener z MySQL i kolejne np. z php 5.3, 5.5 i 7.0 i np. WebSphere’a z jakąś aplikacją Java. I na koniec wszystkie je połączyć z tym jednym kontenerem na którym działa baza.
    Tak, można też zainstalować wszystko na jednym, użyć VM’ki etc etc… opcji jest wiele i to od nas zależy co wybierzemy.

  3. Genialny artykuł, docker jest dla mnie nowością (od kilku tygodni) zacząłem go używać. Mój target dwa web serwery (redundancja) po dwa kontenery z tą samą bazą (kopie) i do baz własny kontener (storage). Państwa artykuł znacznie przybliżył mnie dziękuję bardzo. Jesteście o lata świetlne przede mną czy mógłbym prosić o jakieś wskazówki choćby jak pytać Google o pomoc?
    Z góry dziękuję.

Odpowiedz Dawid ¬
Anuluj odpowiedź


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*