Windows Docker下Gitea保姆级安装教程:用MySQL 5.7做数据库,一次搞定

Windows Docker环境下Gitea与MySQL 5.7的黄金组合部署指南

在当今软件开发领域,版本控制系统的重要性不言而喻。对于个人开发者或小型团队而言,搭建一个轻量级、高性能的自托管Git服务不仅能提高工作效率,还能确保代码资产的安全可控。本文将详细介绍如何在Windows Docker环境中部署Gitea这一优秀的自托管Git服务,并采用MySQL 5.7作为其后端数据库,打造一个稳定可靠的代码托管平台。

1. 环境准备与基础配置

在开始部署之前,我们需要确保系统满足基本要求。Windows 10或11专业版/企业版/教育版(64位)是运行Docker的理想选择,建议版本1903或更高。同时,至少需要4GB内存和20GB可用磁盘空间以保证服务流畅运行。

首先安装Docker Desktop for Windows:

  1. 从Docker官网下载最新稳定版安装包
  2. 运行安装程序,勾选"使用WSL 2后端"选项
  3. 安装完成后重启系统
  4. 启动Docker Desktop,在设置中确保已启用WSL集成

提示:如果系统不支持WSL 2,也可使用Hyper-V后端,但性能可能略逊一筹

验证Docker安装是否成功:

docker --version docker-compose --version

这两个命令应分别返回Docker和Docker Compose的版本信息。

2. MySQL 5.7容器部署

作为Gitea的后端存储,MySQL 5.7提供了良好的性能和稳定性平衡。我们将使用Docker volume来持久化数据库,确保数据安全。

创建专用数据卷:

docker volume create gitea_mysql_data

启动MySQL 5.7容器:

docker run -d \ --name gitea_mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=your_secure_password \ -e MYSQL_USER=gitea \ -e MYSQL_PASSWORD=gitea_password \ -e MYSQL_DATABASE=gitea \ -v gitea_mysql_data:/var/lib/mysql \ --restart unless-stopped \ mysql:5.7 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci

关键参数说明:

参数说明推荐值
MYSQL_ROOT_PASSWORDroot用户密码设置强密码
MYSQL_USERGitea专用用户名gitea
MYSQL_PASSWORD用户密码与root不同
character-set-server字符集utf8mb4
collation-server排序规则utf8mb4_unicode_ci

验证MySQL容器运行状态:

docker ps -f name=gitea_mysql

3. Gitea容器部署与配置

Gitea作为轻量级Git服务,其Docker部署非常简便。我们将使用官方镜像,并配置与MySQL的连接。

创建Gitea数据卷:

docker volume create gitea_data

启动Gitea容器:

docker run -d \ --name gitea \ -p 3000:3000 \ -p 2222:22 \ -v gitea_data:/data \ --link gitea_mysql:db \ -e DB_TYPE=mysql \ -e DB_HOST=db:3306 \ -e DB_NAME=gitea \ -e DB_USER=gitea \ -e DB_PASSWD=gitea_password \ -e USER_UID=1000 \ -e USER_GID=1000 \ --restart unless-stopped \ gitea/gitea:latest

端口映射说明:

  • 3000: Gitea的Web界面
  • 2222: SSH服务端口(避免与系统SSH冲突)

环境变量关键配置:

数据库配置

  • DB_TYPE: 数据库类型(mysql)
  • DB_HOST: 数据库地址(通过--link连接的别名)
  • DB_NAME: 数据库名
  • DB_USER: 数据库用户
  • DB_PASSWD: 数据库密码

系统配置

  • USER_UID: 运行用户UID(与宿主机用户匹配)
  • USER_GID: 运行用户GID

4. 初始设置与优化

容器启动后,通过浏览器访问http://localhost:3000进入Gitea的初始设置页面。首次安装需要进行以下配置:

  1. 数据库设置

    • 确保数据库类型为MySQL
    • 主机填写db:3306(容器链接别名)
    • 用户名和密码与MySQL容器启动时设置的一致
  2. 常规设置

    • 站点标题:自定义您的Gitea实例名称
    • 仓库根目录:保持默认/data/git/repositories
    • LFS根目录:/data/git/lfs
    • 运行用户:git
  3. 管理员账户

    • 务必设置一个强密码的管理员账户
    • 建议用户名不要使用admin等常见名称
  4. 服务配置

    • 禁用注册或设置注册限制(根据需求)
    • 配置邮件服务(可选但推荐)

完成初始化后,建议进行以下优化:

性能调优

[server] PROTOCOL = http DOMAIN = localhost HTTP_PORT = 3000 ROOT_URL = http://localhost:3000/ DISABLE_SSH = false SSH_PORT = 22 SSH_DOMAIN = localhost START_SSH_SERVER = true OFFLINE_MODE = false

仓库设置

[repository] ROOT = /data/git/repositories SCRIPT_TYPE = bash DEFAULT_PRIVATE = false DEFAULT_PUSH_CREATE_PRIVATE = true MAX_CREATION_LIMIT = -1

5. 日常维护与备份策略

为确保Gitea服务稳定运行,需要建立定期维护机制。

数据库备份

docker exec gitea_mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > gitea_backup_$(date +%Y%m%d).sql

Gitea数据备份

  1. 停止Gitea容器:docker stop gitea
  2. 备份数据卷:docker run --rm -v gitea_data:/data -v $(pwd):/backup alpine tar czf /backup/gitea_data_$(date +%Y%m%d).tar.gz -C /data .
  3. 启动Gitea容器:docker start gitea

自动备份脚本示例

#!/bin/bash # MySQL备份 docker exec gitea_mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" gitea' > /backups/gitea_db_$(date +%Y%m%d).sql # 数据备份 docker run --rm --volumes-from gitea -v /backups:/backup alpine tar czf /backup/gitea_data_$(date +%Y%m%d).tar.gz -C /data . # 清理旧备份 find /backups -type f -name "*.sql" -mtime +7 -exec rm {} \; find /backups -type f -name "*.tar.gz" -mtime +7 -exec rm {} \;

6. 常见问题排查

容器启动失败

  • 检查端口冲突:netstat -ano | findstr "3000"
  • 查看容器日志:docker logs gitea

数据库连接问题

  1. 验证MySQL容器是否运行:docker ps
  2. 测试MySQL连接:
docker exec -it gitea_mysql mysql -ugitea -p
  1. 检查Gitea数据库配置:/data/gitea/conf/app.ini

文件权限问题

  • 确保数据卷正确挂载:docker inspect gitea
  • 调整文件权限:
docker exec gitea chown -R git:git /data

性能优化建议

  • 对于大型仓库,增加MySQL的缓冲池大小
  • 考虑使用SSD存储数据卷
  • 定期执行git gc优化仓库

在实际使用中,我发现将Gitea的数据卷挂载到WSL2子系统中可以获得更好的I/O性能。通过\\wsl$\docker-desktop-data路径可以直接访问数据卷内容,便于直接管理和备份。