/**/

Примечания

(звезда) Блог преподавателя: https://devenergy.ru/

Нужно: поднять Виртуалку и Докер (как д/з к вебинару), детали ниже (раздел д/з)


Домашнее задание

Собрать рабочее окружение на Docker:

Описать инфраструктуру в Docker-compose, которая включает в себя:

  • nginx (обрабатывает статику, пробрасывает выполнение скриптов в fpm)

  • php-fpm (соединяется с nginx через unix-сокет)

  • redis (соединяется с php по порту)

  • memcached (соединяется с php по порту)

  • БД подключать как контейнер (не забудьте про директории с данными)

На проверку прислать файл docker-compose.yml (чтобы можно было запустить docker-app)


Ставим докер

Качаем и ставим (под винду): https://docs.docker.com/desktop/windows/install/

(warning) надо будет поставить WSL 2 также (там написано об этом)

Установка под Windows 8

  • Скачали Docker Desktop Installer.exe
  • Установка : (минус) ошибка: требует Windows 10:

У меня на Vaio (Win+Break): Windows 8:

TODO: надо все это сделать на моем втором ноуте с Win10 (Lenovo Z710)

Установка под Windows 10

(звезда) Ставим e;t на другом ноуте, на Z710, где установлена Вин10

(плюс) Сделали под Win10:

  • Распаковался:

  • Поставился:

  • Перезагружаемся, ругается на старую винду:

  • Но при этом таки запустился, ура:

  • Перезагружаем комп.

(warning) После обновления Windows (до финальной сборки: 21H2), Докер все еще не хочет запускаться:

Переходим по предложенной ссылке, ставим обновления: https://docs.microsoft.com/ru-ru/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package

(warning) Скачиваем пакета обновления ядра Linux: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

Запускаем команды в PowerShell под администратором:

Откройте PowerShell от имени администратора (меню «Пуск» > PowerShell > щелкните правой кнопкой мыши > «Запуск от имени администратора») и введите эти команды:

# Включение подсистемы Windows для Linux
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# Включение компонента виртуальных машин
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

# Выбор WSL 2 в качестве версии по умолчанию
wsl --set-default-version 2

(плюс) Все выполнили, кажется Докер заработал:

Запускаем тестовый контейнер:

docker run -d -p 80:80 docker/getting-started

Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
59bf1c3509f3: Pull complete
8d6ba530f648: Pull complete
5288d7ad7a7f: Pull complete
39e51c61c033: Pull complete
ee6f71c6f4a8: Pull complete
f2303c6c8865: Pull complete
0645fddcff40: Pull complete
d05ee95f5d2f: Pull complete
Digest: sha256:aa945bdff163395d3293834697fa91fd4c725f47093ec499f27bc032dc1bdd16
Status: Downloaded newer image for docker/getting-started:latest
c6d3de372b51ff03951a7326f06eb639b625e5e2b002729da954054218581a8e

Смотрим инфу об установленном Докере:

docker info

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc., v0.7.1)
  compose: Docker Compose (Docker Inc., v2.2.3)
  scan: Docker Scan (Docker Inc., v0.16.0)

Server:
 Containers: 1
  Running: 1
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 20.10.12
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.16.3-microsoft-standard-WSL2
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 12.41GiB
 Name: docker-desktop
 ID: THO3:W3MA:ZV5A:EG2T:3335:WED7:TPI6:H2Z6:SR4G:JKOA:KZM3:4NWI
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support

Выполняем домашку: создаем 5 контейнеров

(звезда) Далее нам нужно создать 5 контейнеров, согласно заданию выше: nginx, php-fpm, redis, memcached, mysql ….

(warning) Возьмем за основу готовое: https://github.com/ipanardian/docker-php-nginx-mysql-memcached — нам остается сюда добавить Redis

или вот еще конфиг, с Redis: https://developpaper.com/docker-quickly-builds-and-evolves-a-php-nginx-mysql-redis-xdebug-memcached-development-environment/

Регистрируемся в Docker Cloud

Как на обычных сайтах, через Signup + подтверждение email:

https://hub.docker.com/signup

Логинимся в DockerCloud из консоли

docker login

Login with your Docker ID to push and pull images from Docker Hub. 
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: mishaikon
Password:
Login Succeeded
Logging in with your password grants your terminal complete access to your account.
For better security, log in with a limited-privilege personal access token. 
Learn more at https://docs.docker.com/go/access-tokens/

Создаем контейнеры

Контейнер Nginx

– берем как есть :

docker run -d -p 8080:80 nginx

Контейнер Php-Fpm

Создадим из примера отсюда: https://temofeev.ru/info/articles/docker-php-fpm-phpstorm-xdebug/

Создаем DockerfilePhp71 :

FROM php:7.1-fpm

RUN apt-get update && apt-get install -y 
        git 
        curl 
        wget 
        libfreetype6-dev 
        libjpeg62-turbo-dev 
        libmcrypt-dev 
        libpng-dev zlib1g-dev libicu-dev g++ libmagickwand-dev libxml2-dev 
    && docker-php-ext-configure intl 
    && docker-php-ext-install intl 
    && docker-php-ext-install mbstring zip xml gd mcrypt pdo_mysql 
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
    && docker-php-ext-install -j$(nproc) gd 
    && pecl install imagick 
    && docker-php-ext-enable imagick 
    && pecl install xdebug 
    && docker-php-ext-enable xdebug

ADD ./php.ini /usr/local/etc/php/php.ini

RUN wget https://getcomposer.org/installer -O - -q 
    | php -- --install-dir=/bin --filename=composer --quiet

RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

WORKDIR /var/www

USER 1000:1000

CMD ["php-fpm"]

(звезда) конфиг php.ini возьмем готовый из OpenServer:

Билдим контейнер php

docker build -t mishaikon/php71:latest -f DockerfilePhp71 .

[+] Building 160.0s (5/10)
 => [internal] load build definition from DockerfilePhp71                                                                                                                                                                                                                 0.0s
 => => transferring dockerfile: 37B                                                                                                                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                         0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/php:7.1-fpm                                                                                                                                                                                                            3.6s
 => [internal] load build context                                                                                                                                                                                                                                         0.1s
 => => transferring context: 19.71kB              
 ....                                                                                                                                                                                                                        0.1s
 => [2/6] RUN apt-get update && apt-get install -y         git         curl         wget         libfreetype6-dev         libjpeg62-turbo-dev         libmcrypt-dev         libpng-dev zlib1g-dev libicu-dev g++ libmagickwand-dev libxml2-dev     && docker-php-ext-c  130.1s
 => => # Setting up libpaper1:amd64 (1.1.28) ...
....
#5 336.7 Build process completed successfully
#5 336.7 Installing '/usr/local/include/php/ext/imagick/php_imagick_shared.h'
#5 336.7 Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/imagick.so'
#5 336.7 install ok: channel://pecl.php.net/imagick-3.7.0
#5 336.7 configuration option "php_ini" is not set to php.ini location
#5 336.7 You should add "extension=imagick.so" to php.ini
#5 340.0 WARNING: channel "pecl.php.net" has updated its protocols, 
use "pecl channel-update pecl.php.net" to update
#5 340.0 pecl/xdebug requires PHP (version >= 7.2.0, version <= 8.1.99), 
installed version is 7.1.33
#5 340.0 No valid packages found
#5 340.0 install failed

(звезда) исходя из поcледних ошибок, исключим из становки библитеки: imagick, xdebug

Проверяем работу php в контейнере

docker run mishaikon/php71 echo "Hello"

Hello

Пушим созданный образ в репозитарий

docker push mishaikon/php71

(он нам пригодится далее)

Using default tag: latest
The push refers to repository [docker.io/mishaikon/php71]
5f70bf18a086: Pushed
....
831c5620387f: Mounted from library/php
latest: digest: sha256:7780600c57290a69b5b6324d448666c040e50fef0879cfc392502f048dcf2e76 size: 3455

Создаем Docker-compose.yml

c конфигурацией всего веб-сервера :

# Otus PHP Pro course / Lesson 1: docker web-server container sample

version: '1'
services:
    web:
        image: nginx:latest
        volumes:
            - "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
            - "./etc/ssl:/etc/ssl"
            - "./web:/var/www/html"
        ports:
            - "8081:80"
            - "3000:443"
        environment:
            - NGINX_HOST=${NGINX_HOST}
        restart: always
        depends_on:
            - php
            - mysql
    php:
        image: mishaikon/php71:latest
        restart: always
        volumes:
            - "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
            - "./web:/var/www/html"
        ports:
            - "9090:9000"
    mysql:
        image: mysql:${MYSQL_VERSION}
        container_name: ${MYSQL_HOST}
        restart: always
        env_file:
            - ".env"
        environment:
            - MYSQL_DATABASE=${MYSQL_DATABASE}
            - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
            - MYSQL_USER=${MYSQL_USER}
            - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        ports:
            - "3307:3306"
        volumes:
            - "./data/db/mysql:/var/lib/mysql"
    memcached:
        image: memcached:${MEMCACHED_VERSION}
        container_name: ${MEMCACHED_HOST}
        ports:
            - 11212:11211

(звезда) все переменные при этом вынеем в конфиг: .env

#!/usr/bin/env bash

# Nginx
NGINX_HOST=localhost

# PHP
PHP_VERSION=7.1

# MySQL
MYSQL_HOST=mysql
MYSQL_VERSION=latest
MYSQL_DATABASE=test
MYSQL_ROOT_USER=root
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=user
MYSQL_PASSWORD=passwd

# Memcached
MEMCACHED_VERSION=latest
MEMCACHED_HOST=memcached

Билдим/запускаем контейнер

docker-compose -f ./docker-compose.yml up

[+] Running 4/4
 - Container homework-php-1  Running                                                                                                                                                                                                                                      0.0s
 - Container mysql           Recreated                                                                                                                                                                                                                                    3.9s
 - Container memcached       Recreated                                                                                                                                                                                                                                    3.9s
 - Container homework-web-1  Recreated                                                                                                                                                                                                                                    1.2s
Attaching to homework-php-1, homework-web-1, memcached, mysql
mysql           | 2022-02-15 22:29:15+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server latest started.
mysql           | 2022-02-15 22:29:15+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql           | 2022-02-15 22:29:15+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server latest started.
mysql           | 2022-02-15 22:29:16+00:00 [Note] [Entrypoint]: Initializing database files
mysql           | 2022-02-15T22:29:16.037132Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.28) initializing of server in progress as process 42
mysql           | 2022-02-15T22:29:16.048465Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysql           | 2022-02-15T22:29:16.092244Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
homework-web-1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
.....

Проверяем что веб-сервер поднят

Открываем в браузере: http://localhost:8081/index.php

(плюс) Работает:

Структура каталогов

(звезда) после всех действий выше:


Добавляем Redis

(звезда) смотрим как redis добавлен тут: https://developpaper.com/docker-quickly-builds-and-evolves-a-php-nginx-mysql-redis-xdebug-memcached-development-environment/

конфиг берем этот: redis.conf: https://gitee.com/xupaul/docker_fast_init/blob/master/config/redis/redis.conf#

Добавляем в docker-compose.yml :

    redis:
        image: redis:3.2
        volumes:
            - ./etc/redis/redis.conf:/usr/local/etc/redis/redis.conf:rw
        mem_limit: 100m
        ports:
            - "6379:6379"
        environment:
            TZ : "Europe/Moscow"

Ребилдим все

docker-compose down
docker-compose -f ./docker-compose.yml up

Проверяем

Открываем окно DockerDesktop, видим что все контейнеры работают:


Контрольные/тестовые запуски

docker run mishaikon/php71 echo "Hello"

(минус) Ошибка:

docker: error during connect: 
This error may indicate that the docker daemon is not running.: 
Post "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/create": 
open //./pipe/docker_engine: The system cannot find the file specified.
See 'docker run --help'.

(плюс) Решение: лечится запуском/перезапуском “Docker desktop“:


Исходники

(warning) Исходники всех файлов, с рабочей версией контейнеров, тут: https://github.com/nujensait/phpexp/tree/main/Courses/otus_php_pro/lesson1_docker/homework

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.