はじめに
Dockerfileとdocker-compose.yamlの基本的な書き方を調べたので、自分なりの理解でまとめる
本記事のサンプルコードをそのままコピペしても一部動かない可能性あるので悪しからず
ゴール
- GolangのAPIサーバ用コンテナ立てる
ディレクトリ構成
ざっくりこんな感じ
hogehoge.api
├── docker
│ ├── Dockerfile
│ └── docker-compose.yml
└── src
└── app
└── main.go
Dockerfile記述
Dockerfile
# ベースイメージを指定
# alpine linuxが軽くてオススメらしいので採用
FROM golang:1.13.15-alpine3.12
# 環境変数の設定
# golangのバージョン1.11以降でGoモジュールの管理にこれが使われるようになったらしいのでonにしておく
ENV GO111MODULE on
# Goのパス通す
ENV GOPATH /go
ENV PATH /go/bin:$PATH
# RUNコマンドは繋げられるならば繋げたほうが良い(軽量化に繋がる)らしいので&&で連ねる
# apk(Alpin Linux Package Management)をアップデートする
# go moduleインストール用にgit入れる
# ホットリロード用にair(https://github.com/cosmtrek/air)を採用
RUN apk update \
&& apk add --no-cache git \
&& go get -u github.com/cosmtrek/air
# コンテナ実行時のデフォルト処理
# docker-composeでも指定するから不要かも(?)
CMD sh
docker-compose.yaml記述
DBに関する記述は雑
→ネットワークの説明やbuildにDockerfile以外も使えることを示すためだけなので
docker-compose.yaml
# Docker Composeファイルフォーマットのバージョンを指定
version: "3"
# コンテナ間のネットワーク
networks:
backend:
# `docker-compose build`や`up`と打った際に作成するコンテナ
services:
# `docker-compose ps`と打った際に表示されるサービス名
# ここからDBのコンテナ作っていく
my-db-for-hogehoge:
# `docker ps`と打った際に表示されるコンテナ名
container_name: my-hogehoge-db
# コンテナのベースイメージ指定
image: mysql:5.7
# ネットワークで`backend`を指定しているコンテナと疎通
networks:
- backend
# ここからAPIのコンテナ作っていく
api-for-hogehoge:
container_name: my-hogehoge-api
# ビルド時に使うDockerfileを指定
# dbのほうではimagesだった箇所にあたる
build:
context: .
dockerfile: ./Dockerfile
# hogehoge.apiのファイル群を/goにマウント
volumes:
- ..:/go
# コンテナ側の80番ポートを開放
expose:
- "80"
# ホストマシンの10080番ポートとコンテナ側の80番ポート繋ぐ
ports:
- "10080:80"
# 環境変数置くファイル(開発環境でのみ使うパターンが多い?)
env_file:
- .env
# 環境変数設定
environment:
HOGE: "hoge"
# ワークスペース、コンテナ入った時の初期ディレクトリ
working_dir: /go/src
# ネットワークで`backend`を指定することで、先ほどのDBと疎通
networks:
- backend
# `docker-compose up`と打った際に実行されるコマンド
command: >
air -c .air.toml
# コンテナ永続化するか否か(ここではする)
tty: true
APIコンテナ起動してみる
ここは本筋ではないので軽く
下記コマンドでエラー吐かれたら随時対処
$ docker-compose build
$ docker-compose up -d
$ docker-compose logs -f api-for-hogehoge
ハマった点
- GolangというかホットリロードAirの問題かもしれないが、
docker-compose build
してもAirがインストールされなかった- コンテナに入って手動インストールして解消
- docker-compose.yamlの書き方が統一されていない
- オプションの後は改行入れた方が良い?
- オプションの中身が複数ある場合はハイフン
-
でリスト表記したほうが良い?特にハイフン不要? - 調べて修正必須
さいごに
まだ「完全に理解した」だけなので、曖昧な理解や誤解を生む表現が混ざっている可能性もある
発見次第、随時修正していく予定