Spis treści
Mają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 ITCoreRUN 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",
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ć.
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.
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ę.