1. Основы Docker и подготовка окружения для Go
Основы Docker и подготовка окружения для Go
Docker — это инструмент, который упаковывает приложение вместе с зависимостями в контейнер, чтобы его было одинаково просто запускать на ноутбуке разработчика, на CI и на сервере. В курсе мы будем использовать Docker как стандартный способ сборки и деплоя Go-сервисов.
Что вы получите после этой статьи
docker build, docker run, docker ps, docker logs.Базовые понятия Docker простыми словами
Образ (image) — это неизменяемый шаблон, из которого создаются контейнеры. В образе находится файловая система и метаданные: что запускать, какие переменные окружения, какие порты и т.д.
Контейнер (container) — это запущенный (или остановленный) экземпляр образа. Контейнер можно создать, запустить, остановить и удалить.
Dockerfile — текстовый файл с инструкциями, как собрать образ.
Реестр образов (registry) — место, где хранятся готовые образы. Самый популярный — Docker Hub.
!Как Dockerfile превращается в образ, а образ — в контейнеры, и где здесь реестр
Полезные первоисточники:
Установка Docker
Варианты установки
Официальные инструкции:
Проверка установки Docker
После установки проверьте версии:
Проверьте, что демон Docker работает:
И выполните тестовый контейнер:
Если вы увидели сообщение о корректной установке, Docker готов.
Установка Go
Установите Go на хост-машину (это полезно для локальной разработки и проверки, даже если сборку мы будем делать в контейнере):
Проверка:
Создаём минимальный Go-сервис
Создайте папку проекта и файлы.
Файл main.go
Инициализация модуля
В папке проекта выполните:
Первый Dockerfile для Go
Начнём с многостадийной сборки (multi-stage build): в первом этапе компилируем бинарник, во втором — запускаем его в более лёгком окружении. Это стандартная практика для Go.
Создайте Dockerfile:
Что здесь важно:
FROM golang:1.24 AS builder — первый этап, где есть Go toolchain.WORKDIR /app — рабочая директория внутри образа.COPY go.mod ./ и go mod download — скачиваем зависимости отдельно, чтобы Docker лучше кешировал слой.CGO_ENABLED=0 — просим собрать статический бинарник (часто упрощает запуск в минимальных образах).FROM alpine:3.21 — финальный минимальный образ для запуска.EXPOSE 8080 — документация о том, какой порт слушает контейнер.CMD — команда по умолчанию при запуске контейнера.Ссылки на базовые образы:
Сборка образа
Соберите образ из текущей директории (точка в конце — контекст сборки):
Проверьте, что образ появился локально:
Запуск контейнера и проверка сервиса
Запустите контейнер и пробросьте порт 8080 наружу:
Проверка в другом терминале:
Ожидаемый ответ:
Базовые команды для повседневной работы
docker ps — список запущенных контейнеров.docker ps -a — все контейнеры, включая остановленные.docker logs <container> — логи контейнера.docker exec -it <container> sh — зайти внутрь контейнера (если внутри есть sh).docker stop <container> — остановить контейнер.docker rm <container> — удалить контейнер.docker rmi <image> — удалить образ.Частые проблемы и быстрые решения
docker logs <container>-p 8081:8080docker build -t hello-go:1 .Куда мы идём дальше
В этой статье вы подготовили окружение и собрали/запустили первый Go-сервис в Docker. Дальше по курсу мы будем улучшать Dockerfile для быстрых сборок, разберём работу с кэшем и зависимостями, научимся делать production-ready образы, а затем перейдём к запуску нескольких сервисов (обычно через Docker Compose) и к деплою.
Справка на будущее: