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
Будем делать три контейнера
- Веб-сервер Golang
- База данных MySQL
- 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 havedocker
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. Надеюсь, это поможет вам в вашем проекте. Любые предложения будут очень ценными. Счастливого кодирования ☺.