🐐

【Docker環境構築】Go / PostgreSQL / pgAdmin / Redisで開発 フロントエンドに関しても少し…

に公開

概要

Go言語とデータベースを使用したWebアプリケーションのバックエンド開発の為のDocker環境を備忘録のために残しておきます。

開発環境

  • Go 1.24.1
  • PostgreSQL 15
  • Redis 7.4.2
  • pgAdmin4
  • Macbook air

ディレクトリ構成

.
├── backend
│   ├── main.go
│   ├── go.mod
│   ├── go.sum
│   ├── .air.toml
│   └── Dockerfile
└── docker-compose.yml

後々フロントエンドのアプリケーションを/frontend に作成すると想定して作成しています。

次から各ファイルの詳細を記載します。

必要なファイルを作成

docker-compose.yml

services:
  backend:
    build:
      context: ./backend/
      dockerfile: Dockerfile
    ports:
      - 18080:8080
    volumes:
      - ./backend:/app 
    depends_on:
      - postgres
  postgres:
    image: "postgres:15-alpine"
    ports:
      - "5434:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - db:/var/lib/postgresql/data
  pgadmin4:
    image: dpage/pgadmin4:8.4
    ports:
      - 5050:80
    volumes:
      - pgadmin-data:/var/lib/pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: test@test.com
      PGADMIN_DEFAULT_PASSWORD: password
      PGADMIN_CONFIG_SERVER_MODE: "False"
      PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: "False"
    depends_on:
      - postgres
  redis:
    image: "redis:latest"
    ports:
      - "36379:6379"
    volumes:
      - redis-data:/data

volumes:
  db:
  pgadmin-data:
  redis-data:

/backnend/Dockerfile

FROM golang:latest

WORKDIR /app
COPY . .

EXPOSE 8080
RUN go install github.com/air-verse/air@latest
CMD ["air", "-c", ".air.toml"]

Goのバージョンは最新版を、開発時にホットリロード機能を使いたかったのでAirをインストールしています。

/backnend/main.go

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello")
}

"Hello"と標準出力するコードを記載しています。

/backnend/.air.toml

ホットロード機能に関する設定を記載します。

root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"

[build]
  args_bin = []
  bin = "./tmp/main"
  cmd = "go build -o ./tmp/main ."
  delay = 1000
  exclude_dir = ["assets", "tmp", "vendor", "testdata"]
  exclude_file = []
  exclude_regex = ["_test.go"]
  exclude_unchanged = false
  follow_symlink = false
  full_bin = ""
  include_dir = []
  include_ext = ["go", "tpl", "tmpl", "html"]
  include_file = []
  kill_delay = "0s"
  log = "build-errors.log"
  poll = false
  poll_interval = 0
  post_cmd = []
  pre_cmd = []
  rerun = false
  rerun_delay = 500
  send_interrupt = false
  stop_on_error = false

[color]
  app = ""
  build = "yellow"
  main = "magenta"
  runner = "green"
  watcher = "cyan"

[log]
  main_only = false
  silent = false
  time = false

[misc]
  clean_on_exit = false

[proxy]
  app_port = 0
  enabled = false
  proxy_port = 0

[screen]
  clear_on_rebuild = false
  keep_scroll = true

コンテナを起動

Dockerコンテナを起動します。

docker compose up -d

Go初期設定

backendコンテナに入ります。

docker exec -it [backendコンテナ名] bash

※ [backendコンテナ名] がわからない場合は、docker psコマンドで起動中のコンテナを確認します。

Goプロジェクトの初期化

go mod init コマンドでプロジェクトの初期化を行います。

go mod init [プロジェクト名]
go mod tidy

main.goの実行

go run main.go

"Hello"と標準出力されていればOKです。

pgAdminへのログイン

http://localhost:5050/ へブラウザからアクセスします。
ログイン情報は以下です。(docker-compose.ymlにて設定済み)

メールアドレス:test@test.com
パスワード:password

Redisの動作確認

docker psコマンドでRedisコンテナ名を確認し、中に入ります。

docker exec -it [redisコンテナ名] bsh

コンテナに入ったら、redis-cliコマンドを実行できればOKです。

動作確認が完了したら

開発中はdocker logs [backendコンテナ名] --logsでAirによるホットリロードを確認しながら開発すると、他のコンテナのログに埋もれることなく開発しやすいです。
コレによって毎回go run main.goを実行せずに動作確認ができます。

フロントエンドの開発環境に関して

フロントエンド開発(React.jsやNext.jsなど)時はDocker環境に含めると、私のPCでは重くなるのでローカルマシン側で起動しています。
基本的にはNode.jsのバージョン管理に気をつければ良いので、nvmを使用して管理してます。

最後に

同じような開発環境を作成される方の参考となれば幸いです。

参考記事

https://zenn.dev/nok_c7/articles/536ac2d35bf9e6

Discussion