本文首发于我的个人博客,解决 Windows Docker 安装 Gitlab Volume 权限问题 ,欢迎访问!

记录一下 Windows10 下 Docker 安装 Gitlab 的步骤。

Caution: We do not officially support running on Docker for Windows. There are known issues with volume permissions, and potentially other unknown issues. If you are trying to run on Docker for Windows, please see our getting help page for links to community resources (IRC, forum, etc) to seek help from other users.

首先,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:latest
container_name: "gitlab"
restart: always
hostname: localhost:10080
environment:
TZ: "Asia/Shanghai"
GITLAB_OMNIBUS_CONFIG: |
gitlab_rails["time_zone"] = "Asia/Shanghai"
gitlab_rails["gitlab_shell_ssh_port"] = 10022
nginx["listen_port"] = 80
ports:
- "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.1
port: 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

  1. GitLab Docker images
  2. Volume trouble with GitLab docker image on Windows
  3. I can not run Gitlab-ce on Docker via Windows if I set "volume" to Windows Shared Drives
  4. Gitlab 备份和迁移

解决 Windows Docker 安装 Gitlab Volume 权限问题的更多相关文章

  1. Docker安装Gitlab

    一.Ubuntu16.4上Docker安装Gitlab 1.安装docker 参见:https://docs.docker.com/engine/installation/linux/ubuntuli ...

  2. windows下 安装gitlab及其相关图形管理工具

    windows下 安装gitlab及其相关图形管理工具   在windows下安装git中文版客户端并连接gitlab   下载git Windows客户端 git客户端下载地址:https://gi ...

  3. 利用docker安装gitlab

    安装docker 安装 virtualbox 下载 dockertoolbox并安装 官网的服务器一直连不上, 幸亏还有这个 https://get.daocloud.io/toolbox/ 比 ht ...

  4. docker安装gitlab并部署CICD

    摘要 本文主要实现了在docker下安装gitlab,将gitlab绑定在宿主机的180端口,将gitlab的clone的URL添加指定端口号:部署了CI/CD,并公布了测试项目. 安装docker[ ...

  5. Debian9 使用 Docker 安装 gitlab完整过程

    一. 安装Docker CE (参考 官网指南) 1. 卸载老版本 sudo apt-get remove docker docker-engine docker.io  2. Update the ...

  6. Centos7 docker安装GitLab

    *先决条件系统已安装Docker 1.查询GitLab镜像 docker search gitlab 2.现在GitLab镜像 3.创建文件夹 mkdir -p /software/gitlab/co ...

  7. 基于Docker安装 GitLab

    ⒈下载镜像 本文使用GitLab 中文社区版 Docker 镜像 Docker Hub地址:https://hub.docker.com/r/beginor/gitlab-ce 如果要体验最新版的Gi ...

  8. centos7下使用docker安装gitlab

    环境背景: Docker化已经成为一种热门,记录一下使用docker引擎安装gitlab的过程. 测试环境: 系统 软件 依赖 CentOS 7.4 GitLab(latest) docker-ce ...

  9. 使用docker安装gitlab,两台电脑gitlab库相互迁移

    原文来自合伙呀 https://hehuoya.com/2019/09/30/gitlab-docker/ Docker  for gitlab brew cask install docker do ...

随机推荐

  1. AJAX-----11iframe模拟ajax文件上传效果原理3

    如果直接给用户提示上传成功,那么如果用户上传的文件比较大点,那么等上半天都没反映,那么用户很有可能会刷新或者关了从来等... 那么会给我们服务器带来一定的影响,所以我们可以对这方面的用户体验度进行提升 ...

  2. 测试mysql的sql语句预编译效果

    玩Oracle的都比较关注shared pool,特别是library cache,在使用了绑定变量(预编译sql)之后确实能得到很大的性能提升.现在在转Mysql之后特别是innodb很多东西都还能 ...

  3. java JDK8 学习笔记——第18章 自定义泛型、枚举与注释

    第十八章 自定义泛型.枚举与注释 18.1 自定义泛型 泛型定义: (1)仅定义在方法上的泛型语法 (2)用来限制泛型可用类型的extends与super关键字(3)?类型通配字符的使用 18.1.1 ...

  4. MySql Update Select 嵌套

    UPDATE `TB_CM_Dic` SET `ParentID` = (SELECT `ID` FROM (SELECT * FROM `TB_CM_Dic`) AS B WHERE `DicNam ...

  5. C语言中sizeof与strlen区别

    本文转载自:http://www.2cto.com/kf/201109/105100.html 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc& ...

  6. 关于HTTP以及TCP

    HTTP协议 HTTP(HyperText Transport Protocol),中文译名为超文本传输协议,是一个基于TCP协议的网络协议,主要用于进行网页信息的传输. HTTP协议是在1960年由 ...

  7. HTTP协议 - 基础认识

    在http协议使用场景上我们最熟悉的可能就是浏览器了,作为本系列第一篇,就讲一个问题  ”浏览器怎么连接上服务器并获取网页内容的“ : 首先 浏览器怎么连接上服务器的? 如果对OSI七层模型或者TCP ...

  8. eclipse卸载自带maven

    1.在eclipse的安装目录下,找到   features和plugins文件夹,删除这两个文件夹下maven对应的jar和文件夹(windows用户建议用如下搜索:*maven*和*m2e*) 2 ...

  9. C++ 智能指针四

    /* 智能指针enable_shared_from_this模板类使用 */ #include <iostream> #include <string> #include &l ...

  10. [水煮 ASP.NET Web API2 方法论](1-4)从 MVC Controller 链接到 API Controller 以及反向链接

    问题 想创建一个从 ASP.NET MVC controller 到 ASP.NET Web API controller 的直接链接,或者反向链接. 解决方案 可以使用 System.Web.Htt ...