Легко развертывайте свои проекты 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
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.