Dockerfile | Docker Compose | MySQL | phpMyAdmin | Горячая перезагрузка

Прежде чем приступить к реализации, давайте сначала кратко поговорим о необходимости докера.

Распространенная проблема, с которой сталкивается каждый разработчик

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

Docker - это компьютерная программа, которая выполняет виртуализацию на уровне ОС, то есть контейнеризацию. С помощью докера мы можем настроить общую среду, чтобы код, работающий на компьютере разработчика, без проблем запускался на других компьютерах.

Установите простое приложение HELLO WORLD Golang

Я буду создавать простое приложение hello world с использованием веб-фреймворка джин.

Сначала давайте создадим новый модуль с именем golang-docker. Это создает go.mod файл. Теперь этот файл делает информацию о версии зависимостей явной и упрощает управление.

go mod init golang-docker

Создадим main.go файл и напишем следующий код.

У нас есть готовое приложение HELLO WORLD golang. Выполните следующую команду, чтобы запустить сервер.

go run main.go

Давайте контейнеризуем вышеупомянутое приложение Hello World Golang

Будем делать три контейнера

  1. Веб-сервер Golang
  2. База данных MySQL
  3. phpMyAdmin для графического интерфейса базы данных

Мы будем напрямую использовать образ докера для базы данных MySQL и phpMyAdmin. Но нам нужно создать собственное изображение для нашего приложения golang. Для этого мы создадим Dockerfile.

Что такое Dockerfile?

Dockerfile - это текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки изображения.

Давайте создадим папку докеров, в которой будут храниться все, что связано с докерами. Внутри папки docker создайте app.dockerfile и напишите следующий код.

Позвольте мне кратко объяснить код

  • [Строка 1]: мы используем golang:alphine в качестве базового изображения, на котором мы будем создавать / добавлять к нему дополнительные слои.
  • [Строка 3]: Здесь мы создаем папку golang-docker внутри нашего базового контейнера и устанавливаем ее в качестве рабочего каталога, что означает, что любая команда с этого момента будет выполняться из этого каталога.
  • [Строка 5]: здесь мы добавляем все наши файлы / папки в рабочий каталог контейнера.
  • [Строка 7]: Здесь мы устанавливаем все наши зависимости нашего приложения.
  • [Строка 9]: здесь мы создаем и запускаем наше приложение при каждом запуске нашего контейнера. [golang-docker - это имя модуля, который мы объявили выше, и этот файл создается командой сборки]

Подготовка файла Docker Compose

Поскольку у нас есть 3 контейнера, управление каждым из них по отдельности затруднительно. Итак, мы будем использовать Docker Compose.

Что такое файл Docker Compose?

Это способ определения и запуска многоконтейнерных приложений Docker. С помощью этого файла мы теперь можем создавать и запускать все наши контейнеры с помощью одной команды.

Создайте docker-compose.yml на корневом пути.

Позвольте мне кратко объяснить код

Здесь мы определили четыре услуги.

  • Строка [3–17]: конфигурация нашего веб-сервиса (наш код golang).
  • Строка [4]: ​​мы предоставили имя службы как web
  • Строка [5–7]: поскольку мы создаем собственный пользовательский образ, нам необходимо указать путь к файлу докеров, который мы создали с помощью ключа build.
  • Строка [8–9]: здесь мы выполняем переадресацию порта. Поскольку сервер работает на порту 8080 контейнера, мы сопоставляем порт 8080 контейнера с портом 8080 нашего локального компьютера. Теперь мы можем получить доступ к приложению с нашего локального компьютера.
  • Строка [10–11]: Volume - это механизм сохранения данных, генерируемых и используемых контейнерами Docker. Ранее мы скопировали все наши файлы в /golang-docker контейнера в app.dockerfile конфигурации. Итак, мы сопоставляем эту папку в контейнере с нашей локальной рабочей папкой проекта. Теперь они синхронизированы.
  • Строка [12–13]: Предоставляет порядок зависимости, что означает, что служба web запускается после службы database.

Конфигурация для других сервисов аналогична. Единственная разница в том, что мы используем image непосредственно внутри build и предоставляем dockerfile.

Теперь, если мы запустим следующую команду

Make sure you have docker and docker-compose installed. Refer this official documentation for installation
//build our custom image(i.e dockerfile provided on build key)
docker-compose build 
//starts all our container(service) configured on yaml file
docker-compose up

Теперь, если мы посетим 8080 в нашей локальной системе. Наше приложение Golang работает успешно.

И если мы посетим 8081 в нашей локальной системе. phpMyAdmin работает с нашей golang-docker уже созданной базой данных.

Наша структура папок выглядит так

Настройка горячей перезагрузки

В настоящее время, даже если мы изменим наш код golang, это не отразится на сервере. Чтобы отразить последний код, нам нужно остановить докер и запустить его снова. Я считаю, что это слишком болезненно и требует много времени.

Итак, теперь мы немного изменим наш app.dockerfile. Для настройки горячей перезагрузки мы будем использовать пакет Compile Daemon.

Мы добавили строки 10 и 12 на app.dockerfile

  • [Строка 10]: Мы просто устанавливаем пакет CompileDaemon.
  • [Строка 12]: Compile Daemon наблюдает за всеми нашими файлами .go и вызывает go build, если файл был изменен по умолчанию. Команда сборки сгенерирует golang-fx файл [это имя модуля, который мы объявили ранее]. Мы также предоставили команду, которая будет вызываться после выполнения команды сборки. [Эта команда запускает наше последнее приложение сборки golang]

Теперь запустите следующий код, чтобы применить наши новые изменения к файлу докеров.

docker-compose build
docker-compose up

Теперь наш измененный код отражается немедленно, без перезапуска докера.

Настройка набора символов (сопоставления) в MySQL

Сортировка по умолчанию в MySQL установлена ​​на latin1_swedish_ci. Может возникнуть ситуация, когда нам нужно сохранить в нашей базе данных не английский язык. ? отображается для любого неанглийского языка. Итак, чтобы правильно хранить неанглийский язык, мы можем установить сортировку на utf8mb4. Настроить все это через докер упрощает нашу работу. Итак, сделаем это.

Создайте файл с именем custom.cnf внутри нашей папки docker.

Теперь давайте создадим файл докеров с именем db.dockerfile внутри нашей папки докеров. Здесь мы используем mysql:5.7.22 базовое изображение [которое мы ранее использовали непосредственно как изображение].

Нам нужно изменить database службу в нашем файле docker-compose, чтобы заменить image ключ на build. Затем мы предоставляем наш настраиваемый файл докеров, который мы только что создали, для ключа сборки.

Наша структура папок выглядит так

ЗАКЛЮЧЕНИЕ

Если вы запутались в какой-либо части, вы можете проверить мой проект на Github.

Https://github.com/dipesh429/Golang-Fx

Это все для этой статьи. Это конец нашего короткого пути к докеризации наших приложений Golang. Надеюсь, это поможет вам в вашем проекте. Любые предложения будут очень ценными. Счастливого кодирования ☺.