Первая полноценная запись, мне кажется, должна быть как раз о том, как был поднят сайт.
Для развертывания использовался VPS сервер, а так же Ubuntu 22.04 + Docker. В качестве Proxy между внешним миром и контейнерами был выбран ради тестов Traefik
Предварительно создаем директорию для сайта например blog и внутри нее data, обе от своего пользователя (НЕ ROOT!) Кто работает как рут? Пацаны не так поймут…
mkdir -p blog/data # -p, --parents Параметр который позволяет создать путь, если же директории уже существуют ошибки не будет, а права установленные на директорию будут не затронуты даже если был указан параметр -m
В рамках docker-compose.yaml будет указана сеть, которую сам Docker compose создать не сможет, поэтому заранее создаем сеть для связи Traefik и WordPress.
docker network create traefik_network
В директории blog создаем docker-compose.yaml
Так же ниже будет приведен вариант без Traefik, и почти без комментариев.
services: # Указываем директиву для описания сервисов (контейнеров)
db: # Описываем контейнер с базой данных
image: mysql/mysql-server:8.0 # За основу берем официальный образ MySQL8
restart: always # Всегда перезапускайте контейнер, если он останавливается. Если он остановлен вручную, он перезапускается только при перезапуске Docker daemon или самого контейнера вручную.
volumes: # Описание к каким Volume подключается контейнер (разделы для хранения данных, которые останутся после остановки контейнера. В данном случае данные базы данных MySQL)
- blog_data:/var/lib/mysql # Создаем именнованное хранилище с именем blog_data в котором будут размещаться данные из /var/lib/mysql ВНУТРИ контейнера
environment: # Определяем переменные среды, которые помогут автоматически настроить MySQL без необходимости заходить внутрь контейнера, и проводить настройку там.
MYSQL_ROOT_PASSWORD: ROOT_p@s$worD # Задаем пароль от пользователя Root в MySQL.
MYSQL_DATABASE: db_name # Задаем имя базы данных, внутри которой будут данные блога.
MYSQL_USER: db_user # Задаем имя пользователя, от имени которого будем подключаться к базе данных.
MYSQL_PASSWORD: USER_p@s$word # Задаем пароль пользователя db_user для подключения к базе данных.
networks: # Описываем к каким сетям подключен контейнер
- blog # Используем подключение к одной сети blog для общения с контейнером в котором будет запущен сам WordPress
command: '--default-authentication-plugin=mysql_native_password' # Просим использовать старый добрый пароль, в целом не лучшая практика, но в данном случае вполне подойдет, поскольку контейнер будет НЕ ДОСТУПЕН по сети и будет виден только для wordpress.
labels: # Различные метки (лейблы) которые помогут нам взаимодействовать с другими компонентами как здесь, либо добавить информацию о создателе или ответственном за обслуживание образа
- "traefik.enable=false" # Просим Traefik не отслеживать данный контейнер, даже если у него есть EXPOSE (директива что указывает на то, какие порты следует открыть)
wordpress: # Описываем создание WordPress Контейнера
depends_on: # Просим запускать контейнер только после списка других контейнеров
- db # Ждем запуска контейнера с базой данных (ВНИМАНИЕ! ЗАПУСК КОНТЕЙНЕРА НЕ ОЗНАЧАЕТ ЧТО ЗА ЭТО ВРЕМЯ УСПЕЕТ СТАРТОВАТЬ САМА БАЗА ДАННЫХ! Это разные вещи. Тут именно контейнер, база может запускаться куда дольше, и в это время будут сыпаться ошибки о недоступности базы данных.)
user: "1000:1000" # Указываем от какого пользователя запустить контейнер, посмотреть своего пользователя можно командой id, через двоеточие указаны UID:GID пользователя. Стоит указать, во избежание "permission denied", от файлов возданных в процессе работы контейнера (здесь будет использоваться проброс рабочей папки в контейнер)
image: wordpress # Используем за основу официальный образ от WordPress
restart: always # Всегда перезапускайте контейнер, если он останавливается. Если он остановлен вручную, он перезапускается только при перезапуске Docker daemon или самого контейнера вручную.
volumes: # Описание к каким Volume подключается контейнер (разделы для хранения данных, которые останутся после остановки контейнера. В данном случае данные WordPress)
- ./data/:/var/www/html/ # Проброс папки data из текущей директории (где находится docker-compose.yaml), данные буду доступны как из контейнера так и с хоста.
environment: # Определяем переменные среды, которые помогут автоматически настроить MySQL без необходимости заходить внутрь контейнера, и проводить настройку там.
WORDPRESS_DB_HOST: db:3306 # Указываем по какому "пути" будет доступен сервер с базой данных, используется локальный для docker сервер доменных имен, и мы подключимся к контейнеру который в конфиге указан как db, если имя сервиса было изменено - нужно указать тут имя СЕРВИСА, не контейнера.
WORDPRESS_DB_NAME: db_name # Указываем db_name из db сервиса (MySQL) иначе автоматическое конфигурирование не сработает.
WORDPRESS_DB_USER: db_user # Указываем db_user из db сервиса (MySQL) иначе автоматическое конфигурирование не сработает.
WORDPRESS_DB_PASSWORD: USER_p@s$word # Указываем USER_p@s$word из db сервиса (MySQL) иначе автоматическое конфигурирование не сработает.
networks: # Описываем к каким сетям подключен контейнер.
- blog # Сеть по которой будут общаться между собой WordPress и MySQL.
- traefik_network # Сеть по которой будет общаться WordPress и Traefik.
labels: # Различные метки (лейблы) которые помогут нам взаимодействовать с другими компонентами как здесь, либо добавить информацию о создателе или ответственном за обслуживание образа
- "traefik.enable=true" # Просим Traefik ОТСЛЕЖИВАТЬ состояние данного контейнера.
- "traefik.docker.network=traefik" # Указываем Traefik по какой сети подключаться к WordPress для отправки данных в сеть.
# SSL Сертификат
- "traefik.http.routers.blog.entrypoints=websecure" # Указываем что хотим использовать HTTPS, который в Traefik именуется как WebSecure.
- "traefik.http.routers.blog.tls.certresolver=myresolver" # Говорим что хотим получать Сертификат Let's Encrypt, который будет создан Traefik автоматически.
# Доменное имя и порт контейнера.
- "traefik.http.routers.blog.rule=Host(`xn--80aa2bdjfh2a.xn--p1ai`)" # Указываем доменное имя по котором будет доступен WordPress
- "traefik.http.services.blog.loadbalancer.server.port=80" # Указываем Traefik на каком порту у нас доступен WordPress ВНУТРИ КОНТЕЙНЕРА.
# Подключаем сжатие трафика
- "traefik.http.routers.blog.middlewares=traefik-compress" # Экономим трафик и свой и пользователя
networks: # Описываем какие сети необходимо подключить или создать.
blog: # Сеть для общения WordPress и MySQL без доступа во внешнюю сеть!
internal: true # Сеть доступна только для участников данного Compose файла.
traefik_network: # Внешняя сеть которая должна быть создана ДО запуска docker compose!
external: true # Указываем что это внешняя сеть, к которой мы хотим подключиться.
volumes: # Описываем создание хранилищ
blog_data: # Создаем хранилище blog_data для MySQL
Если необходимо запустить отдельно от Traefik – вот вариант файла конфигурации без дополнительных лейблов и с публикаций портов через директиву ports:
services:
db:
image: mysql/mysql-server:8.0
restart: always
volumes:
- blog_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ROOT_p@s$worD
MYSQL_DATABASE: db_name
MYSQL_USER: db_user
MYSQL_PASSWORD: USER_p@s$word
networks:
- blog
command: '--default-authentication-plugin=mysql_native_password' .
wordpress:
depends_on:
- db
user: "1000:1000"
image: wordpress
restart: always
volumes:
- ./data/:/var/www/html/
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: db_name
WORDPRESS_DB_USER: db_user
WORDPRESS_DB_PASSWORD: USER_p@s$word
networks:
- blog
ports: # Описываем пробрасываемые порты <Хост_машина(ваш сервер)>:<Порт Внутри контейнера>
- 80:80 # Доступ по http, на всех сетевых устройствах. 80 порт должен быть доступен!
networks:
blog:
volumes:
blog_data:
Надеюсь данная статья окажется для кого-то полезной. =)
Добавить комментарий