Пост

Связка WordPress и Docker, локальная MariaDB в Debian 11

Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации, контейнеризатор приложений.

Использование СУБД в Docker исполнении в проде - не очень хорошая идея. По-этому решил настроить один из боевых серверов c WordPress в Docker исполнении, но MySQL оставить локально

Установка Docker из репозитория

Устанавливаем необходимые пакеты, создаем директорию и скачиваем цифровую подпись

1
2
3
$ sudo apt -y install ca-certificates curl gnupg lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Добавляем репозиторий в систему

1
2
3
4
5
6
$  echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ sudo apt update

Устанавливаем дистрибутив

1
$ sudo apt -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Добавляем нашего пользователя в группу docker

1
2
$ sudo usermod -aG docker $(whoami)
$ newgrp docker

Установка Docker Compose

Скачиваем дистрибутив, файл исполняемым и создаем сим линк

1
2
3
4
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Проверяем

1
$ docker-compose -v

Установка MariaDB

Устанавливаем дистрибутив, запускаем первоначальную настройку MariaDB

1
2
3
$ sudo apt update
$ sudo apt -y install mariadb-server mariadb-client
$ sudo mysql_secure_installation

Создаем пользователя и базу

1
2
3
4
5
6
$ sudo mariadb
> CREATE DATABASE wp_mydatabase;
> CREATE USER 'wp_myuser'@'%' IDENTIFIED BY 'sercretpasswd';
> GRANT ALL PRIVILEGES ON wp_mydatabase.* to wp_myuser@'%';
> FLUSH PRIVILEGES;
> exit

Проверяем

1
2
3
4
5
6
7
8
9
10
$ sudo mariadb
> SELECT User, Host FROM mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| wp_myuser   | %         |
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+

Настраиваем MySQL, иначе контейнер не сможет подключиться к БД

1
2
3
4
5
6
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
...
#bind-address            = 127.0.0.1
bind-address            = 172.17.0.1

$ sudo systemctl restart mysql

Пример проекта

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ cat ~/proj/docker-compose.yml
version: '3'

services:
  wp:
    image: wordpress:php8.1-fpm-alpine
    container_name: wordpress
    user: 1000:1000
    environment:
      WORDPRESS_DB_HOST: ${MYSQL_HOST}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
    volumes:
      - ./data:/var/www/html
      - ./php/wordpress.ini:/usr/local/etc/php/conf.d/wordpress.ini
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./data:/var/www/html
      - ./ssl:/etc/nginx/ssl
    ports:
      - '80:80'
      - '443:443'
    depends_on:
      - wp
    restart: unless-stopped
1
2
3
4
5
6
7
8
$ cat ~/proj/php/wordpress.ini
file_uploads = On
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
max_input_time = 1000
max_input_vars = 3000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$ cat ~/proj/nginx/wp.conf
server {
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name $SITE_URL;

    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;

    client_max_body_size 64m;
    client_body_buffer_size 4M;

    ssl_certificate           /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key       /etc/nginx/ssl/privkey.pem;
    ssl_trusted_certificate   /etc/nginx/ssl/chain.pem;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wp:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat ~/proj/.env
# Root password for your database
MYSQL_ROOT_PASSWORD=myrootpasswd

# Database name, user and password for your wordpress
MYSQL_HOST=172.17.0.1:3306
MYSQL_DATABASE=wp_mydatabase
MYSQL_USER=wp_myuser
MYSQL_PASSWORD=sercretpasswd

# Table prefix
WORDPRESS_TABLE_PREFIX=wp_

# Site URL
SITE_URL=itdraft.ru
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.