概要
当ブログのリアクションスタンプ機能実装のためのバックエンド基盤を構築するのにGolang + postgreSQL + redisの開発環境をdocker-composeを使用して実装しました。各パラメータについて調べながら実装を行なったので、その備忘録として記事に残すことにしました。
ちなみにそれぞれ以下の用途で使用する想定です。
- Golang: リアクションスタンプデータのCRUD処理を行うAPIを実装する。
- postgreSQL: リアクションスタンプデータを保存する。
- redis: ゲストログイン中(スタンプを押下することでゲストログイン状態になる想定、便宜上ゲストログインと呼んでおり会員登録機能などは存在しない)のアカウントデータを保存する。
Goサーバー用のDockerfileの作成
まず、リアクションスタンプデータのCRUD処理をするGoサーバー用のDockerfileを作成します。(内容は後述の通り)
WORKDIR /go/src/app
でコンテナ内の作業ディレクトリを/go/src/app
に設定COPY . .
でローカルマシンのrootディレクトリに置いているファイルをコンテナ内の作業ディレクトリにコピーCOPY entrypoint.sh /entrypoint.sh
でentrypoint.shファイルもコピーして、RUN chmod +x /entrypoint.sh
でコマンドの実行権限を付与してあげるENTRYPOINT ["/entrypoint.sh"]
でentrypoint.sh
を実行。DBのマイグレーションとGoサーバーの起動を実行(ここら辺の設定はこの記事では割愛)
↑みたいな処理を行っています。
Dockerfile
FROM golang:alpine3.20
WORKDIR /go/src/app
COPY . .
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
go run db/migrate/migrate.go # マイグレーションを実行
exec go run main.go # アプリケーションを実行
docker-composeファイルの作成
次にdocker-composeファイルを作成してGoサーバー、postgreSQLサーバー、redisサーバーを実行できるようにします。(内容は後述の通り)
それぞれの設定を詳しく見ていきます。
version: '3'
services:
postgres:
image: postgres:alpine3.20
ports:
- 5432:5432
volumes:
- dbdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
restart: always
redis:
image: redis:7.0.15-alpine3.20
ports:
- "6379:6379"
volumes:
- redisdata:/data
restart: always
golang:
build: .
ports:
- 8080:80
volumes:
- .:/go/src/app
tty: true
restart: always
depends_on:
- postgres
- redis
volumes:
dbdata:
driver: local
driver_opts:
type: none
device: ./volumes/postgres
o: bind
redisdata:
driver: local
driver_opts:
type: none
device: ./volumes/redis
o: bind
PostgreSQLサーバー
services:
postgres:
image: postgres:alpine3.20
ports:
- 5432:5432
volumes:
- dbdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
restart: always
- image:
postgres:alpine3.20
- PostgreSQLのAlpineベースのイメージを指定しています。Alpineは軽量なLinuxディストリビューションで、イメージサイズが小さいのが特徴です。 - ports:
5432:5432
- ホストの5432ポートをコンテナの5432ポートにマッピングしています。 - volumes:
dbdata:/var/lib/postgresql/data
- ボリュームを使用してデータを永続化します。この場合後述のvolumes
で定義した名前付きボリューム(dbdata
)とコンテナ内の/var/lib/postgresql/data
を紐付けています。 - environment: 環境変数を使用して、データベースのユーザー名、パスワード、データベース名を設定します。これらの値は
.env
ファイルから読み込まれます。ここで必要になる環境変数はおそらく使用するimageによって変わり、自分の場合はimageのソースコードを確認して必要そうな値を設定しています。 - restart:
always
- コンテナが停止した場合に自動的に再起動する設定です。
Redisサーバー
redis:
image: redis:7.0.15-alpine3.20
ports:
- "6379:6379"
volumes:
- redisdata:/data
restart: always
- image:
redis:7.0.15-alpine3.20
- RedisのAlpineベースのイメージを使用しています。 - ports:
6379:6379
- ホストの6379ポートをコンテナの6379ポートにマッピングしています。 - volumes:
redisdata:/data
- ボリュームを使用してデータを永続化します。この場合後述のvolumes
で定義した名前付きボリューム(redisdata
)とコンテナ内の/data
を紐付けています。 - restart:
always
- コンテナが停止した場合に自動的に再起動する設定です。
Goサーバー
golang:
build: .
ports:
- 8080:80
volumes:
- .:/go/src/app
tty: true
restart: always
depends_on:
- postgres
- redis
- build:
.
- 先ほど作成したDockerfileを使用してイメージをビルドします。 - ports:
8080:80
- ホストの8080ポートをコンテナの80ポートにマッピングしています。 - volumes:
.:/go/src/app
- ローカルのカレントディレクトリをコンテナ内の/go/src/app
ディレクトリにマウントします。 - tty:
true
- TTYを有効にすることで、インタラクティブなシェルセッション(例えば今回のようにコンテナ内でexec go run main.go
みたいに直接コマンドを実行しているやつ)を維持し、コンテナが終了せずに起動し続けるようにしています。 - restart:
always
- コンテナが停止した場合に自動的に再起動する設定です。 - depends_on:
postgres
,redis
- GoサーバーはPostgreSQLとRedisのサービスに依存しているため、これらのサービスが起動してから開始されるように設定しています。
名前付きボリュームの設定
ここで、postgreSQLサーバーとredisサーバーで使用する名前付きボリュームを定義しています。
volumes:
dbdata:
driver: local
driver_opts:
type: none
device: ./volumes/postgres
o: bind
redisdata:
driver: local
driver_opts:
type: none
device: ./volumes/redis
o: bind
- driver:
local
- ローカルボリュームドライバーを使用しています。 - driver_opts: ボリュームのオプションを設定します。例えば、ボリュームをAWSのS3などと紐付けたい場合などはここをいじることで設定できるっぽいです。
- type:
none
- 特別なファイルシステムタイプを指定しないことを示します。 - device: ローカルのディレクトリパスを指定します。
- o:
bind
- ボリュームをバインドマウントします。
- type: