Всем привет, в этом посте я хочу поделиться своими способами запуска проекта Go с Docker. Docker – это платформа, предназначенная для помощи разработчикам в создании, совместном использовании и запуске современных приложений. Docker позволит вам быстро создавать, тестировать и развертывать приложения с помощью контейнеров. Для получения дополнительной информации о докере и контейнере посетите https://docs.docker.com/get-started/

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

Проект Init Go
Для начала я создаю новый каталог с именем go-docker и запускаю go mod init go-docker. Затем вы заметите, что есть файл go.mod, который похож на файл composer.json в Laravel.

mkdir go-docker
cd go-docker
go mod init go-docker

Создание простого API
Проект настроен, теперь давайте создадим простой API. Я собираюсь использовать маршрутизатор gin-gonic/gin для http, но вы можете использовать любой маршрутизатор для этого проекта в соответствии с вашими предпочтениями.

go get -u github.com/gin-gonic/gin

Затем создайте файл main.go

package main

import "github.com/gin-gonic/gin"

func main() {
 router := gin.Default()

 router.GET("/ping", func(c *gin.Context) {
  c.JSON(200, gin.H{
   "message": "pong",
  })
 })

 router.Run(":80")
}

Давайте попробуем наш API

go run main.go

Наш API работает

Setup docker
Создайте файл с именем Dockerfile, чтобы создать образ docker нашего проекта.

# Get the latest golang image
FROM golang:latest

# Set the Current Working Directory inside the container
WORKDIR /go/src/app/

# Copy everything from the current directory to the PWD(Present Working Directory) inside the container
COPY . .

# Download all the dependencies
RUN go mod download -x

# Install compile daemon for hot reloading
RUN go install -mod=mod github.com/githubnemo/CompileDaemon

# Expose port 80 to the outside world
EXPOSE 80

# Command to run the executable
ENTRYPOINT CompileDaemon --build="go build main.go" --command="./main"

Затем запустите

docker build -t go-docker-image .

После завершения процесса сборки запустите эту команду

docker run -p 80:80 go-docker-image

Добавьте postgresql и redis в наш проект
Если вы не знакомы с докером, возможно, вы подумаете «почему?» после того, как вы прочитали этот пост до этой строки, так что давайте перейдем к следующему шагу. Мы добавим postgresql и redis в наш проект, а затем сделаем так, чтобы наш проект go-docker, postgresql и redis могли запускать его с помощью одной команды.

Я создам файл docker-compose.yaml. Compose – это инструмент для определения и запуска мультиконтейнерных приложений Docker.

version: '3'
services:
    db:
      image: postgres:14.1-alpine
      container_name: 'go-docker_db'
      restart: always
      environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=postgres
      ports:
        - '5432:5432'
      volumes: 
        - db:/var/lib/postgresql/data
      networks:
        - go-docker-net
    api:
      image: go-docker-image:latest #Our go-docker image here
      container_name: 'go-docker_api'
      ports:
          - '${APP_PORT}:${APP_PORT}'
      volumes:
          - ./:/go/src/app/
          - ./go.mod:/go/src/app/go.mod
      restart: always
      networks:
          - go-docker-net
    redis:
      image: redis:6.2-alpine
      restart: always
      ports:
        - '6379:6379'
      command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
      volumes: 
        - cache:/data
      networks:
        - go-docker-net
networks:
  go-docker-net:
    driver: bridge
volumes:
  cache:
    driver: local
  db:
    driver: local

Теперь запустите docker compose up и вуаля, наш проект API, db postgre и redis теперь работают.

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

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

Репозиторий
https://github.com/awgst/go-docker

Ссылки
-
https://www.docker.com/
https://aws.amazon.com/id/docker/
- https://github.com/gin-gonic/gin
- https://levelup.gitconnected.com/docker-for-go-development-a27141f36ba9