Docker — один из самых удобных способов упаковать Go-приложение для продакшена: быстро, предсказуемо и без сюрпризов с окружением. Ниже — практическая схема, как задеплоить Go-сервис в контейнер правильно.
Почему Go + Docker — хорошая связка
Go компилируется в один бинарный файл, а значит контейнер получается лёгким и быстрым. Это даёт:
- — быстрый старт приложения
- — минимальный размер образа
- — меньше зависимостей и уязвимостей
- — удобный деплой в Kubernetes, VPS и облака 🚀
Базовый Dockerfile для Go
Лучше использовать multi-stage build, чтобы не тащить в финальный образ весь toolchain:
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app .
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]
Такой подход уменьшает итоговый размер образа и ускоряет доставку.
Сборка и запуск
docker build -t go-app .
docker run -p 8080:8080 go-app
Если приложение слушает порт 8080, оно будет доступно на сервере через этот порт.
Что важно для продакшена
- 🔐 Не храните секреты в образе Пароли, токены и ключи передавайте через переменные окружения или secrets.
- 📦 Используйте .dockerignore Чтобы не копировать лишнее:
.git
.env
node_modules
tmp
- 🩺 Добавьте healthcheck Это поможет оркестратору понять, живо ли приложение.
- 👤 Запускайте не от root Для безопасности создавайте отдельного пользователя внутри контейнера.
Оптимизированный вариант
Для ещё более компактного образа можно использовать scratch или distroless. Это снижает поверхность атаки и размер контейнера. Но важно убедиться, что приложению не нужны системные библиотеки.
Типичные ошибки
- — слишком большой образ из-за отсутствия multi-stage
- — секреты внутри Dockerfile
- — отсутствие фиксированных версий базового образа
- — логика приложения зависит от локальных файлов
- — нет graceful shutdown для контейнера ⚠️
Полезные команды
docker images
docker ps
docker logs
docker exec -it sh
Итог
Docker-деплой Go-приложения — это про простоту и контроль. Лучший минимум: multi-stage сборка, .dockerignore, env-переменные, non-root запуск и маленький финальный образ. Такой контейнер проще поддерживать, безопаснее выкатывать и удобнее масштабировать 💡
Подборка каналов про IT — хороший способ держать руку на пульсе технологий, DevOps и разработки 👀