Настройка Dockerfile для создания и запуска контейнера Docker с вашей программой на Go

Вы написали программу (микросервис) на Go, и хотите развернуть ее в контейнере Docker?
В этой небольшой заметке я постараюсь максимально компактно и практично описать этот процесс для новичков, учитывая современный уровень развития docker. В интернете нашел много статей с непонятными или устаревшими инструкциями, и мало практики, поэтому, решил написать свою.

Про Docker в двух словах скажу так — он позволяет запустить контейнер с виртуальной операционной системой и вашим приложением, размещенным в ней. А так же, когда надоест, удалить напрочь этот контейнер, не заботясь о том, что Ваше приложение где-то тайком намусорило в системе.
Вот, собственно, и все преимущества от использования контейнеров docker для новичков :)

    В данной заметке я рассматриваю способ компиляции Вашей программы внутри образа, на этапе его сборки. Это самый очевидный способ для начинающих.

Еще пару слов о том, с чем docker работает. Он хранит у себя образы (image) контейнеров, на основе которых Вы можете наклепать сколько угодно экземпляров самих этих контейнеров и настроить им маршрутизацию по сети (мэппинг входящих портов и т.п). Образы собираются на основе других образов (можно сказать, есть наследование образов), которые есть в публичном доступе в репозитории docker. Для программы на Go лучшим готовым выбором будут образы golang:latest (на базе debian) и golang:alpine (на базе alpine linux). Другие названия образов можно посмотреть тут: hub.docker.com/_/golang

Чтобы собрать образ (image), нужно в папке исходников своей программы сделать текстовый файл Dockerfile, без расширения, с таким содержимым:

#имя базового образа
FROM golang:latest

#создаем папку, где будет наша программа
RUN mkdir -p /go/src/app

#идем в папку
WORKDIR /go/src/app

#копируем все файлы из текущего пути к файлу Docker на вашей системе в нашу новую папку образа
COPY . /go/src/app

#скачиваем зависимые пакеты через скрипт, любезно разработанный командой docker
RUN go-wrapper download

#инсталлируем все пакеты и вашу программу
RUN go-wrapper install

#запускаем вашу программу через тот же скрипт, чтобы не зависеть от ее скомпилированного имени
#-web - это параметр, передаваемый вашей программе при запуске, таких параметров может быть сколько угодно
#go-wrapper запускает set -x для того, чтобы отправить в stderr имя бинарника Вашей программы в момент ее запуска
CMD ["go-wrapper", "run", "-web"]

#пробрасываем порт вашей программы наружу образа
EXPOSE 8000

В папке с этим файлом и вашими исходниками запускаем команду:

docker build -t my-golang-app .

Точка в конце — это текущая директория с файлом Docker, не забываем ее указывать.
my-golang-app — это будет название образа, в котором скомпилируется ваша программа.
После выполнения этой команды можно посмотреть наличие успешно собранного образа командой

docker ps -a

Создать и запустить контейнер на базе собранного образа можно так:

docker run -it --rm --name my-running-app my-golang-app

my-running-app — это будет имя создаваемого контейнера на основе образа my-golang-app.

Подробнее по ключам запуска docker и составу файла Dockerfile смотрите тут: docs.docker.com

Комментарии

Популярные сообщения из этого блога

Показатели эффективности персонала в сфере услуг

Д. Кейрси. ТЕМПЕРАМЕНТ И ХАРАКТЕР

P2M: ЦЕННОСТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД К УПРАВЛЕНИЮ ИННОВАЦИОННЫМИ ПРОГРАММАМИ И ПРОЕКТАМИ