tech-tips/Программное обеспечение/LEMP-стек/Настройка LEMP сервера с помощью docker для простых проектов/Часть 2 - docker-compose.md

827 lines
33 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
source: https://habr.com/ru/companies/nixys/articles/662698/
---
> [!seealso] Все части
> * [Часть 1 - База](Часть%201%20-%20База.md)
> * [Часть 2 - docker-compose](Часть%202%20-%20docker-compose.md)
![](216c7b14d077e06970892e9c5e69eb88.jpg)
Мы продолжаем цикл обучающих статей для начинающих системных администраторов: если вы являетесь опытным админом, можете смело пропустить этот материал. В этой статье мы разберем #docker-compose.
Напомню, что цель серии - не показать, как развернуть идеальное окружение, а лишь указать на нюансы в работе и защитить начинающих специалистов от базовых ошибок при настройке.
## docker-compose
### Чем удобен docker-compose?
docker-compose позволяет управлять всеми контейнерами из одного файла (файл - формата yml). Теперь не нужно будет писать кучу `docker run` и длинные команды для запуска контейнеров: достаточно будет лишь запустить одну команду `docker-compose up`, после чего все контейнеры будут подняты без нашего вмешательства, причем со всеми настройками, которые будут прописаны в yml-файле. Также docker-compose позволяет взаимодействовать с системой управления репозиториями программного кода. Например: gitlab.
### Установка
Для начала установим инструмент. Загружаем текущую стабильную версию:
```
сurl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
Делаем скачанный файл исполняемым:
```shell
chmod +x /usr/local/bin/docker-compose
```
Проверяем:
```
#:/# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
```
Все установлено и работает.
#### Подготовка
Какие сервисы понадобятся?
1. #frontend: `nginx`
2. #backend: `php8.1-fpm`
3. База данных: `mysql`
Первым делом подготовим директории для работы. Для начала создадим директорию, где будет лежать `docker-compose.yml`. Мы приняли за стандарт, что в нашей компании все файлы docker-compose находится в директории `/var/apps/`. Создаем директорию и переходим в нее:
```shell
mkdir /var/apps
cd /var/apps
```
Создаем директорию проекта:
```shell
mkdir DOMAIN_NAME
cd DOMAIN_NAME/
```
Создаем файл `docker-compose.yml`:
```shell
touch docker-compose.yml
```
Теперь создадим директорию где будут хранится наши конфигурационные файлы площадок, конфигурации `php.ini` и так далее:
```shell
mkdir volumes
```
Давайте заранее создадим все директории и конфигурации наших сервисов:
```shell
cd volumes/
mkdir etc build
```
1. `etc` - директория с конфигурационными файлами сервисов;
2. `build` - директория с файлами #Dockerfile в котором будут хранится все команды для сборки образа.
Далее:
```
mkdir etc/nginx etc/mysql etc/php-fpm8.1
mkdir etc/nginx/sites-enabled etc/nginx/ssl etc/mysql/conf.d etc/php-fpm8.1/fpm.pool.d
touch etc/nginx/nginx.conf etc/nginx/sites-enabled/DOMAIN_NAME.conf etc/mysql/conf.d/config-file.cnf etc/php-fpm8.1/php.ini etc/php-fpm8.1/fpm.pool.d/domain.conf
mkdir build/nginx build/php-fpm8.1 build/mysql
touch build/nginx/Dockerfile build/php-fpm8.1/Dockerfile build/mysql/Dockerfile
```
Получилась такая структура директорий:
- `app/`
- `volumes/` (директория с конфигурационным файлами)
- `build/` (директория c Dockerfile для наших контейнеров)
- `mysql/`
`Dockerfile`
- `nginx/`
`Dockerfile`
- `php-fpm8.1/`
`Dockerfile`
- `etc/` (директория с конфигурационными файлами для наших сервисов)
- `mysql/`
- `config-file.cnf`
- `nginx/`
- `sites-enabled/`
- `DOMAIN_NAME.conf`
- `nginx.conf`
- `php-fpm8.1/`
- `fpm.pool.d/`
- `domain.conf`
- `php.ini`
- `docker-compose.yml`
Ну или так:
![](f2c5b5ca6c9241474452273e98783108.png)
В `./app/volumes/etc/mysql/config-file.cnf` можно указывать все необходимые настройки для mysql. В нашем случае мы добавим:
```ini
[mysqld]
port = 3310
wait_timeout = 9000000
max_allowed_packet = 1024M
innodb_buffer_pool_size = 512M
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0
net_read_timeout=500
net_write_timeout=500
interactive_timeout=600
connect_timeout=500
skip-log-bin
# Slow query settings:
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2
# Error query settings:
log_error=/var/log/mysql/mysql_error.log
general_log_file=/var/log/mysql/mysql.log
general_log=1
```
В `./app/volumes/etc/nginx/nginx.conf` можно указывать все необходимые настройки для nginx и площадки. В этом случае мы добавим:
```
user nginx;
worker_processes 6;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 16384;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
### gzip gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
client_body_buffer_size 1m;
client_max_body_size 75m;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
sendfile on;
#tcp_nopush on;
#gzip on;
include /etc/nginx/sites-enabled/*.conf;
}
```
Файл площадки `./app/volumes/etc/nginx/sites-enabled/DOMAIN_NAME.conf` можно взять из [предыдущей статьи](https://habr.com/ru/company/nixys/blog/661443/).
В `./app/volumes/etc/php-fpm8.1/fpm.pool.d/domain.conf` добавляем настройки для php-fpm площадки:
```INI
[DOMAIN_NAME]
listen = 172.16.1.5:9010 ;ip адрес и порт на котором будет находится php-fpm площадки.
listen.mode = 0666
user = DOMAIN_NAME_ID ;id Пользователя площадки на сервере.
group = DOMAIN_NAME_ID ;id Группы пользователя площадки на сервере.
pm = dynamic
pm.max_children = 50
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 35
pm.max_requests = 500
request_terminate_timeout = 5m
request_slowlog_timeout = 2s
slowlog = /var/log/php/php-fpm.slow.log
php_admin_value[opcache.max_accelerated_files] = 20000
php_admin_value[realpath_cache_size] = 4096K
php_admin_value[realpath_cache_ttl] = 600
php_admin_flag[display_errors] = off;
php_admin_value[error_log] = /var/www/DOMAIN_NAME/log/php-fpm/fpm-php.log
php_admin_flag[log_errors] = on
php_admin_value[open_basedir] = /var/www/DOMAIN_NAME
php_admin_value[upload_tmp_dir] = /var/www/DOMAIN_NAME/upload
php_admin_value[session.save_path] = /var/www/DOMAIN_NAME/sess
```
В `./app/volumes/etc/php-fpm8.1/php.ini` можно добавлять все настройки для php. В нашем случае мы добавим:
```ini
upload_max_filesize = 500
Mmax_file_uploads = 20
post_max_size = 500
Mmemory_limit = 4096
Mdate.timezone = Europe/Moscow
```
Перед дальнейшими работами очистим все образы, собранные ранее в предыдущей статье. Для этого действия подойдет команда:
```shell
docker system prune --volumes --all
```
Эта команда очищает все образы не запущенных контейнеров. Важное уточнение - именно е запущенных_!
Смотрим запущенные контейнеры:
```
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f3353afe4fc nginx:stable "/docker-entrypoint.…" 4 months ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx
88c83f238c5c php-fpm "/docker-entrypoint.…" 4 months ago Up About a minute 9000/tcp php-fpm
```
Для остановки всех контейнеров можно использовать команду:
```shell
docker stop $(docker ps -a -q)
```
```
docker stop $(docker ps -a -q)
5f3353afe4fc
88c83f238c5c
```
Далее очищаем образы командой `docker system prune --volumes --all`:
```
:~# docker system prune --volumes --all
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all volumes not used by at least one container
- all images without at least one container associated to them
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
d25fadd1ace48b1e1d7285c79c924928fd2df54395f3cab9d1184bf25745404f
a156787f2e2d20585272f90b86fbfd82c6ff28fd6bd3e17785be1530e0dcf433
034a89f5322498cd272436515a43a9d82e0f32cdbd2da230a8211f1af7134619
c422454c2b997aec3e473998b3f51cbe5b322c00c094de9bfc20aba3af403830
5f3353afe4fc381fb2aa554700fb0a37ef378e923b5662241549722b243f84ea
88c83f238c5cfe7c71293793d54149e5e6aaf9db92dce9f0f1c9ac2e5e35be3c
77f498f59e80623dd325f6297dcc1c0b068c0fc0b373ca5c137d49052f71276f
Deleted Networks:
default
docker_default
Deleted Volumes:
171304f87cde0dbe4142c80e10e30076acfdae1c9d1ac0ed73125e8938bd13af
65e26f00da5308b81afe3d870d63243716df4935445b25648c5c69392151fefe
a016235f662b38c657f5e04283fc54d779d18c6e9d778c04e2a5fc264fec428b
a20375ceb893d7ae95c2b5ffd10c8557b49f02896a456c22a9015d17f34bd490
untagged: nginx:stable
untagged: nginx@sha256:74fb4c9d7e4fe6a8ab699d66fb5ffbf3daf1025bbb6f65a3217dde6e8f4d6e56
deleted: sha256:50fe74b50e0d0258922495297efbb9ebc3cbd5742103df1ca54dc21c07d24575
deleted: sha256:5c89b8cf56a58aa2a96ab1ed19ffd8e0630355776b1db7082fd897f8a5d285d4
deleted: sha256:e45a683cc5d56e842fc90c7ad0535abb1e909f733c2c0c29f4cf43f7247f8438
deleted: sha256:7ffdf2d40e75d1028ecbdba3cd5c548dc7a2b6c6b6598c2ff0af1f864df662e8
deleted: sha256:43828a7cbba35611955d78d1849ba6e48f176c96795ea881a7a9adcf5eb23bfa
deleted: sha256:e6ffc9b8132b8380efc5dd578d3e369890abaa492863968a5c41bdf9a8e5070e
deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
untagged: php-fpm:latest
deleted: sha256:cac496cb3198354a8bf68188c5cec929ba149e4f8f331c32f38e45ecc0bd0e67
deleted: sha256:21c4defd66f2e9e64c7b331a7580466403d4e2008d12864f2a29790ff1473a76
deleted: sha256:90f506af9c6530b6cc3c27ad661a9f4c4bfe64a57f313bad65ab67064ca7a880
deleted: sha256:45e703bc20b6aa77dd834ae2c81d1889be7a8b025d7570aa6034569210f25612
deleted: sha256:0f9ac9b1acec55805e6a2cb53b85406b39b07c5154bea03dc575f632e860cff9
deleted: sha256:5e1a9584d37f2f438eb4f9719591b72d9113d0b93e9fd336ee61e9653faaf156
deleted: sha256:bf23cc62c0e983ea1ed5b3b38bd78a86d26ab85de691802a81a800475a1a4e75
deleted: sha256:adf7df76ecb09fcd0fb8c283c8ac1aada505ed57bfa733461cc555d8ca23a816
deleted: sha256:2e09cf02796f006bde367ee89fcfd0053abbf080ef240e715343d6ead0b44851
deleted: sha256:c41477d2876d165d26869efd878a6e3b2fee7fafa10e51c5246909b6622d3b2c
deleted: sha256:9f0f98eb9fa7bd5d06653241253eda67fd08326b2634e903bb66dea0e2fb5139
deleted: sha256:4442cb52388be2f9a3ba0e6d6682e87d4586677d94c31af9064fc9315d0370cc
deleted: sha256:7ea425a7c077487583d85343140c2200a35bf98839a7228a789c74d4419c708f
deleted: sha256:cf3704308d18d0e52028613a7795a39658b02f345c647cf6aa0d82ec6dd51908
deleted: sha256:d943dbca5ecfa509906e2644be6e918c1c5961914271a320b895923c5324014f
deleted: sha256:ffc6430b96530f2b7d3f53e1cc64ec24852d9a1a826f687d87e0f6e4eec54869
deleted: sha256:8e32d40714a5cca10289b3fc0ded459b05320abc120bee3525f17c696c4bdb2e
deleted: sha256:3c4d7d6769cd7accbd1ccf61175010a1dfabbe435dab26ec2d771daba9de6f86
deleted: sha256:49143d13ba872d32b27bb2765beb496ac60d6b85414cd371a518c9946ec90b25
deleted: sha256:4883d13c15029dd0eab0e9fb7b3e00d8b0139e0d643e4c6e4bc144228e9e7e8f
deleted: sha256:2004464b54089dd15804882cb4803381532e0589d38f47f9729f7fb6ef169c34
deleted: sha256:c71714a613ec902f20bf8dce9866f62702302994af53bdd104331c19c7339da4
deleted: sha256:b1783cc83184509d3fffd30ba119ea1f11ec8602fdc50ba2c3e062e02df56e80
deleted: sha256:3e84bd99827c4963eab48a3e54bd088f7a206adb3aacd45361027327d5ca8443
deleted: sha256:d10560a7f2e4534ce146753b0748f1e73ce1b50f458f1e12385e19222b221b69
deleted: sha256:9c84657b917192c0490faf836824a113e6c397146db7a73fc2dc47755224c026
deleted: sha256:c13bd6861c9c7576cb27df56517347b5b7b28e68ce93e69a6ff25d8f1b4b4f6e
deleted: sha256:ced7cbb4abb893d33743c81fcbe3caf9c64da09a6fd9fa2f75efdfa0fd6efd6b
deleted: sha256:32f19a4eb0921d3b110352c4bdcdc7b64bd47092e1e15fe918e94cf6039037d8
deleted: sha256:054e2126fd90e29711637456090b61fc9b883eeb95ccf94430026ab7d5d14541
deleted: sha256:e8f41b5970d0e2b904babde28c490135b83b0a0be9ff7101171c203cc23af5fb
deleted: sha256:e022aa4b2c5f34b58acd5050d77cc23c087395010ab525ae9802ddc0ea52559c
deleted: sha256:ebdafce0fbc3adbde2ec9308930be55d3df801a2f62b31bd5b0b1162a54fea7e
deleted: sha256:c3744e7ff118e96f517ff1b4f97ee8ee62695d7cf97aec267b9bd73df77581ee
deleted: sha256:3b56d7cccfcf2579595d9d21f0788129276743ea2957f05cd9e49317fefd852f
deleted: sha256:d204f4d10e96af88215de15a6b47de64668572bfe9f143bc17f0adf0285c02bd
deleted: sha256:8c5518abda1bc707b21cc845ea17ebf5dcb4d05f8b5b5164d863255ea59390d4
deleted: sha256:9321ff862abbe8e1532076e5fdc932371eff562334ac86984a836d77dfb717f5
Total reclaimed space: 1.813GB
```
Все контейнеры и образы были удалены с сервера.
Базовая настройка завершена.
## Приступаем к написанию нашего yml-файла
ВНИМАНИЕ! Важное уточнение: так как это файл формата #yml, в нем очень строго необходимо следить за пробелами и отступами и никогда не использовать TAB. В противном случае вы можете получить синтаксическую ошибку - например, лишний пробел где-нибудь в 80-ой строке, на поиск которого у вас может уйти не один час =)
Итак, открываем `docker-compose.yml`.
### Пункт 1. Указание версии
Для начала указываем, какую версию docker-compose будем использовать. В нашем случае мы используем версию 2.4 - её нам будет вполне достаточно.
Для ознакомления со всеми версиями, и для чего они нужны, можете перейти на официальный мануал по этому поводу: [version](https://docs.docker.com/compose/compose-file/compose-versioning/).
Добавляем:
```yaml
version: '2.4'
```
### Пункт 2. Объявляем сервисы
Добавляем:
```yaml
services:
```
Мы объявляем, что далее будут идти наши контейнеры.
### Пункт 3. Объявляем наши контейнеры
Не забываем про формат yml, поэтому делаем два пробела и добавляем:
```yaml
nginx:
php-fpm8.1:
mysql:
```
Выглядит это так:
```yaml
version: '2.4'
services:
nginx:
php-fpm8.1:
mysql:
```
### Пункт 4: Локальная сеть контейнеров
Давайте заранее обьявим нашу сеть, чтобы больше к ней не возвращаться. За сеть у нас отвечает ключ `networks`.
Добавляем такие строки:
```yaml
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.16.1.0/24
```
1. `default` - название нашей сети. Можете использовать любое название.
2. `driver` - драйвер нашей сети.
3. `ipam` - конфигурация сети. В данном случае мы указываем нашу локальную подсеть `172.16.1.0/24`
Получаем:
```yaml
version: '2.4'
services:
nginx:
php-fpm8.1:
mysql:
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.16.1.0/24
```
### Пункт 4.5. Основные конфигурации и ключи нашего файла docker-compose
1. `container_name:` - название контейнера;
2. `hostname:` - hostname в контейнере;
3. `build:` - загружаем файл Dockerfile, в котором будут хранится все команды для сборки образа;
4. `extra_hosts:` - пункт, в котором мы указываем, какая запись будет в hosts на нашем сервере;
5. `ports:` - порты, которые мы хотим прокинуть в контейнер;
6. `volumes:` - директории, которые мы хотим прокинуть в контейнер.
Для чего необходимо пробрасывать директории в контейнер? Каждый раз, когда мы будем пересобирать контейнер, у нас будут удаляться все внутренние директории. Для того, чтобы это не происходило, мы пробрасываем директорию в контейнер. После чего все файлы будут храниться на хост-машине, и после того, как будет пересобран контейнер, файлы будут в целости и сохранности.
Например: У нас имеется mysql в контейнере. Если мы не пробросим директорию с БД, то все наши БД буду удалены после того, как мы пересоберем контейнер. Поэтому для всех сервисов лучше всего пробрасывать все нужные директории. Это важно!
7. `networks:` - ip адрес который мы присвоим нашему контейнеру;
8. `links:` - приоритет загрузки контейнеров;
9. `restart:` - частота перезагрузка контейнера в случае ошибки.
### Пункт 5. Пишем nginx
Переходим к строчке nginx и делаем отступ 4 пробела. Формат yml (да, не устану это повторять:)).
Указываем название контейнера `container_name`:
```yaml
container_name: DOMAIN_NAME-nginx
```
Указываем `hostname`:
```yaml
hostname: DOMAIN_NAME-nginx
```
Указываем местонахождение нашего Dockerfile для сборки `build`:
```yaml
build: ./volumes/build/nginx
```
Указываем директории, которые необходимо прокинуть в контейнер с помощью `volumes`. Обязательно необходимо прокинуть:
1. Файлы площадки. Для работы со статикой.
2. Конфигурацию nginx. Для быстрого управление в случае необходимости.
3. Конфигурационные файлы площадки. Для работы площадки.
4. Директорию с сертификатами ssl. Для быстрого подключения работы по https.
5. Директорию с log-файлом nginx. Для удобства анализа в дальнейшем.
Указываем `volumes` и прокидываем директории через дефис:
```yaml
volumes:
- ./var/log/nginx:/var/log/nginx #log файлы.
- ./volumes/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro #Конфигурация nginx.
- ./volumes/etc/nginx/sites-enabled:/etc/nginx/sites-enabled:ro #Конфигурация площадок.
- ./volumes/etc/nginx/ssl:/etc/nginx/ssl:ro #сертификаты
- /var/www/DOMAIN_NAME:/var/www/DOMAIN_NAME #Домашняя директория
```
Ключ `:ro` означает `read only`. Он добавлен для безопасности, чтобы внутри контейнера нельзя было изменить конфигурационные файлы.
Указываем порты `ports`. Открываем порты `80` и `443` на хосте и пробрасываем их в контейнер.
```yaml
ports:
- "80:80"
- "443:443"
```
Указываем приоритет загрузки `links`:
```yaml
links:
- php-fpm
```
Контейнер nginx не будет загружен быстрее чем контейнер с php-fpm. Делается для того, чтоб пользователя не видели 502 код ответа, в случае перегрузки контейнеров.
Указываем как часто можно перезагружаться контейнеру в случае ошибки:
```yaml
restart:
always
```
Присваиваем ip адрес контейнеру с помощью `networks`:
```yaml
networks:
default:
ipv4_address: 172.16.1.4
```
В итоге получается у так:
```yaml
nginx:
container_name: DOMAIN_NAME-nginx
hostname: DOMAIN_NAME-nginx
build: ./volumes/build/nginx
volumes:
- ./var/log/nginx:/var/log/nginx #log файлы.
- ./volumes/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro #Конфигурация nginx.
- ./volumes/etc/nginx/sites-enabled:/etc/nginx/sites-enabled:ro #Конфигурация площадок.
- ./volumes/etc/nginx/ssl:/etc/nginx/ssl:ro #сертификаты
- /var/www/DOMAIN_NAME:/var/www/DOMAIN_NAME #Домашняя директория
ports:
- "80:80"
- "443:443"
links:
- php-fpm
restart:
always
networks:
default:
ipv4_address: 172.16.1.4
```
У нас имеется контейнер nginx:
- С названием `DOMAIN_NAME-nginx`
- `hostname` в контейнере `DOMAIN_NAME-nginx`
- Собирающийся из нашего Dockerfile по адресу `./volumes/build/nginx`
- С прокинутыми директориями и файлами `./var/log/nginx`, `./volumes/etc/nginx/nginx.conf`, `./volumes/etc/nginx/sites-enabled/`, `./volumes/etc/nginx/ssl/`, `/var/www/DOMAIN_NAME/`
- Работающий на `80` и `443` портах хост машины
- Запускающийся только после контейнера php-fpm
- Часто перезагружаемый в случае ошибки и с ip адресом `172.16.1.4`.
### Пункт 6. Пишем php-fpm
Переходим к строке php-fpm.
Название:
```yaml
container_name: DOMAIN_NAME-php-fpm
```
Hostname:
```yaml
hostname: DOMAIN_NAME-php-fpm
```
Расположение Dockerfile:
```yaml
build: ./volumes/build/php-fpm8.1
```
Приоритет загрузки `links:` указывать не нужно.
Порты:
```yaml
ports:
- "9000:9010"
```
Директории, которые нужно прокинуть:
1. Директория площадки.
2. `php.ini` для быстрого изменения конфигурации (в случае необходимости).
3. Конфигурационный файл площадки.
4. log файл php.
Прокидываем:
```yaml
volumes:
- ./volumes/etc/php/fpm.pool.d/domain.conf:/usr/local/etc/php-fpm.d/domain.conf:ro #Конфигурация площадки
- ./volumes/etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro #Конфигурация php для php-fpm
- /var/log/php:/var/log/php #log файлы
- /var/www/DOMAIN_NAME:/var/www/DOMAIN_NAME #Домашняя директория
```
IP адрес:
```yaml
networks:
default:
ipv4_address: 172.16.1.5
```
Добавляем права на все изменения в докере php:
```yaml
cap_add:
- SYS_NICE
- DAC_READ_SEARCH
```
Для чего это нужно? Например php-fpm необходимо будет сменить приоритет процесса. Если данная строка будет отсутствовать, то получим ошибку:
```
mbind: Operation not permitted
```
Или, например, площадка у нас работает от пользователя `DOMAIN_NAME`. Для того, чтобы площадка работала в контейнере, php-fpm необходимо добавить пользователя в систему. Если строки не будет, то будет выдаваться аналогичная ошибка.
Перезагрузка контейнера:
```yaml
restart: always
```
Итог:
```yaml
php-fpm:
container_name: DOMAIN_NAME-php-fpm
hostname: DOMAIN_NAME-php-fpm
build: ./volumes/build/php-fpm8.1
ports:
- "9000:9010"
volumes:
- ./volumes/etc/php/fpm.pool.d/domain.conf:/usr/local/etc/php-fpm.d/domain.conf:ro #Конфигурация площадки
- ./volumes/etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro #Конфигурация php для php-fpm
- /var/log/php:/var/log/php #log файлы
- /var/www/DOMAIN_NAME:/var/www/DOMAIN_NAME #Домашняя директория
cap_add:
- SYS_NICE
- DAC_READ_SEARCH
restart: always
networks:
default:
ipv4_address: 172.16.1.5
```
У нас имеется контейнер php-fpm:
- С названием `DOMAIN_NAME-php-fpm`;
- hostname в контейнере `DOMAIN_NAME-php-fpm`;
- Собирающийся из нашего Dockerfile по адресу `./volumes/build/php-fpm8.1`. С прокинутыми директориями и файлами `./volumes/etc/php/fpm.pool.d/domain.conf`, `./volumes/etc/php/php.ini`, `/var/log/php`, `/var/www/DOMAIN_NAME/`;
- Работающий на `9000` порте хост машины;
- Часто перезагружаемый в случае ошибки и с ip адресом `172.16.1.5`.
### Пункт 7. Пишем mysql.
Переходим к строке mysql.
Название:
```yaml
container_name: DOMAIN_NAME-mysql
```
Hostname:
```yaml
hostname: DOMAIN_NAME-mysql
```
Расположение Dockerfile:
```yaml
build: ./volumes/build/mysql
```
Приоритет загрузки `links:` указывать не нужно.
Порты:
```yaml
ports:
- "3310:3310"
```
Директории, которые нужно прокинуть:
1. Директория для хранения БД.
2. Конфигурационный файл mysql.
3. log файл mysql.
Прокидываем:
```yaml
volumes:
- /var/lib/mysql:/var/lib/mysql #Директория БД.
- /var/log/mysql:/var/log/mysql #log файл
- ./volumes/mysql/conf.d:/etc/mysql/conf.d:ro #Конфигурация mysql.
```
IP адрес:
```yaml
networks:
default:
ipv4_address: 172.16.1.6
```
Перезагрузка контейнера:
```
restart: always
```
Итог:
```yaml
mysql:
container_name: DOMAIN_NAME-mysql
hostname: DOMAIN_NAME-mysql
build: ./volumes/build/mysql
ports:
- "3310:3310"
volumes:
- /var/lib/mysql:/var/lib/mysql #Директория БД.
- /var/log/mysql:/var/log/mysql #log файл
- ./volumes/mysql/conf.d:/etc/mysql/conf.d:ro #Конфигурация mysql.
networks:
default:
ipv4_address: 172.16.1.6
```
У нас имеется контейнер mysql:
- С названием `DOMAIN_NAME-mysql`;
- hostname в контейнере `DOMAIN_NAME-mysql`;
- Собирающийся из нашего Dockerfile по адресу `./volumes/build/mysql`;
- С прокинутыми директориями и файлами `/var/lib/mysql`, `/var/log/mysql:/var/log/mysql`, `./volumes/mysql/conf.d`;
- Работающий на `3010` порте хост машины;
- Часто перезагружаемый в случае ошибки и ip адресом `172.16.1.6`.
### Пункт 8. Общий итог нашего docker-compose.yml
```yaml
version: '2.4'
services:
nginx:
container_name: DOMAIN_NAME-nginx
hostname: DOMAIN_NAME-nginx
build: ./volumes/build/nginx
volumes:
- ./var/log/nginx:/var/log/nginx #log файлы.
- ./volumes/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro #Конфигурация nginx.
- ./volumes/etc/nginx/sites-enabled:/etc/nginx/sites-enabled:ro #Конфигурация площадок.
- ./volumes/etc/nginx/ssl:/etc/nginx/ssl:ro #сертификаты
- /var/www/DOMAIN_NAME:/var/www/DOMAIN_NAME #Домашняя директория
ports:
- "80:80"
- "443:443"
links:
- php-fpm
restart:
always
networks:
default:
ipv4_address: 172.16.1.4
php-fpm:
container_name: DOMAIN_NAME-php-fpm
hostname: DOMAIN_NAME-php-fpm
build: ./volumes/build/php-fpm8.1
ports:
- "9000:9010"
volumes:
- ./volumes/etc/php/fpm.pool.d/domain.conf:/usr/local/etc/php-fpm.d/domain.conf:ro #Конфигурация площадки
- ./volumes/etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro #Конфигурация php для php-fpm
- /var/log/php:/var/log/php #log файлы
- /var/www/DOMAIN_NAME:/var/www/DOMAIN_NAME #Домашняя директория
cap_add:
- SYS_NICE
- DAC_READ_SEARCH
restart: always
networks:
default:
ipv4_address: 172.16.1.5
mysql:
container_name: DOMAIN_NAME-mysql
hostname: DOMAIN_NAME-mysql
build: ./volumes/build/mysql
ports:
- "3310:3310"
volumes:
- /var/lib/mysql:/var/lib/mysql #Директория БД.
- /var/log/mysql:/var/log/mysql #log файл
- ./volumes/mysql/conf.d:/etc/mysql/conf.d:ro #Конфигурация mysql.
networks:
default:
ipv4_address: 172.16.1.6
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.16.1.0/24
```
Итак, мы разобрали базовые ключи и команды для написание docker-compose. Теперь вы можете самостоятельно писать yml, а самое главное понимать, что именно вы написали! Но перед запуском необходимо написать Dockerfile, и в следующей статье мы с вами разберем, что это такое, для чего Dockerfile нужен, и как его красиво писать. После чего запустим наш docker-compose, накатим WordPress и проверим его работу.
Спасибо за уделенное нам время. Надеемся, статья была для вас познавательной. Если остались вопросы - задавайте в комментариях, мы с радостью на них ответим. Всем удачного администрирования и чтоб ваш PROD никогда не падал!