在Docker上构建一个可以使用Go和MySQL进行Create, Read, Update和Delete (CRUD)操作的API服务器(1)。通过连接Go和MySQL,创建一个表

首先

本文适合那些想要构建使用Go(Echo)的API服务器的人。
在本文中,我们将详细介绍在Docker上如何连接Go和MySQL。
如果有任何错误或改进意见,请随时提出。

环境

    • Docker:v24.0.6

 

    Docker Compose:v2.4.1

最终的构图

.
├── docker-compose.yml
├── golang
│   ├── Dockerfile
│   └── app
│       ├── go.mod
│       ├── go.sum
│       └── main.go
└── mysql
    ├── Dockerfile
    └── .env

使用Docker Compose来连接Go和MySQL

首先,我们会在项目的根目录下创建一个docker-compose.yml文件。

version: "3.8"
services:
    go:
        container_name: go
        build: ./golang
        tty: true
        ports:
            - "8080:8080"
        env_file:
            - ./mysql/.env
        depends_on:
            - db
        volumes:
            - ./golang/app:/go/src/app
        networks:
            - golang_test_network

    db:
        container_name: db
        build: ./mysql
        tty: true
        platform: linux/x86_64
        ports:
            - 3306:3306
        env_file:
            - ./mysql/.env
        volumes:
            - mysql_test_volume:/var/lib/mysql
        networks:
            - golang_test_network

volumes:
    mysql_test_volume:
        name: mysql_test_volume

networks:
    golang_test_network:
        external: true

我会逐个进行解释。 (Wǒ huì zhú gè .)

version

Docker Composeのバージョンです。特にこだわりがなければ最新のものを記述した方が良いと思います。

services

作成したいサービス(コンテナ)を列挙します。今回は、goとdbの2つのサービスを作成します。

container_name

コンテナの名前です。(無くてもよい)

build

用意したDockerfileよりビルドする場合、Dockerfileへの相対パスを記述します。
ここで定義された情報をもとにDockerをビルドし、そのビルドしたイメージからコンテナを起動します。

tty

ttyは標準入出力先のデバイスのことです。tty:trueとすることでコンテナが正常終了するのを防げるため、コンテナの中に入ってサーバを立てたりすることができます。

ports

ポートの開放を行います。ホストのポート:コンテナのポートのように記述します。
ホストでポートが被らないように、8081:8080とするのも良いと思います。

env_file

ファイルに定義された環境変数を読み取り、コンテナへ定義します。
ymlに直接記述しても出来ますが、個人的には分けた方が可読性も保守性も上がるのでお勧めです。

depends_on

依存関係を定義してコンテナの起動順序を制御します。
上記の例では、dbコンテナが起動した後にgoコンテナが起動されます。

volumes

コンテナの外部に保管し、データを永続化します。

ホスト側の相対パス:コンテナの絶対パスのように記述します。

networks

Dockerコンテナ間で通信を行うためのもので、同名のネットワークが記述されたコンテナ間で通信を行うようになります。

platform

どのプラットフォームに対応したイメージを生成するのか指定します。

Go的配置

接下来,创建Go目录,并按照以下结构进行配置。

.
├── docker-compose.yml
└── golang
    ├── Dockerfile
    └── app
        └── main.go

Go语言/Dockerfile

FROM golang:1.19.2-alpine
ENV GO111MODULE on

RUN apk update && \
    apk --no-cache add git && \
    apk add bash

RUN mkdir /go/src/app
WORKDIR /go/src/app

CMD ["go", "run", "main.go"]
    • 1行目:Dockerイメージのベースとなるイメージを指定します。

 

    • 2行目:go moduleをONにします。これにより、go.modでパッケージの管理を行うようにします。

 

    • 4~6行目:コンテナ内にgitやbashをインストールします。

 

    • 8~9行目:ディレクトリを作成し、作業スペースとして指定します。

 

    11行目:オプションを指定し、コマンドを実行します。

