近来因工作原因,以及个人学习研究的需要,本人又重新祭出了docker神器,尝试着使用docker容器的方法在自己的电脑上搭建一套开发环境出来。因为我的开发环境都在windows下,所以我就在docker for windows desktop版中来搭建整套环境。当然好多人都习惯在虚拟机中在跑linux来开发、调试等等,但我更倾向于使用docker,至少我认为它轻量、方便、好用、灵活,部署快速。

  其中Gitlab的搭建就是一个让我折腾了好久的难点。Gitlab的几次搭建都以失败告终,当然不是说gitlab的镜像运行不起来,而是因为其数据不能持久化,每次重新启动或者重新run镜像的时候就会丢失数据,这样一来gitlab也就没什么意义了。

  经过一段时间的观察之后我发现,其实原因不是因为我没有使用docker run的-v参数挂主机卷进去,而是因为其实在windows上docker实质是运行在一个轻量级的linux docker虚拟机中,其本质上是linux系统,管理文件的方式尤其是权限方式跟windows是极大不同的,尤其是当我想把windows系统中本地的目录共享给docker gitlab做存储区的时候,权限方式基本都是操作失败的,所以最终数据根本就没办法初始化,更不论说是持久化了。因为在Gitlab及对应的redis、postgresql初始化的过程中有大量的chmod、chown等等linux权限操作,这些在目前的docker for windows挂载的windows目录上貌似还不能正常的工作,一旦失败,要么服务启动也就失败了,要么就是镜像使用了默认的docker中的路径继续操作了,最终数据是没法正常存储和初始化的。

  因此我只能退而求其次,使用docker volume的方式对数据进行持久化,当然这也有问题,那就是docker for windows其实是运行在hyperv的虚拟机中,因此docker volume最终实质是存储在虚拟机的虚拟磁盘文件中,在我的环境中我是这样配置的:
设置docker虚拟机文件路径
  这样设置后,在这个路径中会有下面这个hyperv的虚拟硬盘文件:
docker虚拟机虚拟硬盘文件
  在做好了上面的工作之后,就可以按照下面说的方法来创建gitlab的私有服务器了,我使用了两个版本,一个是sameersbn,这是大多数推荐的一个gitlab的非官方版;另一个是twang2218汉化的版本,对于英语蹩脚的我来说这个简直是福音,在此感谢twang2218(唐王?)及团队的辛苦工作!

  在此提醒大家,使用Docker for Windows的时候才使用我这里说的方法,纯linux docker环境下,就可以大胆的使用-v 参数将本地的路径直接划给docker容器,从而使数据持久化。同时这个方法的弊病就是数据还是在虚拟机中,仍然有安全隐患。

  另外请各位注意,下面方法中所有用docker volume方法创建的docker卷,请不要轻易删除,除非你知道你在干什么,否则你的数据就丢失了。如果只是重建gitlab,那么直接使用之前的docker volume即可,不需要再重建volume,这样就保持了数据的持久性,这样你提交的代码等等数据都会完好保存。

  最终,要保持gitlab数据的持久性,就需要两道保险,第一道就是刚才说的hyperv虚拟机的虚拟磁盘文件不要丢失,另一道保险就是docker volume只创建一次,从头用到尾,不要轻易再重建或删除等。

1、sameersbn 版:

1.1、创建postgresql

  创建docker volume:

docker volume create git_postgresql

  创建postgresql的容器,注意版本也是sameersbn的版本,不要用官方的版本,否则参数、卷等不一样,数据可能没法持久化。

docker run --name postgresql -d -e 'DB_NAME=gitlabhq_production' -e 'DB_USER=gitlab' -e 'DB_PASS=999999' -e 'DB_EXTENSION=pg_trgm' --privileged=true -v git_postgresql:/var/lib/postgresql sameersbn/postgresql

1.2、创建Redis容器

  创建docker volume:

docker volume create git_redis

  注意redis同样使用sameersbn的版本:

docker run --name redis -d -v git_redis:/var/lib/redis sameersbn/redis 

1.3、创建gitlab容器

  创建docker volume:

docker volume create gitlab_data
docker volume create gitlab_logs

  注意这些-e参数最后都提供,并且端口要保持一致,注意这些容器启动和初始化的时间都比较长,大概都需要几分钟,所以你需要的就是耐心等待:

docker run --name gitlab -d --link postgresql:postgresql --link redis:redisio -p 10022:22 -p 10080:80 -p 10443:443 -e 'GITLAB_PORT=10080' -e 'GITLAB_SSH_PORT=10022' -e 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' -e 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' -e 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' -e 'GITLAB_HOST=localhost' -e 'GITLAB_EMAIL=pop.163.net' -e 'SMTP_ENABLED=true' -e 'SMTP_DOMAIN=www.163.com' -e 'SMTP_HOST=smtp.163.net' -e 'SMTP_STARTTLS=false'  -e 'SMTP_USER=yourmail@163.com' -e 'SMTP_PASS=yourpw' -e 'SMTP_AUTHENTICATION=login' -e 'GITLAB_BACKUP_SCHEDULE=daily' -e 'GITLAB_BACKUP_TIME=10:30' -v gitlab_data:/home/git/data -v gitlab_logs:/var/log/gitlab sameersbn/gitlab

2、twang2218汉化版Gitlab搭建

  创建docker volume:

docker volume create git_log
docker volume create git_data
docker volume create git_cfg

  这种方法相对简单,但是一定要注意这个版本的初始化过程需要很长时间,大概是两根烟的功夫,中间你可以使用docker attach命令关联其输出查看初始化的过程:

docker run -d --hostname localhost --privileged=true -p 8080:80 -p 4443:443 -p 2222:22 --name gitlabzh  -v git_log:/var/log/gitlab -v git_data:/var/opt/gitlab -v git_cfg:/etc/gitlab twang2218/gitlab-ce-zh

  创建并初始化成功后,你就可以在浏览器中输入http://localhost:8080 就可以查看gitlab了,第一次打开时需要设置密码,然后登陆。注意两个版本初始化的账号都是root。关于gitlab进一步的设置以及git的操作就不再赘述了,大家可以自行百度。

3、git remote: HTTP Basic: Access denied 错误解决办法

  每次重新搭建gitlab后,由于端口等的改变,可能引起git bash中push代码出问题,按照下面的操作进行即可解决:

  问题描述:
git push 报 HTTP Basic: Access denied 错误

  原因:本地git配置的用户名、密码与gitlabs上注册的用户名、密码不一致。

解决方案:

解决方案:

  1. 如果账号密码有变动,用这个命令: git config –system –unset credential.helper 重新输入账号密码 应该就能解决了;
  2. 如果用了第一个命令,还不能解决问题那么用这个命令:git config –global http.emptyAuth true
  3. 如果以上两个方法不起作用,那么采用以下方法:

进入控制面板->用户账号->凭据管理器->windows凭据->普通凭据,在里面找到git,点开编辑密码,更新为最新密码之后就可以正常操作了。

  这里推荐直接使用第三个方法。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