Docker для разворачивания WordPress
Пробую разобраться в разворачивание докер контейнера для работы с Wordpress
тестовый проект называется http://crecker.loc
Мой docker-compose.yml имеет вид
version: "3.9"
services:
# WordPress service
wordpress:
image: wordpress:latest
restart: always
ports:
- "80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_CONFIG_EXTRA: |
define('WP_HOME', 'http://cracker.loc');
define('WP_SITEURL', 'http://cracker.loc');
volumes:
- ./wp-content:/var/www/html/wp-content
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
# MySQL service
db:
image: mysql:latest
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: root_password
volumes:
- ./db-data:/var/lib/mysql
# phpMyAdmin service
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
restart: always
ports:
- "8080:80"
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: root_password
Почему-то при прописании данного адреса в поисковой строке браузера вылетает с ошибкой.
DNS_PROBE_FINISHED_NXDOMAIN
Что делаю не так, в чём ошибка ?
Добавлю работающий вариант докер файла, для сравнения.
version: "3.9"
services:
# WordPress service
wordpress:
image: wordpress:latest
restart: always
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
- ./wp-content:/var/www/html/wp-content
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
# MySQL service
db:
image: mysql:latest
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: root_password
volumes:
- ./db-data:/var/lib/mysql
# phpMyAdmin service
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
restart: always
ports:
- "8080:80"
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: root_password
Проблема в том, что необходимо что б вместо http://localhost:8000/ было название проекта в качестве url адреса. Возможно, кто-то сможет на своем PC запустить этот докер, и показать как сделать так что б подставлялась замена урла?
Ответы (1 шт):
Нужно прописать локальный домен crecker.loc в hosts файл.
Фйл расположен:
- Windows 7-11 — c:\windows\system32\drivers\etc\hosts;
- Linux, Unix, BSD — /etc/hosts;
- MacOS — /private/etc/hosts.
Формат такой:
# <IP> <Domain>
127.0.0.1 crecker.loc
UPD к вашему дополнению вопроса
Пара слов вначале:
- Возможно, вам стоит продолжить использовать
OSPилиMAMP.Dockerэто, всё же, другой продукт, для других задач. - В вашем конфиге вы неправильно описали биндинг порта 80. У вас
- "80"а должно быть- "80:80" - Использовать 80 порт (который как раз не нужно писать в домене - это стандартный порт http) для всех ваших контейнеров не получится. На одном порту одновременно может "висеть" только одно приложение.
- Я, пока, не встречал людей, которых парит что надо писать
localhost:1234. Обычно это не вызывает проблем. - Чтобы сам Wordpress работал корректно с указанием порта, в конфиге docker-compose нужно ему указать корректный URL с портом (если порт не
80или не443)define('WP_HOME', 'http://<HOST>:<PORT>');иdefine('WP_SITEURL', 'http://<HOST>:<PORT>'); - В домене вместо
.locлучше использовать.localhost. У меня в Linux, это избавляет от необходимости менятьhostsфайл. Правда не уверен будет ли это работать в Windows. Мне кажется, что за это отвечает не ОС, а сам браузер, но тут я не очень уверен.
Если же очень хочется реализовать, то что вы хотите средствами Docker, тогда придется потанцевать, немного, с бубном:
Traefik
Первым делом вам понадобится маршрутизатор (т.н. edge router или reverse proxi), который будет перенаправлять запросы в нужные контейнеры. Для этого можно использовать Traefik. Документация Traefik
Нужно создать контейнер Traefik'а, который будет принимать всё что приходит на 80 порт localhost'а и перенаправлять запросы куда нужно. Удобство Traefik в том, что настройки маршрутов делаются не в конфиге Traefik, а в свойствах непосредственно контейнера.
Создайте папку где будете хранить конфиг траефика и в ней файл docker-compose.yaml:
services:
reverse-proxy:
image: traefik:v2.9
restart: unless-stopped
command:
- --api.dashboard=true
- --providers.docker
ports:
- "80:80"
labels:
- traefik.http.routers.dashboard.rule=Host(`traefik.localhost`)
- traefik.http.routers.dashboard.service=api@internal
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Поднимаем reverse-proxy. Опция -d запустит контейнер Traefik в фоне.
docker-compose up -d
Для проверки, что Traefik заработал, переходим по адресу http://traefik.localhost
Конфиги сервисов
Дальше идем в папку с проектом. В docker-compose.yaml нужно сделать несколько правок:
1. Port binding
Из конфигов сервисов, которые будут работать через Traefik, убираем настройки port:. Они на м не понадобятся.
2. Добавляем метки для Traefik
Для того чтобы Traefik смог настроить маршрутизацию, нужно к контейнеру добавить соответствующие метки:
labels:
- traefik.http.routers.<C-NAME>.rule=Host(`<HOST>`)
- traefik.http.services.<C-NAME>.loadbalancer.server.port=<C-PORT>
Здесь:
<C-NAME>- имя контейнера<HOST>- хост по которому будет доступен контейнер (в вашем случае - cracker.localhost)<C-PORT>- порт контейнера. Зависит от используемого образа. В случаеwordpress- это порт80.
Повторяем то-же самое, только с другим хостом для сервиса phpmyadmin.
3. Помещаем все в сеть Traefik'а
Добавляем следующий конфиг в самый низ файла docker-compose.yaml приложения.
networks:
default:
name: traefik_default
Вот такой конфиг получился в итоге у меня:
version: "3.9"
services:
# WordPress service
wordpress:
image: wordpress:latest
restart: always
labels:
- traefik.http.routers.wordpress.rule=Host(`cracker.localhost`)
- traefik.http.services.wordpress.loadbalancer.server.port=80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_CONFIG_EXTRA: |
define('WP_HOME', 'http://cracker.localhost');
define('WP_SITEURL', 'http://cracker.localhost');
volumes:
- ./wp-content:/var/www/html/wp-content
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
# MySQL service
db:
image: mysql:latest
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: root_password
volumes:
- ./db-data:/var/lib/mysql
# phpMyAdmin service
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
restart: always
labels:
- traefik.http.routers.phpmyadmin.rule=Host(`phpmyadmin.cracker.localhost`)
- traefik.http.services.phpmyadmin.loadbalancer.server.port=80
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: root_password
networks:
default:
name: traefik_default
Поднимаем приложение.
docker-compose up
Через пару-тройку секунд после запуска сайт должен стать доступен по адресу http://cracker.localhost, а PHPMyAdmin по адресу http://phpmyadmin.cracker.localhost
UDP 2
В зависимости от того, как вы называли папки, в которые складывали конфиги, сеть в которой будет работать Traefik может отличаться от нужно (нужно чтобы сеть называлась traefik_default).
Чтобы этого избежать, нужно в конфиг Traefik добавить сеть. Получиться что-то такое:
version: "3.9"
services:
reverse-proxy:
image: traefik:v2.9
restart: unless-stopped
command:
- --api.dashboard=true
- --providers.docker
ports:
- "80:80"
labels:
- traefik.http.routers.dashboard.rule=Host(`traefik.localhost`)
- traefik.http.routers.dashboard.service=api@internal
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
default:
name: traefik_default
Чтобы применились настройки, в папке с конфигом Traefik нужно выполнить команду:
docker-compose restart
Для того чтобы убедиться, что Traefik и наше приложение работают в одной сети нужно выполнить команду:
# traefik_default - это имя сети в моих примерах
docker network inspect traefik_default
В результате должна выдаться информация о сети в которой будет список работающих в ней контейнеров:
[
{
"Name": "traefik_default",
...
...
...
"Containers": {
"6e859c46087e823b5ea72697e540326e4a6369e4b664aeb638eddef971e75e4a": {
"Name": "test-phpmyadmin-1",
"EndpointID": "1f0286629d44c6b36b0996c170cf149f0cf2e7812ce4e0edb00c6f63e896ac75",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
},
"aea8fd1ffc101b06a3d3d653bbf1b758adb33e94c2b6ce77bfda33d5fd4b5f5a": {
"Name": "test-db-1",
...
...
},
"d7f7aadbe76d9a4fd40b5ad7113f88cd7568a7f4dd11af9d1dd14ce282e1699d": {
"Name": "test-wordpress-1",
...
...
},
"e9d365cc9904abeb913eb32f7706bb50008656ee38de4edb5674c7f6ec078d7f": {
"Name": "test-reverse-proxy-1",
...
...
}
},
"Options": {},
...
...
...
}
]