Вы написали программу (микросервис) на 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