Руководство Golang по запуску веб-сервера с помощью Docker
Docker — один из самых популярных программных инструментов и лучший друг инженера. Он упрощает развёртывание приложений и запуск его зависимостей. Docker — это программный инструмент контейнера, который позволяет разработчикам легко создавать, развёртывать и запускать приложения в согласованной и изолированной среде. Одним из преимуществ Docker является масштабируемость, которая позволяет легко масштабировать контейнеры по горизонтали (расширение масштаба), что означает возможность добавления дополнительных экземпляров одного и того же контейнера.
Ещё одно напоминание о том, над чем мы будем работать в рамках нашего проекта, — это NGINX . NGINX — это просто веб-сервер, который также может использоваться для других целей, таких как обратный прокси-сервер, потоковая передача мультимедиа и балансировка нагрузки, и это лишь некоторые из них. Кроме того, NGINX можно использовать в качестве прокси-сервера IMAP/POP3. Интересным фактом о NGINX является то, что он имеет открытый исходный код и наряду с Apache является популярным HTTP-клиентом в Интернете.
Легенда: нашей команде нужно, чтобы мы разместили веб-сайт с использованием Nginx, и мы хотим использовать Docker для простого управления развёртыванием и масштабированием нашего приложения. Мы также хотим использовать Golang для создания приложения, которое будет размещено на сервере Nginx. Наша цель — создать контейнер Docker, запускающий сервер Nginx, который будет обслуживать наше веб-приложение Golang по всему миру.
@DevOPSitsec – наш канал для DevOPs инжинеров.
Что нам понадобится:
Знание Golang
Учетная запись Docker Hub
IDE (я использовал VSCode)
Базовые знания Linux
Решительность, любопытство и настойчивость, как ВСЕГДА
Шаг 1
В VSCode мы создадим нашу папку, назовем её «docker» и запустим наш файл «main.go». Если вы следили за моим путешествием по Go, то знаете, что мы начинаем с команды «package main», которая отвечает за создание исполняемой программы. Мы также добавим импорт, необходимый для нашего скрипта.
package main
import (
"os"
"text/template"
)
Затем мы приступаем к написанию кода, который создаст наш файл конфигурации NGINX, который будет статической веб-страницей. Я хотел бы разбить каждый раздел кода, чтобы указать, какой раздел за что отвечает.
Мы пишем шаблон для файла конфигурации NGINX и указываем блок сервера с портом прослушивания, именем сервера и каталогом для обслуживания веб-контента. В целом, он генерирует файл конфигурации, используемый для запуска сервера NGINX.
func main() {
nginxTemplate := `
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
Следующая часть кода будет включать создание файла NGINX и его запись на диск. Он использует шаблон для создания файла и анализирует содержимое этого файла, и если есть ошибка, это вызовет panic. Затем код открывает файл для записи, и если в файле есть ошибка, это тоже вызовет panic. Часть сценария «defer» откладывает закрытие файла, гарантируя, что он будет правильно закрыт, когда функция вернётся.
tmpl, err := template.New("nginx.conf").Parse(nginxTemplate)
if err != nil {
panic(err)
}
f, err := os.Create("nginx.conf")
if err != nil {
panic(err)
}
defer f.Close()
Наша последняя часть кода генерирует файл конфигурации NGINX путём выполнения и записи вывода в файл. Он проверит наличие ошибок и завершит программу, если обнаружит их (через panic в нашем коде). Если наше выполнение прошло успешно, он выведет «Успешно сгенерированный nginx.conf» для вывода, когда скрипт запускается с помощью команды «go run main.go».
err = tmpl.Execute(f, nil)
if err != nil {
panic(err)
}
println("Generated nginx.conf successfully")
}
После создания файл «nginx.conf » будет выглядеть так:
Шаг 2 :
Теперь мы будем создавать наш образ с помощью Docker. Вам нужно будет назвать файл «Dockerfile» (вам не нужно добавлять расширение к имени вашего файла, например, «.txt » или «.dockerfile ». Это то, о чём я не знал и узнал лишь во время устранения неполадок).
Убедитесь, что у вас открыт Docker Desktop, потому что при запуске команды «docker build -t my-nginx-image» без неё вы получите эту ошибку:
Как только мы откроем Docker Desktop, он будет выглядеть так:
Давайте снова запустим нашу команду «docker build -t my-nginx-image ». У вас должно отобразиться следующее:
Теперь, когда наша сборка завершена, давайте перейдем к Docker Desktop, чтобы посмотреть, сгенерировал ли он наш образ:
БУМ! Наш образ nginx вывел ошибку, с которой столкнулся при попытке заставить его работать, первоначально связанную с ошибкой «no events section in configuration» всякий раз, когда я проверял журналы контейнера в Docker Desktop. Когда вы загружаете журналы в Docker Desktop, это будет выглядеть так:
Исправление этого момента состояло в том, чтобы добавить раздел событий в файл конфигурации NGINX (изображённый на шаге 1), связанный с сетевыми подключениями, которые NGINX использует максимальное количество подключений, установленных одновременно. Сделав настройки, нам нужно повторно запустить нашу команду «docker build -t my-nginx-image», чтобы создать образ.
Шаг 3 :
Затем нам нужно запустить контейнер Docker и сопоставить его с портом, и мы делаем это, выполнив команду «docker run -p 8080:80 my-nginx-image ». Вы получите этот вывод после запуска команды:
docker run -p 8080:80 my-nginx-image
Давайте вернёмся, чтобы снова проверить Docker Desktop и наши контейнеры:
Проверяем, доступен ли наш веб-сервер, просто перейдя по адресу «http://localhost:8080» через веб-браузер:
Оно работает! Что мы можем сделать с этим изображением, так это отправить его в наш Docker Hub, который сохранит образ в нашем репозитории.
Заключительные мысли :
Я хотел получить возможность попрактиковаться в Docker и посмотреть, как он работает в Golang, поскольку Docker — это широко используемый программный инструмент в сфере DevOps. Я также хотел узнать, с какими проблемами я столкнусь при выполнении этого проекта и как устранить эти проблемы, чтобы извлечь из них уроки. Это был очень интересный познавательный проект. Обратная связь всегда приветствуется, потому что она помогает мне расти как инженеру, ориентирующемуся в пространстве Cloud/DevOps. Увидимся в следующей статье!