Возможно, одна из самых основных причин почему мне нравится докер это то, что он позволяет избавиться от необходимости установки на компьютер различных сервисов. К их числу можно отнести и сам веб-сервер 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 или добавим новый файл в папку, то все эти изменения сразу же будут доступны внутри контейнера. Эта важная функция и позволяет вести разработку через докер. Мы изменения вносим на своем компьютере в примонтированные файлы, папки и они сразу же отображаются и в контейнере докера.
На этом пока все. Далее будет рассмотрен пример подключения php.
Автор: Korobov Nikolay