这是我参与「第五届青训营 」笔记创作活动的第5天。
记录一下为大项目使用docker-compose配置mysql,并使用gorm进行连接的过程。这样一来,只要把docker-compose配置文件上传到仓库,队友就可以在本地自行搭建所需的数据库了,之后要扩展nginx、redis也只要改compose配置即可。由于这一切都是现学的,在此用笔记记录,以备参考。
docker-compose配置
version: '3'
services:
mysql:
restart: always
image: mysql:8.0.27
container_name: douyin-mysql
volumes:
- ./data:/var/lib/mysql
- ./mysql.cnf:/etc/my.cnf
environment:
- "MYSQL_ROOT_PASSWORD=123456"
- "MYSQL_DATABASE=douyin"
- "TZ=Asia/Shanghai"
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
healthcheck:
test: "mysqladmin ping -h localhost"
timeout: 1s
retries: 20
interval: 1s
service:
build: .
container_name: douyin-service
depends_on:
mysql:
condition: service_healthy
说一下跟mysql相关的几条配置项。
- volumes里的两条是要挂载的目录,分别是数据存放的位置,和配置文件位置,直接放在项目目录下即可。
- env里是docker的环境变量,三条分别是root用户的密码、初始的数据库和时区。
- command里是为了能在外部访问加上的(兼容性问题)。
- ports为映射的端口。
- healthcheck为测试mysql服务是否启动。这一点很坑,因为容器启动起来后,里面的服务不一定能马上起来。然而通常depens_on只需要依赖的容器启动起来,不管里面的服务是否启动,便会启动后续的容器。所以需要用
healthcheck检查服务是否启动,test是用于检查的命令,timeout是命令超时时间,retries是最多重试次数,interval是相邻检查命令间隔。然后需要搭配depends_on里面的service_healthy条件使用。
然后用docker compose up -d命令启动镜像。
GORM连接
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?&parseTime=true", "root", "123456", "mysql", "3306", "douyin")
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
连接请求的参数为用户名、密码、地址、端口、数据库名。
程序放在douyin-service容器中,在docker compose中和mysql一起启动。因此二者处于一个网络内,地址填mysql容器的名字mysql即可,/etc/hosts中会有一条规则将其转换为实际ip地址。
gorm.Open()中的logger设置日志级别为最低的Info,这样会输出执行的每一条sql语句,方便调试。