Go Docker
Приложение Dockerize Go легко
3 примера с 3 разными результатами. . .
Есть несколько способов развернуть код Golang, особенно когда вы используете Docker для запуска исполняемого файла вашего проекта Go. Мы можем создать наш образ из нашего проекта, и мы можем просто запустить его на вашем локальном компьютере или даже при развертывании, вытащив ваш образ из реестра.
Требование
- Докер
- Основы программирования на Go
Репозиторий: https://github.com/david-yappeter/go-dockerfile-example
Начиная
Во-первых, вам нужно запустить демон Docker с помощью systemctl start docker
или service docker start
, при необходимости используйте sudo
.
Затем мы создадим наш простой HTTP-код go.
$ mkdir go-dockerfile && cd go-dockerfile $ go mod init myapp $ touch server.go
server.go:
Наш server.go
будет содержать простой маршрутизатор джин и дополнительный godotenv
.
/
path вернет «Hello World», а /env
path вернет «Hello $ {NAME}».
Dockerfile
есть несколько способов написать Dockerfile
, но я сделаю 3 примера с разными базовыми изображениями: официальный голанг, альпийский и царапина.
С официального изображения
В этом Dockerfile
мы разделим его на несколько разделов:
FROM golang:1.16-alpine
, мы будем использоватьgolang:1.16-alpine
в качестве базового образа этой сборки Docker.WORKDIR
, будет нашим рабочим каталогом нашей команды / путем наших следующих команд.COPY go.* ./
, мы скопируем файлgo.mod
&go.sum
из нашего проекта в рабочий каталог.RUN go mod download
, скачайте зависимости проекта из модулей go.COPY . .
, скопируйте все из нашего проекта в рабочий каталог.RUN go build -o /project/go-docker/build/myapp .
, соберите наш проект в рабочем каталоге и выведите его вproject/go-docker/build/myapp
как двоичный файл.EXPOSE 8080
, сообщая докеру, что наш код откроет порт8080
.ENTRYPOINT ["/project/go-docker/build/myapp"]
, когда мы запускаем контейнер этого образа, он запускается из нашего двоичного файла сборки.
Ни одно из этих повторяющихся объяснений не будет объяснено дважды. После этого нам нужно запустить эту команду:
docker build -f Dockerfile -t test-go-docker:latest .
-f
флаг - это имя файла нашего Dockerfile
.
-t
flag - имя изображения позже.
.
в конце команды - это каталог Dockerfile
.
Попробуйте выполнить эту команду docker images
, например:
Альпийская база
Отличие от первого:
FROM golang:1.16-alpine as builder
, мы будем использоватьgolang:1.16-alpine
и пометить его какbuilder
, что будет использоваться позже.FROM alpine:latest
, мы создадим новый базовый образ изalpine
.COPY --from=builder /project/go-docker/build/myapp /project/go-docker/build/myapp
, скопируйте двоичный файл сборки в новый образ alpine и запустите его позже.
Размер изображения этого Dockerfile
намного меньше, чем у предыдущего изображения.
С нуля
И для последнего файла Dockerfile мы изменяем только базовый образ alpine
на scratch
. Scratch - это пустой образ, поэтому после запуска контейнера мы не можем выполнить его, потому что у него даже нет команды оболочки.
Выход docker images
.
Изображение немного меньше, чем alpine
базовое изображение.
попробуйте запустить образ с помощью docker run -d -p 8080:8080 test-go-docker:latest
, он перенаправит порт 8080
из контейнера в наш 8080
порт и получит доступ к http://localhost:8080
.
Выводы
Лично я выберу второй Dockerfile
. Почему? потому что размер невелик, и в нем все еще есть несколько команд и команда оболочки, поэтому мы можем docker exec
войти в контейнер и получить к нему доступ. Если мы будем использовать scratch
базовый образ, нам будет сложно отлаживать наш работающий контейнер, потому что мы не можем выполнить его.
На этом вся статья о Docker с программированием на Go, желаю вам хорошего дня :).