首先,Gitlab 官方是不支持 Windows 下部署 Gitlab 镜像的,所以正常的 Gitlab 服务还是部署在 Linux 上比较好。本地部署只是用于个人开发测试环境。
问题描述
其实搭建 Gitlab 本省是一件很简单的事情,直接 pull 官方的 Gitlab 镜像开起来就可以用了。
docker run --detach \--hostname gitlab.example.com \--publish 443:443 --publish 80:80 --publish 22:22 \--name gitlab \--restart always \--volume /srv/gitlab/config:/etc/gitlab \--volume /srv/gitlab/logs:/var/log/gitlab \--volume /srv/gitlab/data:/var/opt/gitlab \gitlab/gitlab-ce:latest
在 Windows 下我们把 volume 配置成本地路径运行后会出现一下错误:
Error executing action create on resource 'storage_directory[/var/opt/gitlab/git-data]
通过查找,这应该是权限不足,导致 Windows 下的 volume 映射存在一些问题。
解决方法
别人探索出目前可用的方法是采用 volume 数据卷挂载的形式。
首先先安装 Docker for Windows。并在 Setting 中设置 Shared Drives,设置一会用于挂载 docker 镜像的 volume 的磁盘。
然后初始化配置文件路径和 volume。
mkdir D:\docker\gitlab\config
mkdir D:\docker\gitlab\backups
docker volume create gitlab-logs
docker volume create gitlab-data
然后直接创建一个 Container 运行就可以了。
docker run --detach `--name gitlab `--restart always `--hostname localhost `--publish 10443:443 --publish 10080:80 --publish 1022:22 `--volume D:\docker\gitlab\config:/etc/gitlab `--volume gitlab-logs:/var/log/gitlab `--volume gitlab-data:/var/opt/gitlab `gitlab/gitlab-ce
等待一段时间初始化后,就可以访问本地的 10080 端口了,http://localhost:10080
打开后就是正常 Gitlab 的页面,重置一下 root 的密码就可以正常使用了。
使用 Docker-Compose 部署(推荐)
如果在运行 Docker 容器时需要配置很多的参数,显然一遍遍输入 docker run
会比较麻烦,这里可以采用三剑客当中的 Docker-Compose 来进行容器的管理和创建(安装 docker-ce 时默认安装)。暂时不管 Docker-Compose 的其他用法,其实就是把命令运行改成了文件运行而已。
Docker-Compose 是通过文件来创建 Docker Container 的。我们需要在一个目录下创建 docker-compose.yml
文件,写入相应的配置文件。现在我们把上面的命令进行改造:
# Compose file 版本号,和 docker 版本号对应。3 支持 docker 1.13.0+
version: "3"
# services 节点下包含多个待创建的 Docker Container
services:# web 节点就是待启动的 gitlab 容器web:image: gitlab/gitlab-ce:latestcontainer_name: "gitlab"restart: alwayshostname: localhost:10080environment:TZ: "Asia/Shanghai"GITLAB_OMNIBUS_CONFIG: |gitlab_rails["time_zone"] = "Asia/Shanghai"gitlab_rails["gitlab_shell_ssh_port"] = 10022nginx["listen_port"] = 80ports:- "10080:80"- "10022:22"volumes:- D:\docker\gitlab\config:/etc/gitlab- gitlab-logs:/var/log/gitlab- gitlab-data:/var/opt/gitlab
volumes:gitlab-logs:gitlab-data:
可以看到这个文件的内容几乎和之前的 docker run
命令是保持一致的,唯一不同的是不需要我们自己创建 volume 了,直接在配置文件中配置后,启动时会自己为我们创建。
配置完成后,使用 docker-compose 命令运行起来。
# 打开 cmd,进入 docker-compose.yml 的根目录
# 创建容器
docker-compose up -d#关闭容器
docker-compose stop
What's More
1. Web UI 端口显示问题
由于 Gitlab 是在 Docker 内运行的,外部需要访问的话都是需要通过端口映射的,并且一般内部端口不会和映射出来的外部端口相同。所以在用的时候可能会出现一些问题。
例如在我们例子里,22 映射到 10022,80 映射到 10080。可以看到在 Gitlab 默认的 WebUI 中,项目显示的克隆地址默认是不带端口号的,如下图所示:
因此在进行克隆的时候,无论是 http 还是 ssh,都需要在 url 中手动添加新的端口,例如
http://localhost:10080/root/demo.git
修改配置文件后可以直接在 WebUI 中显示正确的 url。
具体需要修改 gitlab.rb
和容器内部 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
。
首先修改 gitlab.rb
# 取消这条配置文件的注释,并修改为外部映射的 ssh 端口
gitlab_rails['gitlab_shell_ssh_port'] = 1022
# 使用 exec 进入容器内部
root@gitlab:/# gitlab-ctl reconfigure
再修改 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
gitlab:## Web server settings (note: host is the FQDN, do not include http://)host: 127.0.0.1port: 10080 # 修改此处https: false
# 修改完后执行
root@gitlab:/# gitlab-ctl stop
root@gitlab:/# gitlab-ctl start
这里要注意,后面的那个配置文件是由前面那个生成的,修改 gitlab.rb 后 reconfigure,后面那个配置文件就会被重置了,注意一下修改的顺序。
显然这种方法比较麻烦,且需要进入容器中修改,一旦重启就没了。如果使用 docker-compose 来启动容器的话,可以直接在 environment 的 GITLAB_OMNIBUS_CONFIG 节点中配置,具体配置方式看上面的配置文件。
2. 镜像备份问题
由于使用的是 volume,因此 gitlab 内部的数据直接由 docker 管理了。显然就不太友好。如果有这个需求的可以阅读参考文献 2,里面提到了备份的方法。
总结
总之,Windows 对 Docker 的支持不是很友好,除了下一个学习学习,尝尝鲜,或者用于安装一些 Windows 下无法安装的软件,例如 Redis 等外,并不建议使用,显然选择 linux 系统一个是更明智的选择。
Reference
- GitLab Docker images
- Volume trouble with GitLab docker image on Windows
- I can not run Gitlab-ce on Docker via Windows if I set "volume" to Windows Shared Drives
- Gitlab 备份和迁移