14 July 2019

Разработка под Docker. Локальное окружение. Часть 1

Website developmentPHP
Sandbox
Возможно, одна из самых основных причин почему мне нравится докер это то, что он позволяет избавиться от необходимости установки на компьютер различных сервисов. К их числу можно отнести и сам веб-сервер Apache или Nginx, базы данных и прочие компоненты инфраструктуры приложения. Вся инфраструктура прописана в конфигурационном файле docker-compose.yml и запускается одной командой вместе с вашим приложением. Все что нужно разработчику работающему с докером, это по сути сам докер и любимая среда разработки и ВСЕ!

Для полноты дальнейшего повествования все-таки придется бегло рассказать, что такое докер и его основные понятия.

Итак, докер следует рассматривать, как некоторую систему виртуализации и контейнеризации.
Одно из базовых понятий докера — это образ. Образ можно сравнить с файлом (может быть даже с исполняемым файлом программы), в котором содержится некоторая информация. Докер может выполнить запуск образа. Запущенный образ называется контейнером. Может быть запущено несколько контейнеров одного и того же образа.

Так что же содержится в образе?

Может быть образ операционной системы. К примеру, образ ubuntu. Может быть образ с базой данных, веб-сервером и php и практически с чем угодно. Для начала этих знаний нам будет достаточно.

Предполагается, что у читателя уже установлен сам docker и утилита docker-compose.

Начнем развертывание нашего окружения от простого к более сложному.

Урок №1. Установка Nginx


Попробуем для начала установить один лишь Nginx. Создадим docker-compose.yml следующего содержания:

version: '3.0'

services:

  nginx:
    image: nginx
    ports:
      - 80:80

Далее выполняем команду docker-compose up -d в ответ должно появиться примерно следующее:

Creating network "lesson1_default" with the default driver
Creating lesson1_nginx_1 ... done

Вводим в адресной строке браузера http://localhost/ и нашему взору должно открыться приветствие «Welcome to nginx!». Если все так, вы на верном пути.

Что тут вообще происходит?

Для понимания структуры compose-файла я рекомендую обратиться к официальной документации, несмотря на то, что она на английском это лучший источник информации. В документации описаны все возможные опции, которые могут быть использованы.

Разберем представленный файл:

  • version — В начале объявляется версия compose-файла. Вместо 3.0, можно было бы указать и 2.0. Меньше уже не поддерживается. От версии зависят опции в compose-файле, которые доступны для использования.
  • services — объявление сервисов
  • nginx — имя нашего сервиса, задается произвольно по своему усмотрению. В данном примере совпадает с названием образа.
  • image: nginx — имя используемого образа.
  • ports — директива объявляет «проброс» портов. 8080:80 — данная запись означает, что открытому порту 80 контейнера будет соответствовать порт 8080 на хостовой машине, на который запущен докер. В примере из файла, 80 порт в контейнере связан с 80 портом на вашем компьютере.

Более детально разберем объявление образа, директива image: nginx.

Главным хранилищем всех образов является Docker Hub там представлено множество различных готовых образов (Можно собирать и свои собственные, но об этом позже). Объявленный образ nginx является одним из них.

Что касается «проброса» портов. Если вы указываете соответствие 80:80, как и в указанном примере, то nginx будет доступен по адресу localhost:80 или просто localhost. Если же 80 порт уже занят, то можно указать 8080:80. Тогда сайт будет доступен по адресу localhost:8080. И соответственно, если вы вовсе забыли указать данную директиву ports, то порт будет доступен только внутри контейнера и nginx через браузер уже будет недоступен.

Контейнер запущен. А как собственно с ним работать?

Установка Веб-сервера предполагает, что мы хотим с его помощью получать и просматривать html-страницы сайта. Появляется вопрос. Каким образом можно передать в контейнер какие-либо html-файлы? В этом нам помогут volumes

volumes


Приведем наш docker-compose.yml к следующему виду:

version: '3.0'

services:

  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./html:/usr/share/nginx/html

Из нового тут появилась директива volumes, которая говорит, что происходит монтирование локальной папки ./html в контейнер по адресу /usr/share/nginx/html.

При монтирование папка по указанному адресу внутри контейнера заменяется папкой с локального компьютера.

Чтобы все заработало, создадим папку html на одном уровне с файлом docker-compose.yml и добавим в нее файл index.html с произвольным текстом. Например, Hello from Docker!

И выполняем пересоздание контейнера той же командой docker-compose up -d
Докер выполняет пересоздание контейнера.

Recreating lesson1_nginx_1 ... done

Проверяем в браузере получившийся результат. И видим: Hello from Docker! Все получилось.

Важно заметить, что монтированная папка доступна для изменений в реальном времени. Т.е. если мы изменим текст в файле index.html или добавим новый файл в папку, то все эти изменения сразу же будут доступны внутри контейнера. Эта важная функция и позволяет вести разработку через докер. Мы изменения вносим на своем компьютере в примонтированные файлы, папки и они сразу же отображаются и в контейнере докера.

Часть 2 — Nginx+PHP+MySql+phpMyAdmin
Tags:dockerdocker-compose
Hubs: Website development PHP
+29
33.5k 221
Comments 82