在golang项目的根目录下创建一个名为”app”的文件夹,并在其中创建main.go文件。使用Go的ORM框架gorm来连接数据库。

这是一个使用Go语言编写的应用程序的主要文件,位于golang/app/main.go中。

package main

import (
	"fmt"
	"log"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// MySQLに作成するUserテーブルの定義
type User struct {
	// gorm.Modelをつけると、idとCreatedAtとUpdatedAtとDeletedAtが作られる
	gorm.Model

	Name string
	Age  int
}

// DBを起動させる
func dbInit() *gorm.DB {
	// [ユーザ名]:[パスワード]@tcp([ホスト名]:[ポート番号])/[データベース名]?charset=[文字コード]
	dsn := fmt.Sprintf(`%s:%s@tcp(db:3306)/%s?charset=utf8mb4&parseTime=True`, 
            os.Getenv("MYSQL_USER"), os.Getenv("MYSQL_PASSWORD"), os.Getenv("MYSQL_DATABASE"))
	// DBへの接続を行う
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	// エラーが発生した場合、エラー内容を表示
	if err != nil {
		log.Fatal(err)
	}
	// 接続に成功した場合、「db connected!!」と表示する
	fmt.Println("db connected!!")
	return db
}

func main() {
	// DB起動
	db := dbInit()
	// Userテーブル作成
	db.AutoMigrate(&User{})
}

os.Getenv(…) 使用在mysql/.env中的环境变量进行了说明。
在dbInit()函数中,连接到MySQL数据库,并使用db.AutoMigrate(&User{})在MySQL上创建User表。

创建 go.mod 和 go.sum 文件

在终端中输入以下命令:cd golang/app,将进入app目录,然后执行go mod init app和go mod tidy命令,即可创建两个文件。

MySQL的配置

接下来,我们将创建MySQL的目录,并编写Dockerfile和.env文件。结构如下所示。

.
├── docker-compose.yml
├── golang
│   ├── Dockerfile
│   └── app
│       ├── go.mod
│       ├── go.sum
│       └── main.go
└── mysql
    ├── Dockerfile
    └── .env

MySQL的Dockerfile

FROM mysql:8.0
ENV LANG ja_JP.UTF-8

MySQL/.env

MYSQL_DATABASE=test_database
MYSQL_USER=test_user
MYSQL_PASSWORD=password
MYSQL_ROOT_PASSWORD=root_password

通过Docker Compose进行连接确认。

运行docker compose up命令,并确认是否有”db connected!!”这样的描述。

go-practice-go-1  | go: downloading github.com/jinzhu/now v1.1.5
go-practice-go-1  | go: downloading github.com/jinzhu/inflection v1.0.0
go-practice-go-1  | db connected!!

如果遇到错误消息”网络 golang_test_network 被声明为外部的,但是找不到”,请执行命令docker network create golang_test_network来创建网络。

确认实际上是否已经创建了该表。

下一步,启动一个新的终端,并运行docker compose exec db bash命令来进入db容器内。
如果出现bash-〇.〇#的情况,则表示成功。
然后,运行mysql -u root -p命令。
当出现Enter password:时,请输入在mysql/.env中所写的MYSQL_ROOT_PASSWORD,然后按Enter键。
※如果使用本次提供的内容,可以直接输入root_password。

只要按照以下步骤,您就能成功连接到MySQL。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.35 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

在这里,执行”use test_database;”命令来选择要使用的数据库。
最后,执行”show tables;”命令来确认是否已创建了users表。

mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| users                   |
+-------------------------+
1 row in set (0.06 sec)

我成功地使用这个方法在 Go 和 MySQL 之间建立了连接,并且可以通过 Go 创建表格。

最后

非常感谢您阅读到这里。
下一次,我打算使用Go(Echo)构建API服务器,并进行确认。
下一次:在Docker上使用Go(Echo)+ MySQL构建可以进行CRUD操作的API服务器(2)构建API服务器。

广告
将在 10 秒后关闭
bannerAds