Docker
Мануал для настройки под centos 7 и (частично) windows
###Ставим docker
https://docs.docker.com/engine/installation/linux/docker-ce/centos/
> установка, обновления, удаление > перейти
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- установка необходимых пакетов
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- установка docker ce
sudo systemctl start docker
- старт
sudo docker run hello-world
- проверка
###Ставим docker-composer / запуск контейнеров в соответствии с файлом конфигурации
https://docs.docker.com/compose/install/
> установка, обновления, удаление > перейти
Установка версии 1.15.0
sudo curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
- права на выполнение
docker-compose --version
- проверка
###Подготовим проект
Корень | localdev | localdev/... | localdev/.../... | Примечание |
---|---|---|---|---|
localdev | html | index.php | Папка проекта | |
docker | nginx | default.conf | Конф. ngnix | |
docker | nginx | phpmyadmin.conf | Конф. phpMyAdmin | |
docker | apache | Dockerfile | билд apache | |
docker | apache | php.ini | Конф. php | |
docker | db | Для БД | ||
docker-compose.yml | Конф. docker | |||
.git | Другие папки | |||
.gitignore | Другие файлы | |||
package.json | Другие файлы |
###Файл конфигурации Пример файла docker-compose.yml:
version: "3"
services:
nginx:
image: nginx
volumes:
- ./docker/nginx/:/etc/nginx/conf.d/
networks:
- front
- backend
apache:
build: ./docker/apache
volumes:
- ./:/var/www/
- ./docker/apache/php.ini:/usr/local/etc/php/php.ini
networks:
- backend
db:
image: "mysql:5.7"
volumes:
- ./docker/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: local
MYSQL_USER: local
MYSQL_PASSWORD: local
networks:
- backend
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
environment:
- PMA_HOST=db
- PMA_USER=local
- PMA_PASSWORD=local
volumes:
- /sessions
networks:
- backend
networks:
front:
external:
name: front
backend:
Рассмотрим сервисы (контейнеры) в этом файле ####nginx
nginx:
image: nginx
volumes:
- ./docker/nginx/:/etc/nginx/conf.d/
networks:
- front
- backend
image
- образ, nginx можно использовать самый последний, поэтому версия не указывается
volumes
- при создании контейнера содержимое каталога ./docker/nginx/
будет скопировано в /etc/nginx/conf.d/
. Синхронизация будет постоянна и в обе стороны
Конфиг ngnix default.conf
server { listen 80; server_name my.*; location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @fallback; } location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { try_files $uri $uri/ @fallback; } location / { try_files /does_not_exists @fallback; } } location @fallback { proxy_pass http://apache:80; proxy_redirect http://apache:80 /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.ht { deny all; } gzip on; gzip_comp_level 5; gzip_disable "msie6"; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; }
listen 80
- nginx слушает порт 80
server_name my.*
все запросы к судбдомену my.* редиректит к контейнеру apacheproxy_redirect http://apache:80 /
Конфиг ngnix phpmyadmin.conf
server { listen 80; server_name pma.*; location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @fallback; } location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { try_files $uri $uri/ @fallback; } location / { try_files /does_not_exists @fallback; } } location @fallback { proxy_pass http://phpmyadmin:80; proxy_redirect http://phpmyadmin:80 /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.ht { deny all; } gzip on; gzip_comp_level 5; gzip_disable "msie6"; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; }
networks
- сети, nginx будет работать в двух сетях, но об этом ниже
####apache
apache:
build: ./docker/apache
volumes:
- ./:/var/www/
- ./docker/apache/php.ini:/usr/local/etc/php/php.ini
networks:
- backend
Данному контейнеру нужна сборка: build: ./docker/apache
- в этом каталоге разместим файл Dockerfile:
FROM php:5-apache
# PHP extensions
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
&& pecl install xdebug \
&& docker-php-ext-install -j$(nproc) mbstring pdo_mysql tokenizer mcrypt iconv mysqli \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-enable xdebug
# Apache modules
RUN a2enmod rewrite
FROM php:5-apache
- какой образ будет использоваться
Дальше идут различные расширения php и запуск mod_rewrite
apache volumes
<VirtualHost *:80> ServerName 127.0.0.1 ServerAdmin webmaster@server.ru DocumentRoot /var/www/html </VirtualHost>
Выше представлен пример из файла конфигурации apache.
В конфигурации docker для контейнера apache указано два тома.
Первый
./:/var/www/
- перенесет ВСЮ папку проекта в /var/www. То есть и папку html тоже. А она то как раз и является DocumentRoot в конфиге apache.
Второй
./docker/apache/php.ini:/usr/local/etc/php/php.ini
скопирует конфиг к php. Но так как по умолчанию его нет при билде - его нужно создать самостоятельноmax_execution_time = 60 memory_limit=256M error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED [Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Asia/Yekaterinburg [mbstring] mbstring.func_overload = 2 mbstring.internal_encoding = UTF-8
####MySql
db:
image: "mysql:5.6"
volumes:
- ./docker/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: local
MYSQL_USER: local
MYSQL_PASSWORD: local
networks:
- backend
image
- образ, на этот раз с версией
volumes
- Папка /var/lib/mysql содержит весь контент базы данных, он будет синхронизироваться с ./docker/db
environment
- Переменные окружения в блоке environment говорят что контейнеру надо сразу при старте создать базу, пользователя и пароль у пользователя. Плюс для рута поставить пароль root.
Для доступа к БД используется хост и порт db:3306. db - потому что так называется сервис в docker-compose.yml
####phpMyAdmin
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
environment:
- PMA_HOST=db
- PMA_USER=local
- PMA_PASSWORD=local
volumes:
- /sessions
networks:
- backend
image
- Используем последнюю версию через флаг latest
environment
- Настройки для подключения к БД, хост, пользователь и пароль
Впоследствии, при переходе на pma.example.com
- мы попадем в панель phpMyAdmin.