大项目mysql数据库配置与连接 | 青训营笔记

84 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第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语句,方便调试。