genbodev2
8/29/2017 - 9:45 AM

Docker

Docker

Настройка окружения при помощи 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 - проверка

###Подготовим проект

Кореньlocaldevlocaldev/...localdev/.../...Примечание
localdevhtmlindex.phpПапка проекта
dockernginxdefault.confКонф. ngnix
dockernginxphpmyadmin.confКонф. phpMyAdmin
dockerapacheDockerfileбилд apache
dockerapachephp.iniКонф. php
dockerdbДля БД
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.* редиректит к контейнеру apache proxy_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.