Так как появилась задача развивать дальше этот блог, то пришлось решить вопрос с локальным развертыванием сайта локально, поэтому открываю новую рубрику на сайте под названием яждевопс.
Когда-то давно еще во допотоные времена до ядерной войны в 18 веке лет 5 назад мы делали это при помощи вирутальной машины, которая работала через vagrant или вообще разворачивали всю экосистему локально, но сейчас времена наступили другие и появилась докеризация
Если кратко, то докер — это такая прикрасная штука, которая позволяет делать все что позволяла делать виртуальная машина, но более гибко и с меньшими ресурсными затратами. Например можно собрать себе экосистему для запуска определенного программного обеспечения и даже организовать свою изолированную сеть внутри докер системы на вашей локальной машине. О возможностях докера каждый может найти в любой поисковой системе, информации достаточно.
Тут же я хотел продемонстрировать простое решение на докере, которое позволяет развернуть локально такой простой блок на WordPress как этот блог. Итак поехали.
Для начала создаем файл .env с таким содержимым
# префикс, который мы будем использовать для наименования контейнеров в докере PREFIX=wp # пароль root для локального контейнера с mysql MYSQL_ROOT_PASSWORD=somewordpress # название базы данных root для локального контейнера с mysql MYSQL_DATABASE=wordpress # имя пользователя базы данных для локального контейнера с mysql MYSQL_USER=wordpress # пароль пользователя базы данных для локального контейнера с mysql MYSQL_PASSWORD=wordpress # хоста базы данных на боевом сервере MYSQL_REMOTE_HOST=remote_host_address # название базы данных на боевом сервере MYSQL_REMOTE_DATABASE=remote_wp # имя пользователя базы данных на боевом сервере MYSQL_REMOTE_USER=user_db_read # пароль пользователя базы данных на боевом сервере MYSQL_REMOTE_PASSWORD=password_db_read
Тут все понятно по комментариям, единственное, что может вызвать вопрос это данные удаленного сервер mysql. Эти данные понадобятся для синхронизации с рабочей базой данных, о котором я напишу ниже. Стоит только отметить, что я рекомендую создать отдельную учетную запись на стороне боевого сервера у которой будет возможность только чтения из базы данных, чтобы в случае утечки этих данных эти данные не могли бы использовать для изменений данных на боевом сервере.
Далее создаем docker-compose.yml
services: db: container_name: ${PREFIX}-db # We use a mariadb image which supports both amd64 & arm64 architecture image: mariadb:10.6.4-focal # If you really want to use MySQL, uncomment the following line #image: mysql:8.0.27 command: '--default-authentication-plugin=mysql_native_password' volumes: - db_data:/var/lib/mysql restart: always environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} expose: - 3306 - 33060 ports: - 3306:3306 - 33060:33060 wordpress: container_name: ${PREFIX}-wp image: wordpress:latest volumes: - ./www:/var/www/html ports: - 8082:80 restart: always environment: - WORDPRESS_DB_HOST=db - WORDPRESS_DB_USER=${MYSQL_DATABASE} - WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD} - WORDPRESS_DB_NAME=${MYSQL_DATABASE} - WORDPRESS_DEBUG=false volumes: db_data:
Это основной файл нашей докер системы при использовании которого будет запущено 2 контейнера, контейнер с базой данных mysql и контейнер с образом wordpress
Все настройки перечислять не буду ( почитаете документацию если будет кому нужно ) отмечу только то что в ports: мы биндим порты на локальную машину http будет доступен на порте 8082, а mysql на порту 3306 так же хочу отметить еще что в секции valumes: контейнера wordpress мы биндим локальную директорию ./www в которой будут хранится файлы wordpress. В нее нужно будет развенуть архив с wordpress или скопировать файлы wordpress с удаленного хостинга.
В итоге у нас получается вот такая директория проекта с файлом .env, docker-compose.yml и директорией www с файлами wordpress, если не хотите прописывать данные доступов к базе данных вручную, то перед запуском сборки докера удалите файл wp-config.php. Контейнер wordpress создаст его вручную и пропишет в него доступы из docker-compose.yml
Далее запускаем вот такую простую команду
$ docker compose up -d
Наслаждаемся процессом скачки образов и сборки контейнеров
Если вам повезло, то после этого можете зайти по адресу http://localhost:8082 откроется ваш wordpress
В принципе на этом можно было бы и закончить, но я настолько ленив, что мне захотелось создать несколько удобных команд для моего проекта, чтобы автоматизировать запуск, пересборку и установку докера, а так же синхронизацию удаленной базы данных ( не зря же я добавил в .env файл параметры MYSQL_REMOTE_*
Итак, чтобы автоматзировать рутинные задачи создадим Makefile.
Makefile — это такая крутая штука, которая была придумана еще в далкие времена, когда программы компилировали, а программисты еще знали как очищать в своих программах память от мусора и что такое язык С. В Makefile можно перечислять инструции которые потом можно выполнять в той директории в которой присутствует этот файл, вот такой Makefile у меня получился
include .env export .DEFAULT_GOAL = help .PHONY: help help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' up: @docker compose up -d build: @docker compose up --build -d down: @docker stop `docker ps -a -q` shell: @docker exec -it $(PREFIX)-wp bash drop-db: @docker exec -it $(PREFIX)-db mysql -e 'DROP DATABASE $(MYSQL_DATABASE) ; CREATE DATABASE $(MYSQL_DATABASE)' -uroot -p$(MYSQL_ROOT_PASSWORD) sync: drop-db @ssh $(MYSQL_REMOTE_HOST) mysqldump -u$(MYSQL_REMOTE_USER) -p$(MYSQL_REMOTE_PASSWORD) $(MYSQL_REMOTE_DATABASE) | docker exec -i $(PREFIX)-db mysql -u$(MYSQL_USER) -p$(MYSQL_PASSWORD) $(MYSQL_DATABASE)
После этого чтобы запустить наш докер с wordpress достаточно будет ввести команду
$ make up
Для того чтобы пересобрать контейнеры
$ make down
Остановить докер
$ make down
И самая интересная команд, команда синхронизации базы данных докера с базой данных боевого сервера
$ make sync
Она удаляет полностью базу данных в докере и полностью забирает ее с боевого хостинга, после этой операции у вас в контейнере базы данных будет полная копия базы боевого сайта с wordpress
В целом это все. Если вдруг возникнут какие-то вопросы и замечания, то можете писать в комменатрии или мне в телеграм, так же если кому-то требуется разработка сайта на wordpress пишите сюда :)