--- 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 никогда не падал!