【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
を使用して管理してます。
最後に
同じような開発環境を作成される方の参考となれば幸いです。
参考記事
Discussion