NITS TIPS

~微塵集合知巧~

Golang + postgreSQL + redis環境をdocker-composeで構築する

最終更新日: 2024-07-20記事投稿日: 2024-07-20

nobumitsu-1995のgithubトップ

Frontend developer

nobumitsu-1995


概要

当ブログのリアクションスタンプ機能実装のためのバックエンド基盤を構築するのにGolang + postgreSQL + redisの開発環境をdocker-composeを使用して実装しました。各パラメータについて調べながら実装を行なったので、その備忘録として記事に残すことにしました。

ちなみにそれぞれ以下の用途で使用する想定です。

  • Golang: リアクションスタンプデータのCRUD処理を行うAPIを実装する。
  • postgreSQL: リアクションスタンプデータを保存する。
  • redis: ゲストログイン中(スタンプを押下することでゲストログイン状態になる想定、便宜上ゲストログインと呼んでおり会員登録機能などは存在しない)のアカウントデータを保存する。

Goサーバー用のDockerfileの作成

まず、リアクションスタンプデータのCRUD処理をするGoサーバー用のDockerfileを作成します。(内容は後述の通り)

  1. WORKDIR /go/src/appでコンテナ内の作業ディレクトリを/go/src/appに設定
  2. COPY . .でローカルマシンのrootディレクトリに置いているファイルをコンテナ内の作業ディレクトリにコピー
  3. COPY entrypoint.sh /entrypoint.shでentrypoint.shファイルもコピーして、RUN chmod +x /entrypoint.shでコマンドの実行権限を付与してあげる
  4. 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 - ボリュームをバインドマウントします。

参考文献


関連記事

  • 最終更新日: 2024-08-22記事投稿日: 2024-08-22

    データベース接続の流れと仕組みの基本

    自分は本業がフロントエンドエンジニアのためデータベース周りの知識に疎い...。色々調べて得られたデータベース接続の流れや仕組みについての知見を忘れないように記事として残しておく。