Установка & настройка Docker в Windows 7 для Web разработки

Необходимо выполнить следующие шаги:

  • Установить Docker
  • Выполнить настройку общий папки в «Oracle VM VirtualBox» чтобы через нее обмениваться файлами с виртуальной машиной
  • Настроить окружение для запуска (включает в себя либо запуск и связывание контейнеров в ручную, либо автоматизацию данного процесса посредством использования docker-compose)

Установка Docker

  1. Проверить поддерживает ли компьютер виртуализацию с помощью программы.
  2. Установить Install Docker Toolbox
  3. Запустить «Docker Quickstart Terminal» из ярлыка на рабочем столе

Возможно при запуске будет ошибка:

Looks like something went wrong in step ?Looking for vboxmanage.exe?

  1. Для ее устранения необходимо установить\переустановить VirtualBox
  2. После установки запустить командную строку («Windows» + «R» -> cmd)
  3. Выполнить команды:
docker -v

Это позволит узнать правильно ли установлен docker и какая версия используется.

docker-compose --version

Данная команда позволяет узнать какая версия docker-compose (утилита, позволяющая использовать мультиконтейнерные сборки) используется.

  1. Дополнительно стоит установить общую папку для обмена фалами между виртуальной машиной и компьютером.

Указанные в статье ссылки могут стать неактуальными, в связи с тем что прекращается поддержка Windows 7. Утилиты возможно придется искать в web архиве.

Настройка общей папки

  1. В проводнике Windows найти и запустить программу «Oracle VM VirtualBox»
  2. Для выбранной виртуальной машине (default по умолчанию) выбрать настройки, откроется окно:
  1. Выбрать раздел «Общие папки»:
  1. Нажать кнопку «Добавить новую общую папку».
  1. В открывшемся окне:
    • в поле «Путь к папке» указать месторасположение общей папки
    • в поле «Имя папки» указать краткое наименование («alias»), с его помощью будет осуществляться ссылка на папку в файле для docker-compose
    • установить флажок «Авто-подключение»
    • установить флажок «Создать постоянную папку»

Не стоит использовать кириллицу в пути, так как это может вызвать проблемы с доступом к файлам.

Настройка окружения для запуска проекта

«Ручной» запуск контейнеров
  1. Запустить командную строку
  2. Подготовить контейнер с php:
docker pull php:7.4-apache
  1. Проверка запуска скрипта php:
docker run --rm -v /SharedFolderName/PathToProject:/app php:7.4-apache php /app/someFile.php

Данная команда:

  • запускает контейнер php:7.4.2-apache, который следует удалить после выполнения (—rm)
  • перед запуском копирует содержимое папки SharedFolderName/PathToProject в папку /app виртуальной машины (вместо SharedFolderName следует использовать alias заданный в разделе «Настройка общей папки»).
  • после запуска запускает интерпритатор php с указанием выполнить файл /app/someFile.php.

Если в процессе запуска возникают ошибки, то стоит проверить правильность настроек общей папки.

Так же запрещено использоваться двоеточие («:») в случае задания абсолютного пути к копируемым файлам, так как данный символ служит для разделения параметров внутри маппинга (-v) файлов.

  1. Проверка выполнения запуска скрипта через браузер
docker run -v /SharedFolderName/PathToProject:/var/www/html -p 8080:80 php:7.4-apache

Может возникнуть ошибка вида (подробнее про нее в статье):

Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message

Эту ошибку игнорируем, она не помешает. Если командная строка подвиснет, вернуть ее в нормальное состояние можно нажатием «Ctrl» + «C».

В Window 7 не удается достучаться до виртуальной машины через браузер по адресу: localhost:8080. Вместо него нужно использовать ip, использующийся docker, чтобы его узнать, выполнить:

docker-machine ip
<someIP>

К скриптам нужно обращаться: someIP:8080.

  1. Добавление расширений в работающий контейнер (при перезапуске контейнера все произведенные действия будут потеряны):
  • узнать id контейнера
docker ps

Выведет список запущенных контейнеров, в столбце «CONTAINER ID» будет указан ID контейнера, собранного из образа, указанного в столбце «IMAGE».

  • войти в контейнер
docker exec -i -t <ID> bash

Вместо <ID> используется идентификатор контейнера (можно использовать уникальную для всех контейнеров часть ID)

  • установить расширение (для примера pdo_mysql):
docker-php-ext-install pdo_mysql
  • активировать установленное расширение:
docker-php-ext-enable pdo_mysql
  • установка и активация mysqli:
docker-php-ext-install mysqli &amp;&amp; docker-php-ext-enable mysqli
  • перезапустить apache:
service apache2 reload
  • для выхода из контейнера:
exit
Запуск сохраненных инструкций для контейнера
  1. Для сохранения инструкций на постоянной основе создать файл с именем: Dockerfile
  2. Внутрь файла поместить строки:
FROM php:7.4-apache

RUN docker-php-ext-install pdo_mysql &amp;&amp; docker-php-ext-enable pdo_mysql
RUN docker-php-ext-install mysqli &amp;&amp; docker-php-ext-enable mysqli
  1. Выполнить:
docker build . -t server
  1. Запускать:
docker run -v /SharedFolderName/PathToProject:/var/www/html -p 8080:80 server
Остановка ранее запущенных контейнеров

Выполнить:

docker stop <ID>
Просмотр сообщений в запущенном контейнере

Выполнить:

docker logs <ID>
Создание связи между контейнерами

Будет рассмотрено на примере связи php c контейнером mysql

  1. Запустить контейнер mysql:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=pwd -e MYSQL_DATABASE=test -d mysql:5.7.25
  1. Создать связь между контейнерами:
  • через связь между контейнерами
docker run --link mysql -v /SharedFolderName/PathToProject:/var/www/html -p 8080:80 server

В контейнере server можно будет обращаться к mysql через указание имени сервера mysql:

<?php

$pPOD = new PDO( 'mysql:host=mysql;dbname=test', 'root', 'pwd');

?>
  • через создание сети

в этом случае следует дать контейнеру server имя (в примере srv)

docker run —name srv -v /SharedFolderName/PathToProject:/var/www/html -p 8080:80 server

создание сети:

docker network create -d bridge bridgeName

помещение контейнеров в сеть

docker network connect --alias MySqlAliasInBridge bridgeName mysql
docker network connect --alias ServerAliasInBridge bridgeName server

В случае задания alias по нему стоит обращаться, указывая в качестве имени сервера:

<?php

$pPOD = new PDO( 'mysql:host=MySqlAliasInBridge;dbname=test', 'root', 'pwd');

?>

Создание сборки контейнеров (рабочее окружение)

Создание окружения будет показано на примере следующей структуры папок

env\Папка, в директории SharedFolderName/PathToProject, в которой сохраняется описание необходимого окружения
env\mysqlБудет использоваться для хранения данных БД (чтобы сохранялось состояние между запусками)
env\phpСодержит файл Docker с инструкциями для сборки контейнера с php
codeСодержит файлы проекта
типовая структура папки, содержащей описание рабочего окружения
  1. Создать файл docker-compose.yaml в папке env:
version: "3"

services:
  server:
    build: ./php
    ports:
      - "8088:80"
    volumes:
      - /SharedFolderName/PathToProject/code:/var/www/html
    depends_on:
     - mysql
  mysql:
    image: mysql:5.7.25
    volumes:
      - /SharedFolderName/PathToProject/env/mysql:/var/lib/mysql
    command: "--innodb_use_native_aio=0"
    environment:
      MYSQL_ROOT_PASSWORD: pwd
  1. Подготовить сборку к запуску
docker-compose build
  1. Запускать сборку с помощью:
docker-compose up -d

В процессе запуска необходимо проверить контейнер mysql на предмет содержания ошибок. В случае возникновения ошибки вида:

[ERROR] --initialize specified but the data directory has files in it. Aborting.

Данная ошибка означает, что в секции mysql была пропущена команда запрещающая использовать подсистему асинхронного ввода/вывода Linux (command: «—innodb_use_native_aio=0»).

  1. Для выключения использовать:
docker-compose down -v

-v — удаляет именованные директории