{"id":14286,"url":"\/distributions\/14286\/click?bit=1&hash=d1e315456c2550b969eff5276b8894057db7c9f3635d69a38d108a0d3b909097","hash":"d1e315456c2550b969eff5276b8894057db7c9f3635d69a38d108a0d3b909097","title":"\u041f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u043c\u0438 \u0418\u0422-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u044b","buttonText":"","imageUuid":""}

Руководство Golang по запуску веб-сервера с помощью Docker

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

Ещё одно напоминание о том, над чем мы будем работать в рамках нашего проекта, — это NGINX . NGINX — это просто веб-сервер, который также может использоваться для других служб, таких как обратный прокси-сервер, потоковая передача мультимедиа и балансировка нагрузки, и это лишь некоторые из них. Кроме того, NGINX можно использовать в качестве прокси-сервера IMAP/POP3. Интересным фактом о NGINX является то, что он имеет открытый исходный код и наряду с Apache является популярным HTTP-клиентом в Интернете.

Теперь, когда у нас есть некоторая предыстория, что мы делаем? В этой статье предположим, что нашей команде нужно, чтобы наша стартап-компания нуждалась в том, чтобы мы разместили веб-сайт с использованием Nginx, и мы хотим использовать Docker для простого управления развёртыванием и масштабированием нашего приложения. Мы также хотим использовать Golang для создания приложения, которое будет размещено на сервере Nginx. Наша цель — создать контейнер Docker, запускающий сервер Nginx, который будет обслуживать наше веб-приложение Golang по всему миру.

Что нам понадобится:

Знание 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. Увидимся в следующей статье!

0
Комментарии
-3 комментариев
Раскрывать всегда