Вы можете передавать переменные окружения из вашей оболочки непосредственно в контейнер, просто установив ключ окружения в файле compose без указания его значения.
Docker и docker-compose для начинающих. Докеризуем интернет-магазин
Docker есть везде. Раньше о нем думали как об очередном развлечении для неугомонных разработчиков, но Docker оказался чем-то другим. Если jquery и zend framework были написаны в каждом проекте, то теперь пишут git и docker. Я не удивлюсь, если Docker станет стандартом, как когда-то стал Git. Или уже есть, я тот, кто только что вышел из пещеры.
Зачем мне нужен Docker? Я не знал и не знал, я сидел и не мог понять, что же происходит сейчас?
Вы, дорогие читатели, вдохновили меня на участие. Правда? На полном серьезе. Четверть вопросов об электронном магазине звучат примерно так: Это не работает, что мне делать? Почти всегда причина в том, что вам нужно настроить среду. Установить веб-сервер, заставить работать php и mysql, развернуть базу данных и прочие обычные вещи.
Вопрос о создании среды для веб-проектов занимает меня уже давно.
Когда я начинал свои первые веб-проекты, мне удалось установить Apache, PHP и Mysql на Windows 7. Это было около 8 лет назад. Это история о том, что «я сделал это однажды, но не могу сделать это снова». Это медаль, которая дается раз в жизни.
Моя вторая попытка разобраться с окружением рабочего стола была предпринята в 2015 году. В то время я написал большую статью о том, как разработать среду для веб-разработчиков. Это было страшно, но именно так я работал над собой. План заключался в использовании windup в качестве основной операционной системы и установке виртуальной машины VirtualBox в windup под управлением debian. Под debian были установлены nginx, php, mysql и nodejs. Также ssh-server на виртуальной машине и ssh-client на виртуальной машине. Все подогнано друг к другу как по волшебству и действительно работает! Я не жалею, что совершил эту глупость, но не советую вам делать то же самое. Ты просто не можешь. Мир стал намного проще.
Потом я перешел на Linux, и сразу стало легче. Nginx, php и mysql были установлены с помощью нескольких команд. После установки вы находите общую конфигурацию для nginx — и все готово. Настройка виртуального хоста для нового проекта — дело двух минут. До сегодняшнего дня я работал именно так.
Но вопрос читателя не дает мне покоя. В конце концов, мы все разные. Некоторые только начинают разбираться в веб-разработке. Другие работают с ветром, потому что им так удобнее. Другие работают на переднем крае и не интересуются php и базами данных. Они хотят прикоснуться к коду javascript, а
Да, да. Забудьте о nginx, php и mysql, о том, что под капотом есть webpack и не нужно забывать устанавливать npm — всю эту работу делает Docker. Вам больше не нужно думать, работает ли ваша версия PHP или какая база данных вам нужна. Все, что делает этот Docker под капотом. Нас оставляют в покое, чтобы мы работали над кодом и не думали об окружающей среде.
Конечно, все это звучит замечательно, но прежде чем вы сможете так легко использовать Docker, вам нужно понять, как и что.
Докер
Пока я изучал эту тему, я прочитал десятка три статей о Docker. Но в моей голове все не укладывалось, пока я не нашел это.
Я рекомендую эту статью всем, кто не хочет просто копировать примеры из моей статьи, а хочет разобраться в Docker, образах, контейнерах, как монтировать папки и файлы, как выполнять команды и многих других полезных вещах. Статья обширная, но написана по-человечески, простым языком, с примерами и аналогиями из жизни.
Прежде чем перейти к техническим деталям, давайте обсудим, почему программист должен быть заинтересован в docker-compose в первую очередь. Вот несколько причин, по которым разработчикам стоит задуматься об использовании Docker в своей работе.
Docker Compose позволяет загрузить всю среду разработки одной командой: docker-compose up, и так же легко загрузить ее с помощью docker-compose down. Это позволяет нам, разработчикам, хранить нашу среду разработки в одном центральном месте и помогает нам легко развертывать наши приложения.
Еще одной замечательной особенностью Compose является поддержка быстрого и итеративного запуска модульных и E2E-тестов путем размещения их в собственном окружении. Это означает, что вам не нужно тестировать приложение на локальной/хостовой операционной системе, а можно использовать среду, которая близко напоминает производственные условия.
Основы докера
Compose использует имена проектов для изоляции сред друг от друга, что имеет следующие преимущества:
Теперь, когда вы знаете, почему Compose полезен и где он может улучшить рабочий процесс для нас, разработчиков, давайте рассмотрим некоторые распространенные случаи использования.
Why care about Docker-compose
Традиционно Compose был ориентирован на разработку и тестирование, но теперь его можно использовать и для развертывания и управления целым контейнерным развертыванием на одной хост-системе.
Portability:
Compose предоставляет возможность запускать приложения в изолированной среде, которая может работать на любой машине с установленным Docker. Это очень упрощает тестирование приложения и дает возможность работать в среде, максимально приближенной к производственной.
Testing:
Файл Compose управляет всеми зависимостями (базами данных, очередями и т.д.).
Multiple isolated environments on a single host:
sudo chmod +x /usr/local/bin/docker-compose
- You can run multiple copies of the same environment on one machine
- It prevents different projects and service from interfering with each other
Common use cases
После этого вы можете проверить свою установку с помощью следующей команды:
Single host deployments:
docker-compose —version
Development environments:
Docker используется для управления отдельными контейнерами (сервисами), из которых состоит приложение.
Docker Compose используется для одновременного управления несколькими контейнерами, которые являются частью приложения. Этот инструмент предлагает те же функции, что и Docker, но позволяет управлять более сложными приложениями.
Automated testing environments:
Docker (один контейнер) и Docker Compose (несколько контейнеров).
Installation
В умелых руках Docker Compose — это очень мощный инструмент, который позволяет очень быстро развертывать сложные архитектурные приложения. Теперь мы рассмотрим практический пример использования Docker Compose, чтобы вы могли лучше оценить преимущества, которые может дать вам Docker Compose.
Windows and Mac:
Представьте, что вы являетесь разработчиком веб-проекта. Этот проект включает в себя два веб-сайта. Первый позволяет предпринимателям создать интернет-магазин всего за несколько кликов. Второй — это обслуживание клиентов. Два веб-сайта взаимодействуют с одной и той же базой данных.
Linux:
Ваш проект становится все более популярным, и оказывается, что мощности сервера, на котором он работает, уже недостаточно. В результате вы решаете перенести весь проект на другой компьютер.
К сожалению, вы не использовали что-то вроде Docker Compose. Поэтому вам придется переносить и перенастраивать службы одну за другой и надеяться, что вы ничего не забыли.
Если вы используете Docker Compose, вам нужно выполнить всего несколько команд для переноса проекта на новый сервер. Чтобы завершить перенос проекта на новый сайт, достаточно внести некоторые изменения и загрузить резервную копию базы данных на новый сервер.
Теперь, когда вы знаете, почему мы будем использовать Docker Compose, пришло время создать свое первое клиент-серверное приложение с помощью этого инструмента. В частности, мы собираемся разработать небольшой веб-сайт (сервер) на Python, который может экспортировать файл с некоторым текстом. Этот файл запрашивается с сервера программой (клиентом), которая также написана на языке Python. Когда программа получает файл с сервера, она извлекает хранящийся в нем текст на экран.
Обратите внимание, что мы ожидаем, что вы знаете основы Docker и что у вас уже установлена платформа Docker.
Давайте начнем работать над проектом.
Чтобы создать свое первое клиент-серверное приложение, необходимо сначала создать папку проекта, которая должна содержать следующие файлы и папки:
Разница между Docker и Docker Compose
. ├── client/ ├── docker-compose.yml └─ server/ 2 директории, 1 файл.
Здесь мы объясним некоторые основы Docker при создании сервера.
Перейдите в папку сервера и выберите d
Типичный сценарий использования Docker Compose
#!/usr/bin/env python3 # Внесите системные библиотеки Python. # Эти библиотеки используются для сборки веб-сервера. # Вам не нужно устанавливать ничего специального, эти библиотеки устанавливаются вместе с Python. import http.server import socketserver # Эта переменная нужна для обработки клиентских запросов к серверу. handler = http.server.SimpleHTTPRequestHandler # Здесь мы указываем, что сервер должен работать на порту 1234. # Постарайтесь запомнить эту информацию, поскольку она пригодится позже при работе с docker-compose. with socketserver.TCPServer((«», 1234), handler) as httpd: # С помощью этой команды сервер будет работать постоянно и ждать запросов от клиента. httpd.serve_forever()
С помощью этого кода вы можете создать простой веб-сервер. Он предоставляет клиенту файл index.html, содержимое которого впоследствии будет воспроизведено на веб-странице.
В файл index.html добавьте следующий текст:
Docker Compose — это волшебство!
Этот текст будет отправлен клиенту.
Разработка клиент-серверного приложения с использованием Docker Compose
Теперь мы создадим простой Dockerfile, который будет отвечать за организацию среды выполнения сервера Python. В качестве основы для создаваемого образа мы будем использовать официальный образ Docker, предназначенный для запуска программ, написанных на языке Python. Ниже приведено содержимое файла Docker:
В качестве примера приведен небольшой веб-сайт (сервер) на языке Python, который может отображать текстовый файл. Клиент, также в Python, делает запрос на него. Когда файл получен сервером, программа отображает текст файла.
Мы предполагаем, что разработчик знаком с основами Docker, у него уже установлена эта программа, а на локальном веб-сервере запущен тестируемый проект.
▍1. Создание проекта
Примечание. Этот проект был создан и протестирован на дистрибутивах Ubuntu и CentOS 7. Стандартный терминал Linux используется для выполнения всех следующих команд.
- Файл docker-compose.yml. Это файл Docker Compose, который будет содержать инструкции, необходимые для запуска и настройки сервисов.
- Папка server. Она будет содержать файлы, необходимые для обеспечения работы сервера.
- Папка client. Здесь будут находиться файлы клиентского приложения.
Построение тестируемого клиент-серверного приложения начинается с создания каталога проекта (в примере "project").
▍2. Создание сервера
Элементы каталога
2a. Создание файлов
Содержимое основного каталога проекта отображается в следующем формате:
- Файл server.py. В нём будет находиться код сервера.
- Файл index.html. В этом файле будет находиться фрагмент текста, который должно вывести клиентское приложение.
- Файл Dockerfile. Это — файл Docker, который будет содержать инструкции, необходимые для создания окружения сервера.
Подготовка файла сервера
2b. Редактирование Python-файла.
Необходимо открыть каталог «server», чтобы создать в нем следующие файлы:
После создания трех вышеупомянутых файлов содержимое каталога "server" должно выглядеть следующим образом:
Теперь откройте файл «server.py» в вашем любимом текстовом редакторе и вставьте следующий код:
2c. Редактирование HTML-файла
#!/usr/bin/env python3 # Импортируйте системные библиотеки Python. # Эти библиотеки будут использоваться для сборки веб-сервера. # Вам не нужно устанавливать ничего особенного, эти библиотеки устанавливаются вместе с
В предыдущих шагах были созданы два проекта - серверное приложение и клиентское приложение. Оба имеют свой собственный файл Docker. Пока реализованы только основные функции Docker. Далее Docker Compose устанавливает соединение с проектом. Для этого необходимо отредактировать файл docker-compose.yml, который вы создали ранее.
Этот пример не предназначен для ознакомления со всеми возможными командами, которые могут быть использованы в docker-compose.yml. Основная цель — посмотреть, как Docker Compose может быть реализован на практике.
2d. Редактирование файла Dockerfile
Это важно: при добавлении информации в файл docker-compose.yml убедитесь, что вы сохранили форматирование, приведенное в примере. В частности, это касается отступов перед блоками. Если интервал не соблюден, будет выдана ошибка.
Создание клиент-серверного приложения
# Файл docker-compose должен начинаться с тега версии. # Мы используем «3», так как это последняя версия на момент написания данного кода. версия: «3» # Обратите внимание, что docker-composes работает с сервисами. 1 услуга = 1 контейнер. # Служба может быть клиентом, сервером или сервером базы данных. # Раздел, описывающий услуги, начинается с «services». services: # Это создает клиентское приложение и серверное приложение. # Это означает, что нам нужны две службы. # Первая служба (контейнер): сервер. Вы можете назвать его так, как захочет разработчик. # Четкое название службы помогает определить ее роль. # Здесь мы используем ключевое слово ‘server’, чтобы назвать соответствующую службу. server: # Ключевое слово ‘build’ позволяет вам указать # путь к файлу Docker, который вы хотите использовать для создания образа, который # позволит запустить службу. # Здесь ‘server/’ соответствует пути к папке сервера, # содержащей соответствующий файл Docker. build: server/ # Команда, которая будет выполнена после # создания образа. # Следующая команда означает, что команда ‘python ./server.py’ выполнена. Команда: python ./server.py # Не забудьте указать порт 1234 в качестве порта в ‘server/server.py’. # Если вы хотите общаться с сервером с вашего компьютера (когда вы не находитесь в контейнере), # перенаправьте этот порт на порт вашего компьютера. # Для этого используется ключевое слово «ports». # Используется следующая конструкция: Порт компьютера:Порт контейнера # В данном случае следует использовать порт компьютера 1234 и подключиться к порту контейнера # 1234 (так как это порт, на котором сервер ожидает запросы). порты: — 1234:1234 # Второй сервис (контейнер): клиент. # Эта служба называется «клиент». client: # Здесь ‘client/’ соответствует пути к папке, содержащей # Docker файл для клиентской части системы. build: client/ # Команда
$ docker-compose exec имя службы команда
$ docker-compose images
Разработка проекта
Создание основного каталога
Надежный веб-хостинг. 14 дней — бесплатно!
Мы всегда рядом с вами в социальных сетях
- Файл docker-compose.yml. В нем сохраняются инструкции, которые используются для запуска и дальнейшей настройки сервисов.
- Каталог server. Здесь будут храниться файлы, отвечающие за функционирование сервера.
- Каталог client. В нем расположены файлы для клиент-приложения.
Поддержка в привычной для вас обстановке
Работа с папкой server
Мы на Яндекс Q
Содержимое файла docker-compose.yaml зависит от инструментов, используемых в проекте. Например, если ваш стек — это Nginx / Flask / MongoDB, структура должна выглядеть следующим образом:
- Файл server.py. Предназначен для хранения программного кода сервера.
- Файл index.html. Здесь сохранен текст, который должно выводить при запросе клиент-приложение.
- Файл Dockerfile. Непосредственно файл контейнера, который содержит директивы для создания серверного окружения.
├── docker-compose.yaml ├── flask │ ├── Dockerfile │ ├── requirements.txt │ └── server.py └── nginx └── nginx.conf.
Работа с файлом server.py
Базовый docker-compose выглядит следующим образом
services: web: image: nginx volumes: - ./nginx/nginx.conf:/tmp/nginx.conf Environment: - FLASK_SERVER_ADDR=backend:9091 Command: /bin/bas h-c "envsubst
/etc/nginx/conf.d/default.conf && ngin x-g ‘daemon off;'» порты: — 80:80 depends_on: — backend backend: build: flask environment: — FLASK_SERVER_PORT=9091 volumes: — ./flask:/src depends_on: — mongo mongo: image: mongo
Работа с файлом index.html
Файл также может выглядеть более сложным. В качестве примера возьмем стек из React, Spring и MySQL.
В предыдущих шагах были созданы два проекта - серверное приложение и клиентское приложение. Оба имеют свой собственный файл Docker. Пока реализованы только основные функции Docker. Далее Docker Compose устанавливает соединение с проектом. Для этого необходимо отредактировать файл docker-compose.yml, который вы создали ранее.
Работа с Dockerfile
Конфигурация Docker Compose:
Работа с Docker Compose
services: backend: build: backend restart: always secrets: — db-password environment: MYSQL_HOST: db networks: — react-spring — spring-mysql depends_on: db: condition: service_healthy db: # Мы используем образ mariadb, который поддерживает amd64 и arm64 Image: mariadb:10.6. 4-focal # Если вы действительно хотите использовать MySQL, извлеките следующую строку #image: mysql:8. 0. 19 окружение: — MYSQL_DATABASE=example — MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password restart: always healthcheck: test: «CMD», «mysqladmin», «ping», «-h», «127. 0.0. 1», «—silent» interval: 3s retries: 5 start_period: 30s secrets: — db-password volumes: — db-data:/var/lib/mysql networks: — spring-mysql frontend: build: context: frontend target: development ports: — 3000:3000 volumes: -. /frontend/src:/code/src — /project/node_modules networks: — react-spring depends_on: — backend expose: — 3306 — 33060 volumes: db-data:
секреты: db-password: файл: db/password.txt сети: react-spring:
Пример файла docker-compose.yml
spring-mysql:
Это кажется пугающим, но теперь вы должны знать, что означают все эти пункты и как изменить конфигурацию в соответствии с вашими потребностями.
Создание готового образа
Еще больше полезной информации вы можете найти в репозитории Awesome Compose на GitHub. Там вы найдете примеры приложений с несколькими встроенными сервисами, одиночными сервисами и базовыми конфигурациями для различных платформ.
Дополнительная информация
Создайте пустую папку проекта. Название может быть любым. Папка должна содержать только ресурсы для создания изображения.
- Команда предназначена для остановки и удаления контейнеров, которые были созданы с помощью «docker-compose up»:
Поместите файл Docker в каталог проекта. Укажите содержимое изображения. Добавьте в файл следующие строки:
- Ознакомиться с журналами сервисов можно выполнив команду:
FROM python:3 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYT
- Посмотреть список используемых сервисов можно командой (на примере данного проекта):
В docker-compose.yaml определены два сервиса - db и web. Обратите внимание, что в конфигурации используется порт 8000. Это решение подходит только для локальной разработки, его нельзя использовать в производственной среде.
- Чтобы запустить команду в работающем контейнере используется следующий синтаксис:
Создайте проект Django. Перейдите в корень каталога приложения и выполните команду:
- Увидеть в терминале список образов можно, введя команду:
sudo docker-compose run web django-admin startproject composeexample .
Эта команда указывает django-admin startproject composeexample на запуск веб-образа в контейнере. Поскольку он еще не существует, compose создает web из текущего каталога, как определено в файле docker-compose.yaml.
Просмотрите содержимое контейнера после выполнения команды:
l s-l Выход: drwxr-xr-x 2 root composeexampl e-rww-rw— 1 user docker-compose.yam l-rww-rw— 1 user Dockerfil e-rwxr-xr-x 1 root root manage.p y-rww-rw— 1 user requirements.txt
Теперь подключите базу данных. Откройте и отредактируйте файл composeexample/settings.py. Найдите строку «DATABASES =» и замените ее на:
Примеры проектов с Docker Compose
Сохраните и закройте файл.
Вернитесь в каталог проекта верхнего уровня и выполните команду:
docker-compose up Выход: djangosample_db_1 обновлен Создать djangosample_web_1. Create djangosample_web_1. done Attaching to djangosample_db_1, djangosample_web_1 db_1 | Files belonging to this database system will be owned by user «postgres». db_1 | This user must also be the owner of the server process. db_1 | db_1 | Кластер базы данных инициализируется с расположением «en_US.utf8». db_1 | Кодировка базы данных по умолчанию установлена на «UTF8». db_1 | Настройки поиска текста по умолчанию установлены на «english». web_1 | 30 июля 2020 — 18:35:38 web_1 | Django версии 3.0.8, используя ‘composeexample.settings’ web_1 | Запустите сервер разработки по адресу http://0.0.0.0:8000/ web_1 | Остановите сервер с помощью CONTROL-C.
Теперь приложение должно быть запущено. Чтобы проверить это, откройте браузер и перейдите на сайт http://localhost:8000.Просмотрите список процессов, запущенных с помощью этой команды:
Вы должны увидеть две службы — Django и Postgres.
Выйдите из приложения с помощью Ctrl + C или используйте команду :
docker-compost down
У вас есть контейнер с двумя встроенными сервисами, которые можно улучшать и расширять.<>В этом руководстве рассматриваются только основы использования Docker Compose. На практике вам часто придется обращаться к документации, в которой очень подробно описаны возможности и способы использования этого инструмента управления контейнерами.<>Чтобы углубить свои знания о Docker Compose, посмотрите это видео с тематическим исследованием:<>