Docker — это платформа для контейнеризации приложений. Она позволяет упаковать приложение и все его зависимости в легковесный контейнер, который может быть запущен на любой системе, поддерживающей Docker. Это упрощает процесс развертывания и обеспечивает согласованность работы приложения в разных средах.
Преимущества Docker:
- Изоляция: Каждое приложение работает в своем контейнере, что исключает конфликты зависимостей.
- Переносимость: Контейнеры могут быть запущены на любой системе с Docker.
- Масштабируемость: Легко масштабировать приложения с помощью Docker Compose или Kubernetes.
- Упрощение CI/CD: Интеграция с системами непрерывной интеграции и доставки.
Создание приложения на Golang
Для начала создадим простое веб-приложение на Golang. Пример кода:
go:
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Привет, мир!")
}
func main() {
http.HandleFunc("/", helloHandler)
fmt.Println("Сервер запущен на http://localhost:8080")
http.ListenAndServe(":8080", nil)
}
Этот код создает HTTP-сервер, который отвечает "Привет, мир!" на запросы к корневому пути (/).
Контейнеризация приложения с помощью Docker
Теперь, когда у нас есть простое приложение на Golang, давайте упакуем его в Docker-контейнер.
1. Создание Dockerfile
Dockerfile — это инструкция для сборки Docker-образа. Создайте файл с именем Dockerfile в корневой директории вашего проекта:
Dokerfile:
# Используем официальный образ Golang
FROM golang:1.20-alpine
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем исходный код в контейнер
COPY . .
# Собираем приложение
RUN go build -o main .
# Открываем порт 8080
EXPOSE 8080
# Запускаем приложение
CMD ["./main"]
2. Сборка Docker-образа
Для сборки Docker-образа выполните команду в терминале:
bash:
docker build -t my-golang-app .
Эта команда создаст Docker-образ с именем my-golang-app.
3. Запуск контейнера
Чтобы запустить контейнер, выполните:
bash:
docker run -p 8080:8080 my-golang-app
Теперь ваше приложение будет доступно по адресу http://localhost:8080.
Использование Docker Compose для управления контейнерами
Если ваше приложение состоит из нескольких сервисов (например, база данных и веб-сервер), вы можете использовать Docker Compose для управления ими.
Создание docker-compose.yml
Создайте файл docker-compose.yml:
yaml:
1 Go
version: '3'
services:
web:
image: my-golang-app
build: .
ports:
- "8080:8080"
2 Redis
version: '3'
services:
web:
image: my-golang-app
build: .
ports: - "8080:8080"
redis: image: redis:alpine
ports: - "6379:6379"
3 Rabbit
version: '3.8'
services:
# Сервис RabbitMQ
rabbitmq:
image: rabbitmq:3.11-management
container_name: rabbitmq
ports:
- "5672:5672" # Порт для AMQP (основной протокол RabbitMQ)
- "15672:15672" # Порт для веб-интерфейса управления RabbitMQ
environment:
RABBITMQ_DEFAULT_USER: user
RABBITMQ_DEFAULT_PASS: password
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- app-network
# Сервис для Golang-приложения
app:
build: .
container_name: golang-app
ports:
- "8080:8080" # Порт для веб-сервера приложения
environment:
RABBITMQ_URL: "amqp://user:password@rabbitmq:5672/"
depends_on:
- rabbitmq
networks:
- app-network
# Сетевые настройки
networks:
app-network:
driver: bridge
# Тома для хранения данных RabbitMQ
volumes:
rabbitmq_data:
4 Kafka
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
hostname: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
hostname: kafka
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
depends_on:
- zookeeper
5 Postgres
postgres: image: postgres:12.3-alpine
restart: always
environment: POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
volumes: - postgres:/var/lib/postgresql/data
6 Clickhouse
version: '3'
services:
clickhouse-server:
image: clickhouse/clickhouse-server:24.3.6
container_name: clickhouse-server
ulimits:
nofile:
soft: 262144
hard: 262144
volumes:
- ./data:/var/lib/clickhouse
- ./logs:/var/log/clickhouse-server
network_mode: host
cap_add:
- SYS_NICE
- NET_ADMIN
- IPC_LOCK
- SYS_PTRACE
7 FFmpeg
version: "3.8"
services:
ffmpeg:
container_name: ffmpeg
network_mode: "host"
build:
context: "."
args:
DECKLINK_SUPPORT: "true"
DECKLINK_SDK_URL: "decklinkurlhere"
DECKLINK_DRIVER_URL: "decklinkurlhere"
DECKLINK_DRIVER_VERSION: "12.4.1"
NON_FREE: "true"
restart: always
volumes:
- ./data:/home/node/app/data
devices:
- /dev/blackmagic/io0:/dev/blackmagic/io0
environment:
PORT: 80
WEB_GUI: "true"
ports:
- 80:80
bash
docker-compose up
Заключение
Использование Golang и Docker вместе позволяет создавать высокопроизводительные и легко развертываемые приложения. Golang обеспечивает скорость и простоту разработки, а Docker — изоляцию, переносимость и масштабируемость. Этот стек технологий идеально подходит для современных микросервисных архитектур и DevOps-практик.
Если вы только начинаете изучать Golang и Docker, начните с простых примеров, подобных приведенному выше. По мере роста вашего опыта вы сможете создавать более сложные и мощные приложения, используя все преимущества этих технологий. Удачи в разработке!