В этой статье мы создадим простой REST API приложение «Hello world» на языке Goland, а после упакуем его в Docker контейнер, запустим и проверим наше приложение из контейнера Docker.
Приложение «Hello world» на GO
Установим Goland:
sudo apt update
sudo apt upgrade
sudo apt install golang
Проверим, что все установлено правильно:
go version
Давайте начнём с создания простого REST API приложения «Hello world» на Go. Наша структура проекта будет выглядеть следующим образом:
├── Dockerfile
├── go.mod
└── main.go
Создаем каталог HelloWorld:
mkdir -p helloworld
В каталоге разместим файл main.go:
cd helloworld
nano main.go
Скопируйте и вставьте следующий код:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
Этот код создаёт HTTP-сервер, который прослушивает порт 8080 и возвращает сообщение «Hello, World!».
Теперь давайте создадим и протестируем наш REST API. Откройте терминал и перейдите в каталог, в котором вы сохранили файл main.go
. Выполните следующую команду:
go run main.go
Проверим работу нашего приложения. Откройте веб-браузер и перейдите по адресу http://localhost:8080 или http://IP-сервера:8080, если разворачивали приложение на другом сервере. В браузере должно появиться сообщение «Hello, World!»
Контейнеризация приложения GO в Docker
Теперь, когда наш REST API приложение «Hello, World!» работает, давайте упакуем его в контейнер с помощью Docker. Создайте новый файл с именем Dockerfile в том же каталоге, что и main.go. Скопируйте и вставьте следующий код:
nano Dockerfile
FROM golang:alpine
WORKDIR /app
COPY go.mod ./
RUN go mod download
COPY . .
RUN go build -o main .
EXPOSE 8080
CMD ["./main"]
Разберем построчно:
- FROM golang:alpine: эта строка указывает базовый образ для сборки приложения Go.
- WORKDIR /app: задает рабочий каталог внутри контейнера Docker.
- COPY go.mod go.sum ./: копирует файлы зависимостей.
- RUN go mod download: загружает зависимости.
- COPY . .: Копирует весь исходный код в контейнер.
- RUN go build -o main .: компилирует приложение Go.
- EXPOSE 8080: указывает, какой порт будет прослушивать контейнер во время выполнения.
- CMD [«./main»]: команда, которая будет выполняться при запуске контейнера.
В этом Dockerfile указано, что в качестве базового образа для нашего контейнера мы будем использовать дистрибутив Alpine Linux. Затем мы задаём рабочий каталог /app
и копируем в него файлы go.mod
и go.sum. Мы запускаем go mod download
для загрузки зависимостей, указанных в файле go.mod
.
Затем мы копируем весь каталог в контейнер и запускаем go build
для создания двоичного исполняемого файла с именем main
. Мы открываем порт 8080, на котором работает наш HTTP-сервер. Наконец, мы задаём команду для запуска нашего исполняемого файла.
Создадим в нашей директории файлы зависимостей go.mod и go.sum:
nano go.mod
Содержимое файла go.mod:
module hellow-world
go 1.19
nano go.sum
Также создать файлы зависимостей можно командой:
go mod init hellow-world
Создадим образ Docker на основе Dockerfile:
docker build -t hello-world .
Проверим наличие образа в локальном репозитории:
docker images
Запуск приложения GO в Docker контейнере
Теперь, когда мы создали образ Docker, давайте запустим его и протестируем.
Выполните в терминале следующую команду:
docker run -p 8080:8080 hello-world
Docker-compose файл для приложения на Go
Создайте файл с именем docker-compose.yml
в том же каталоге со следующим содержимым:
version: "3.8"
services:
web:
build: .
ports:
- "8080:8080"
Чтобы запустить приложение, используйте следующую команду:
docker-compose up
В этой статье мы узнали, как создать простой REST API «Привет, мир!» на языке Go, а затем упаковали его в образ Docker. Мы также узнали, как запускать и тестировать наш контейнер Docker. Контейнеризация приложений с помощью Docker позволяет легко развертывать и запускать их на любой платформе, не беспокоясь о зависимостях или настройках.
Ссылки: