はじめに
以前docker-composeで作成したgoサーバを簡易的にデプロイする必要があるタイミングがあったのですが、いい感じにハマりまくって地獄を見たのでとりあえずでawsにデプロイする方法を簡単にまとめておきたいと思います
ローカルでdocker-composeで動くgoサーバを作る
まずはソースツリーから、、、
test-docker
│
├── docker
│ ├── app
│ │ └── Dockerfile
│ └── db
│ └── conf.d
│ └── mysql.conf
├── docker-compose.yml
├── go.mod
├── go.sum
├── main.go
└── models
└── init.go
Docker周り
FROM golang:latest
RUN mkdir test-docker
WORKDIR /test-docker
RUN apt-get update \
&& apt-get install -y mariadb-client
COPY . .
RUN CGO_ENABLED=0 go build -o main main.go
CMD ["./main"]
[mysqld]
character-set-server=utf8mb4
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log
[client]
default-character-set=utf8mb4
version: "3"
services:
app:
build:
context: .
dockerfile: ./docker/app/Dockerfile
container_name: test-docker-app
volumes:
- .:/go/src/test-docker
ports:
- "80:8080"
depends_on:
- mysql
restart: always
mysql:
image: mysql:8.0
restart: always
container_name: test-docker-db
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: test
hostname: mysql
ports:
- "3306:3306"
volumes:
- ./docker/db/conf.d:/etc/mysql/conf.d
- ./log/mysql:/var/log/mysql
goサーバー
package main
import (
"test-docker/models"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.GET("/products", func(c *gin.Context) {
var product models.Product
models.DB.First(&product, 1)
c.JSON(200, product)
})
r.Run()
}
package models
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type Product struct {
gorm.Model
Code string
Price uint
}
var DB *gorm.DB
func init() {
var err error
DB, err = gorm.Open("mysql", "root:password@tcp(test-docker-db:3306)/test?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
// スキーマのマイグレーション
DB.AutoMigrate(&Product{})
// Create
DB.Create(&Product{Code: "L1212", Price: 1000})
// Read
var product Product
DB.First(&product, 1)
}
$ go mod init
go: creating new go.mod: module test-docker
以上で準備完了
$ docker-compose up
ec2インスタンスを立てる
- awsのec2ダッシュボードに行く
- インスタンス作成ボタンを押す
- Linuxを選択
- t2.microを選択
- インスタンスの詳細設定で、「自動割り当てパブリックIP」を「無効」→「有効」に変更し次へ
- ストレージ追加 >> タグの追加 という項目があるがデフォルトのまま次へを押す
- 「ルール追加」ボタンを押しタイプを「http」に変更次へを押す(httpでのリクエストを受け付ける様にしています)
- 確認画面が出るのでそのまま次へ
- 「新しいキーペアを作成」しキーペアをダウンロード >> 「インスタンスの作成」を押す
- 作成されたインスタンスを確認し「IPv4 パブリック IP」という項目のIPアドレスをコピーしておく
- 起動したec2インスタンスにsshする
$ mv ~/Downloads/test-docker.pem ~/.ssh
$ chmod 400 ~/.ssh/test-docker.pem
$ sh -i ~/.ssh/test-docker.pem ec2-user@コピーしたIPアドレス
ec2インスタンスの環境構築
1.sshすると「本当につなげますか?」みたいなことが聞かれるので「yes」をタイピング
$ssh -i ~/.ssh/test-docker.pem ec2-user@13.231.224.154
〜省略〜
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '13.231.224.154' (ECDSA) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 10 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-85 ~]$
2.docker, docker-composeをインストール
# dockerのインストール
$ sudo yum install -y docker
$ sudo service docker start # dockerの起動
$ sudo usermod -a -G docker ec2-user # ec2-userをdockerグループに入れる
# docker-composeのインストール
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
3.立ち上げたec2インスタンスに作成したファイルを送る
# ローカルのディレクトリを立ち上げたインスタンスのhomeディレクトリにコピー
$ scp -r -i ~/.ssh/test-docker.pem ../test-docker ec2-user@コピーしたIPアドレス:~/
# 改めてたちあげたインスタンスにssh
$ ssh -i ~/.ssh/test-docker.pem ec2-user@
確認する
1.dockerを立ち上げ
$ cd test-docker # コピーしたディレクトリに移動
$ docker-compose up -d # バックグラウンドでdocker-composeを起動
$ docker ps # 正常に起動できてるかを確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27042b2e038d test-docker_app "sh ./start.sh" 57 seconds ago Up 55 seconds 0.0.0.0:80->8080/tcp test-docker-app
6c820a45602e mysql:8.0 "docker-entrypoint.s…" 57 seconds ago Up 56 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp test-docker-db
2.ブラウザを起動し「コピーしたIPアドレス/products」で下記の様なレスポンスが返ってきたら成功です
まとめ
本当に雑ですがとりあえずこんな感じで簡単にdocker-composeをデプロイすることができます
sshをマイIPに制限するとか、scpするんじゃなくてgithubからpullできる様にするとか、、、
というかそもそもfagate使うとかまあツッコミどころはいいろいろありますが、とりあえずデプロイしないといけない時はこんな感じで十分なのかなと思います。
参考文献
-
Go + gorm + gin と mysqlの環境をDockerで作ったった
(https://qiita.com/Bmouthf/items/d3cfdbee74caeda77e3f) -
AWS EC2インスタンスにdockerとdocker-composeをインストールして簡単なWEBサービスを立ち上げる方法
(https://qiita.com/y-do/items/e127211b32296d65803a)