Легко развертывайте свои проекты Go с помощью Docker
Легко развертывайте свои проекты Go с помощью Docker

Предисловие

если ты Go Разработчики, вы должны знать, как использовать Go Написание кода — это такое удовольствие, эффективное и лаконичное. Итак, если я скажу вам, разверните Go Могут ли проекты быть такими простыми и приятными? Это Docker Очарование.

В этой статье будет подробно описано, как использовать Docker Легко развернуть Go проект, с помощью Docker,Вы можете попрощаться со сложными конфигурациями среды.,Больше не нужно бороться с различными зависимостями Версия вопрос,Просто нужно несколько заказов,Просто поставь Go Проект упакован в контейнер, который можно запустить где угодно. Просто используйте Go написать кодиз Тот же опыт,Docker Сделайте процесс развертывания эффективным и удобным.

Вы готовы? Возьмите чашку любимого кофе или чая и узнайте, прочитав эту статью.

Экологическая подготовка

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

с последующим Docker конфигурация среды. В этой статье не будет подробно описано, как установить и настроить Docker,если ты еще не готов Docker среда,Пожалуйста, обратитесь к официальной документации:Install Docker,по твоемуиз Вид операционной системы Соответствующий Установить Учебник。

создание проекта простого веб-приложения

с простым Web Применить в качестве примера.

Создать каталог проекта

Создайте новый каталог проекта в своем рабочем пространстве или в любом другом каталоге.

Язык кода:bash
копировать
$ mkdir simple-web-app
$ cd simple-web-app

Инициализировать модуль Go

использовать Go Modules Инициализируйте проект, эта операция создаст go.mod Файлы используются для управления зависимостями.

Язык кода:bash
копировать
$ go mod init simple-web-app
go: creating new go.mod: module simple-web-app

Таким образом мы его инициализировали simple-web-app project, структура каталогов проекта следующая:

Язык кода:shell
копировать
├── simple-web-app/
│   └── go.mod

go.mod Содержимое файла следующее:

Язык кода:go
копировать
module simple-web-app

go 1.23.0

Создать основной файл программы

создавать main.go файлы и писать базовые HTTP Серверный код.

Язык кода:go
копировать
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("GET /posts/{id}", func(writer http.ResponseWriter, request *http.Request) {
		id := request.PathValue("id")
		fmt.Fprintf(writer, "id: %s", id)
	})

	fmt.Println("Starting server at http://localhost:8080")

	if err := http.ListenAndServe(":8080", nil); err != nil {
		panic(err)
	}
}

Запустить проект

В корневом каталоге проекта выполните следующую команду, чтобы запустить сервер:

Язык кода:bash
копировать
go run main.go

Вы увидите вывод консоли:

Язык кода:bash
копировать
Starting server at http://localhost:8080

Затем вы сможете получить к нему доступ в своем браузере http://localhost:8080/posts/1,Ничего неожиданногоиз Тогда вы увидите id: 1 слов.

Написать Docker-файл

Dockerfile это определение Docker Файл сценария для процесса создания образа контейнера. Он содержит набор инструкций, которые сообщают Docker нравитьсячтосоздавать Зеркало.

Далее нам нужно simple-web-app Создайте каталог проекта Dockerfile файлы, которые помогут нам добиться автоматизированной сборки и эффективного развертывания.

Язык кода:dockerfile
копировать
# использоватьчиновникиз Go языкзеркалоделатьдля Базазеркало
# здесьиспользовать Go 1.23.0 Версия из Alpine Linux зеркало
FROM golang:1.23.0-alpine AS builder

# Установить рабочий каталог для /app
# Все последующие операции будут выполняться в существующем каталоге.
WORKDIR /app

# Скопируйте все документы из текущего каталога проекта в контейнер. /app в каталоге
COPY . .

# настраивать Go модульактерское мастерстводля https://goproxy.cn (существовать Китай ускоряет загрузку модуля) и загружает зависимости проекта
RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod download

# компилировать Go проект, создать исполняемый документ simple-web-app
RUN go build -o simple-web-app

# используйте меньшее избазовое зеркало (Alpine) для запуска приложения.
# Alpine даа минималистский из Linux Дистрибутив, подходящий для стадии развертывания
FROM alpine:latest

# Установить tzdata пакет, обеспечивающий поддержку часового пояса из конфигурации
RUN apk add --no-cache tzdata

# Установить рабочий каталог для /app
WORKDIR /app

# Копировать компилировать этап иззеркало в проектироватьзеркало
COPY --from=builder /app/simple-web-app /app/simple-web-app

# незащищенныйконтейнериз 8080 Порт для внешнего доступа
EXPOSE 8080

# настраиватьконтейнерзапускатьчасбегатьиз Заказ
# здесьдабегатькомпилироватьхорошийиз Исполняемый файлдокумент simple-web-app
CMD ["/app/simple-web-app"]

проиллюстрировать:

  • Многоэтапная сборка:Давайте сначалаиспользовать golang:1.23.0-alpine Зеркало для компиляции Go проект,Затемиспользовать alpine:latest Приходите развертывать. Это уменьшает конечный размер.
  • Открытые порты: проходить EXPOSE Укажите порт прослушивания приложения (здесь да 8080)。

Создайте образ Docker

существовать Dockerfile Местосуществоватьиз Оглавлениебегатьниже Заказ Приходить Строить Docker контейнер:

Язык кода:bash
копировать
docker build -t simple-web-app .

объяснять:

  • docker build:этотда Docker Команды, используемые для создания изображений.
  • -t simple-web-appt да --tag аббревиатура для строительства Docker Именование изображения.
  • .:назначенный Строитьконтекстизпуть,. Указывает текущий Оглавление,Docker Движок будет читать из текущего каталога Dockerfile и все связанные файлы проекта, упакованные в образ.

Запустить Docker-контейнер

использоватьниже Заказбегатьтолько Строитьиззеркало:

Язык кода:bash
копировать
docker run -p 8080:8080 simple-web-app

в:

  • docker run:на основе указанногоиз Docker Создайте и запустите один экземпляр контейнера.
  • -p 8080:8080:локальный хостиз 8080 Сопоставление портов с контейнером 8080 порт, чтобы вы могли пройти localhost:8080 Доступ к приложению внутри контейнера. simple-web-app:на основе simple-web-app зеркало Приходитьсоздаватьибегатьконтейнер.

так,Go проектволясуществоватьместныйиз 8080 запустить в порт. Вы можете получить к нему доступ через браузер http://localhost:8080/posts/1,Вы должны увидеть id: 1 слов.

docker compose

существовать Переднийиз simple-web-app В проекте мы реализовали лишь простой Web сервис, он не использует какое-либо стороннее промежуточное программное обеспечение. Поэтому только один Docker Контейнер может завершить развертывание всего проекта, и этот процесс относительно прост.

Однако существование на самом деле находится в изпроекте, хотя да похоже на изпроект. Web Приложениям часто также приходится полагаться на другое стороннее промежуточное программное обеспечение, например базы данных (например, MySQLPostgreSQLMongoDB)、Кэш (например, Redis)、Или очередь сообщений (например, Kafka)ждать。этотнекоторые зависимости Служить Необходимость и Web Приложения работают вместе, если нам нужно вручную запустить каждую службу. Docker контейнеров и управление последовательностью запуска и конфигурацией сети между ними, весь процесс может быть очень утомительным и подверженным ошибкам.

для Чтобы упростить эти задачи управления и настройки,сделать больше Служитьприложениеизразвертывать Более простой и последовательный,мы можемиспользовать Docker Compose инструмент。Docker Compose да Docker Инструмент, который позволяет нам написать простой YAML файл (обычно называемый docker-compose.yml),Приходить Слишком много описаний Служитьприложение Местонуждатьсяизконтейнер、Конфигурация сети、рулонждатьресурс。С помощьюэтотконфигурациядокумент,Нам нужен только один Заказ Вот и всезапускать Местосоответствующийиз Служить,Делаем весь процесс более эффективным и простым в управлении.

docker compose Пожалуйста, обратитесь к руководству по установке инструмента. Overview of installing Docker Compose

Далее преобразуем предыдущее simple-web-app проект, введение MongoDB данные Библиотека,ииспользовать Docker Compose Инструменты для единообразного управления запуском и настройкой приложений и баз данных.

Импортируйте библиотеку Монго

проходитьниже Заказсуществовать simple-web-app представлено в проекте mongo Библиотека:

Язык кода:bash
копировать
go get github.com/chenmingyong0423/go-mongox

здесьпредставлятьизда go-mongox Библиотека, она основана на официальном драйвере Go Mongo Библиотека дженериков, расширенная MongoDB официальные рамки.

Изменить основной файл программы

Язык кода:go
копировать
package main

import (
	"context"
	"fmt"
	"net/http"

	"github.com/chenmingyong0423/go-mongox"
	"github.com/chenmingyong0423/go-mongox/builder/query"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
)

type Post struct {
	mongox.Model `bson:",inline"`
	Title        string `bson:"title"`
	Author       string `bson:"author"`
	Content      string `bson:"content"`
}

// Пример кода, не лучший способ создания
func newCollection() *mongo.Collection {
	client, err := mongo.Connect(context.Background(), options.Client().ApplyURI("mongodb://mongo:27017").SetAuth(options.Credential{
		Username:   "test",
		Password:   "test",
		AuthSource: "db-test",
	}))
	if err != nil {
		panic(err)
	}
	err = client.Ping(context.Background(), readpref.Primary())
	if err != nil {
		panic(err)
	}
	collection := client.Database("db-test").Collection("test_post")
	return collection
}

func main() {
	// создать один *mongo.Collection объект
	mongoColl := newCollection()
	// использовать Post Структураделатьдля Общие параметрысоздать один collection
	postColl := mongox.NewCollection[Post](mongoColl)

	http.HandleFunc("GET /posts/{id}", func(writer http.ResponseWriter, request *http.Request) {
		id := request.PathValue("id")
		post, err := postColl.Finder().Filter(query.Id(id)).FindOne(context.Background())
		if err != nil {
			fmt.Fprintf(writer, "error: %s", err.Error())
		} else {
			fmt.Fprintf(writer, "post: %v", post)
		}
	})

	fmt.Println("Starting server at http://localhost:8080")

	if err := http.ListenAndServe(":8080", nil); err != nil {
		panic(err)
	}
}

Основные изменения в коде:

  • Представлена ​​MongoDB: проходить go-mongox Кухе MongoDB драйвер, код добавляет новый MongoDB функции подключения и запроса.
  • Изменения в обработке интерфейса: Раньше да просто возвращался URL в id,сейчассуществоватьпроходить MongoDB Запрос id Соответствующий Post данные и возвращает результаты Запроса.

Написание скриптов MongoDB

написать MongoDB Скрипт,используется длясуществоватьбегать MongoDB контейнер автоматически создает учетную запись пользователя, чтобы simple-web-app способен подключиться к MongoDB

существовать simple-web-app Создайте каталог проекта script каталог и создайте в нем новый mongo-init.sh файл, добавьте в файл следующее содержимое:

Язык кода:bash
копировать
mongosh -- "$MONGO_INITDB_DATABASE" <<EOF
db = db.getSiblingDB('admin')
db.auth('$MONGO_INITDB_ROOT_USERNAME', '$MONGO_INITDB_ROOT_PASSWORD');
db = db.getSiblingDB('$MONGO_INITDB_DATABASE')
db.createUser({
    user: '$MONGO_USERNAME',
    pwd: '$MONGO_PASSWORD',
    roles:[
        {
            role: 'readWrite',
            db: '$MONGO_INITDB_DATABASE'
        }
    ]
});
EOF

Напишите файл docker-compose.yaml.

Язык кода:yaml
копировать
version: '3.8'

services:
  # определение simple-web-app Служить
  web:
    # использовать Dockerfile Строитьзеркало
    build: .
    # После закрытия контейнера порт из открывается, а порт хоста из8080 сопоставляется с портом контейнериз8080.
    ports:
      - "8080:8080"
    # зависит от db Служить,убеждаться MongoDB Служитьсуществовать web Служить Дозапускать
    depends_on:
      - mongo

  # определение MongoDB Служить
  mongo:
    # использоватьчиновникиз MongoDB зеркало
    image: mongo:latest
    # настраивать MongoDB создание из root имени пользователя, пароля и данных по умолчанию
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: db-test
      MONGO_USERNAME: test  # Имя пользователя приложения
      MONGO_PASSWORD: test  # Пользователь и пароль приложения
    # незащищенный MongoDB порт по умолчанию 27017, удобный для внешнего доступа
    ports:
      - "27017:27017"
    # использовать --auth Заказзапускать MongoDB чтобы включить аутентификацию
    command:
      - --auth
    # использовать том для сохранения данных. Данные библиотеки, чтобы избежать потери данных при удалении контейнера.
    volumes:
      - db_data:/data/db
      # Воляинициализация MongoDB Пользователь из Скрипт монтируется в контейнер для обеспечения выполнения при существовании.
      - ./script/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh

# определениерулон,используется длядлительныйизменятьхранилище MongoDB изданных, избежать потери данных при перезапуске
volumes:
  db_data:

Запустите команду docker-compose

использовать docker-compose Команда для сборки и запуска службы:

Язык кода:bash
копировать
docker-compose up -d

Этот заказ будет выполнять в фоновом режиме следующие действия:

  • Строить simple-web-app из Docker Зеркало.
  • запускать MongoDB Служить,ипроходить mongo-init.sh Инициализируйте базу данных, пользователей и разрешения.
  • запускать simple-web-app контейнер.

После завершения сборки и запуска соответствующих контейнеров доступ через браузер http://localhost:8080/posts/1,Вы должны увидеть error: mongo: no documents in result из-за того, что это нормально, потому что нет для _id для 1 данные, мы закончили simple-web-app Проект развернут.


когда тебе больше не понадобится Служитьбегатьчас,Вы можете остановить и удалить весь связанный контейнер, выполнив следующие действия:

Язык кода:bash
копировать
docker-compose down

краткое содержание

В этой статье подробно описано, как использовать Docker развертывать Go проект, обложка, создать проект, написать Dockerfile чтобы воспользоваться Docker Compose Весь процесс управления многоконтейнерными сервисами. проходить Docker,мы можем Воля Go Проект и его зависимые службы (такие как MongoDB)контейнеризменять,Таким образом обеспечивается согласованность и переносимость проекта в различных средах.,Значительно упрощает сложный процесс развертывания проекта.

Стоит упомянуть изда,Для монолитных приложений или личных приложений,Docker достаточно, чтобы справиться с развитием иразвертыватьнуждаться。Однако,С расширением проекта,особеннодамикро Служитьв архитектуре,Полагайся в одиночку Docker Трудно удовлетворить сложные требования к оркестрации сервисов. В это время познакомьтесь KubernetesK8s)ждать Договариватьсяинструмент Может управлять более эффективно Служить、Расширенный и автоматическийизменять Эксплуатация и обслуживание,Особенно подходит для обеспечения высокой доступности и динамического расширения распределенных систем.


Привет,Я да Чен Минён,Разработчик, который любит технологии и готов поделиться,Также энтузиаст открытого исходного кода.

Путь к успеху не переполнен. Вы заинтересованы в поиске партнера?

Следуйте за мной, добавляйте меня в друзья, учитесь и совершенствуйтесь вместе!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose