если ты Go
Разработчики, вы должны знать, как использовать Go
Написание кода — это такое удовольствие, эффективное и лаконичное. Итак, если я скажу вам, разверните Go
Могут ли проекты быть такими простыми и приятными? Это Docker
Очарование.
В этой статье будет подробно описано, как использовать Docker
Легко развернуть Go
проект, с помощью Docker
,Вы можете попрощаться со сложными конфигурациями среды.,Больше не нужно бороться с различными зависимостями Версия вопрос,Просто нужно несколько заказов,Просто поставь Go
Проект упакован в контейнер, который можно запустить где угодно. Просто используйте Go
написать кодиз Тот же опыт,Docker
Сделайте процесс развертывания эффективным и удобным.
Вы готовы? Возьмите чашку любимого кофе или чая и узнайте, прочитав эту статью.
Если вы планируете следовать этой статье для практических действий, вам необходимо подготовить соответствующую среду разработки. сначала это Go
окружающей среды, эта статья основана на Go 1.23.0
версия закодирована, если ваша Go
Версия ниже этой версии, и ее необходимо сначала обновить.
с последующим Docker
конфигурация среды. В этой статье не будет подробно описано, как установить и настроить Docker
,если ты еще не готов Docker
среда,Пожалуйста, обратитесь к официальной документации:Install Docker,по твоемуиз Вид операционной системы Соответствующий Установить Учебник。
с простым Web
Применить в качестве примера.
Создайте новый каталог проекта в своем рабочем пространстве или в любом другом каталоге.
$ mkdir simple-web-app
$ cd simple-web-app
использовать Go Modules
Инициализируйте проект, эта операция создаст go.mod
Файлы используются для управления зависимостями.
$ go mod init simple-web-app
go: creating new go.mod: module simple-web-app
Таким образом мы его инициализировали simple-web-app
project, структура каталогов проекта следующая:
├── simple-web-app/
│ └── go.mod
go.mod
Содержимое файла следующее:
module simple-web-app
go 1.23.0
создавать main.go
файлы и писать базовые HTTP
Серверный код.
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)
}
}
В корневом каталоге проекта выполните следующую команду, чтобы запустить сервер:
go run main.go
Вы увидите вывод консоли:
Starting server at http://localhost:8080
Затем вы сможете получить к нему доступ в своем браузере http://localhost:8080/posts/1
,Ничего неожиданногоиз Тогда вы увидите id: 1
слов.
Dockerfile
это определение Docker
Файл сценария для процесса создания образа контейнера. Он содержит набор инструкций, которые сообщают Docker
нравитьсячтосоздавать Зеркало.
Далее нам нужно simple-web-app
Создайте каталог проекта 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
)。существовать Dockerfile
Местосуществоватьиз Оглавлениебегатьниже Заказ Приходить Строить Docker
контейнер:
docker build -t simple-web-app .
объяснять:
docker build
:этотда Docker
Команды, используемые для создания изображений.-t simple-web-app
:t
да --tag
аббревиатура для строительства Docker
Именование изображения..
:назначенный Строитьконтекстизпуть,.
Указывает текущий Оглавление,Docker
Движок будет читать из текущего каталога Dockerfile
и все связанные файлы проекта, упакованные в образ.использоватьниже Заказбегатьтолько Строитьиззеркало:
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
слов.
существовать Переднийиз simple-web-app
В проекте мы реализовали лишь простой Web
сервис, он не использует какое-либо стороннее промежуточное программное обеспечение. Поэтому только один Docker
Контейнер может завершить развертывание всего проекта, и этот процесс относительно прост.
Однако существование на самом деле находится в изпроекте, хотя да похоже на изпроект. Web
Приложениям часто также приходится полагаться на другое стороннее промежуточное программное обеспечение, например базы данных (например, MySQL
、PostgreSQL
、MongoDB
)、Кэш (например, 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
Библиотека:
go get github.com/chenmingyong0423/go-mongox
здесьпредставлятьизда go-mongox
Библиотека, она основана на официальном драйвере Go Mongo
Библиотека дженериков, расширенная MongoDB
официальные рамки.
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)
}
}
Основные изменения в коде:
go-mongox
Кухе MongoDB драйвер, код добавляет новый MongoDB
функции подключения и запроса.URL
в id
,сейчассуществоватьпроходить MongoDB
Запрос id
Соответствующий Post
данные и возвращает результаты Запроса.написать MongoDB
Скрипт,используется длясуществоватьбегать MongoDB
контейнер автоматически создает учетную запись пользователя, чтобы simple-web-app
способен подключиться к MongoDB
。
существовать simple-web-app
Создайте каталог проекта script
каталог и создайте в нем новый mongo-init.sh
файл, добавьте в файл следующее содержимое:
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
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 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
Проект развернут.
когда тебе больше не понадобится Служитьбегатьчас,Вы можете остановить и удалить весь связанный контейнер, выполнив следующие действия:
docker-compose down
В этой статье подробно описано, как использовать Docker
развертывать Go
проект, обложка, создать проект, написать Dockerfile
чтобы воспользоваться Docker Compose
Весь процесс управления многоконтейнерными сервисами. проходить Docker
,мы можем Воля Go
Проект и его зависимые службы (такие как MongoDB
)контейнеризменять,Таким образом обеспечивается согласованность и переносимость проекта в различных средах.,Значительно упрощает сложный процесс развертывания проекта.
Стоит упомянуть изда,Для монолитных приложений или личных приложений,Docker
достаточно, чтобы справиться с развитием иразвертыватьнуждаться。Однако,С расширением проекта,особеннодамикро Служитьв архитектуре,Полагайся в одиночку Docker
Трудно удовлетворить сложные требования к оркестрации сервисов. В это время познакомьтесь Kubernetes
(K8s
)ждать Договариватьсяинструмент Может управлять более эффективно Служить、Расширенный и автоматическийизменять Эксплуатация и обслуживание,Особенно подходит для обеспечения высокой доступности и динамического расширения распределенных систем.
Привет,Я да Чен Минён,Разработчик, который любит технологии и готов поделиться,Также энтузиаст открытого исходного кода.
Путь к успеху не переполнен. Вы заинтересованы в поиске партнера?
Следуйте за мной, добавляйте меня в друзья, учитесь и совершенствуйтесь вместе!