[分享] 通过docker machine 搭建GitLab测试环境

docker machine是一种在虚拟机中安装docker镜像的方法。通过该方法可以实现快速准备各种版本的Gitlab。

下面是在mac上的具体操作步骤:

1. 准备虚拟机环境

下载并安装对应版本virtualBox

  • MacOS 安装virtualBox
brew install --cask virtualbox   #新版Macos
brew cask install virtualbox    #旧版Macos

2. 准备Docker环境

  • MacOS 安装docker-machine
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine
  • Linux 安装docker-machine
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

3. 创建 docker host

  • 通过本机VirtualBox虚拟机创建docker host
#创建名为gitlab-test-env的docker-machine
docker-machine create \
--virtualbox-cpu-count -1 \
--virtualbox-memory 4096 \
--virtualbox-disk-size 30000 \
--driver virtualbox gitlab-test-env
  • 如何将远端一台服务器接管为docker host, 请参见官方文档 generic driver

3.1 启停docker-machine

#启动docker-machine
docker-machine start gitlab-test-env

Starting "gitlab-test-env"...
(gitlab-test-env) Check network to re-create if needed...
(gitlab-test-env) Waiting for an IP...
Machine "gitlab-test-env" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

#停止docker-machine
docker-machine stop gitlab-test-env

3.2 建立本机到docker-machine的连接

#将连接docker-machine的环境变量加入当前终端
eval "$(docker-machine env gitlab-test-env)"

若需要长期使用docker-machine,则可添加到~/.zshrc

echo 'eval "$(docker-machine env gitlab-test-env)"' >> ~/.zshrc

检查是否已经建立链接,可以看见 Operating System: Boot2Docker 19.03.12 (TCL 10.1),说明链接已建立。
提示:
1)如果docker info一直未响应,请检查当前shell是否设置了科学上网代理
2)可以通过nc -vv <vituralbox 虚拟机IP地址> <端口>检查docker host网络连接是否正常
3)可以通过docker-machine env gitlab-test-env查看docker host的IP地址和端口


docker info
...
 Kernel Version: 4.19.130-boot2docker
 Operating System: Boot2Docker 19.03.12 (TCL 10.1)
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 3.851GiB
 Name: gitlab-test-env
 ID: WOSJ:6S4K:P2JI:ZETL:YABR:PGSL:MLPH:IDJU:D6R6:5KV7:Z65D:C5PM
 Docker Root Dir: /mnt/sda1/var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
  provider=virtualbox
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://mirror.ccs.tencentyun.com/
  http://f1361db2.m.daocloud.io/
  https://docker.mirrors.ustc.edu.cn/
 Live Restore Enabled: false
 Product License: Community Engine

3.3 创建gitlab容器

3.3.1 获取可用的gitlab tags

wget -q https://registry.hub.docker.com/v1/repositories/gitlab/gitlab-ee/tags -O - | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n' | awk -F: '{print $3}'

....
13.6.5-ee.0
13.7.0-ee.0
13.7.0-rc3.ee.0
13.7.1-ee.0
13.7.2-ee.0
13.7.3-ee.0
13.7.4-ee.0
13.8.0-ee.0
....

3.3.2 设置环境变量

#设置必要的容器参数
export SSH_PORT=2222
export HTTP_PORT=8888
export VERSION=13.7.4-ee.0
export NAME=gitlab-test-13.7.4

3.3.3 运行gitlab容器

运行后容器就在虚拟机中的docker中运行了

docker run --detach \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://$(docker-machine ip gitlab-test-env):$HTTP_PORT'; gitlab_rails['gitlab_shell_ssh_port'] = $SSH_PORT;" \
--hostname $(docker-machine ip gitlab-test-env) \
-p $HTTP_PORT:$HTTP_PORT -p $SSH_PORT:22 \
--name $NAME \
gitlab/gitlab-ee:$VERSION

等待gitlab启动成功后,运行如下命令获得虚机的ip

docker-machine ip gitlab-test-env
192.168.99.102

访问http://192.168.99.102:8888即可看到gitlab页面

3.3.4 加速方式

为了加快国内下载镜像的速度,可以采用如下两种加速方式

3.3.4.1 镜像加速

修改$HOME\.docker\machine\machines\gitlab-test-env\config.json文件,找到RegistryMirror增加如下内容:

"RegistryMirror": [
               # daocloud.io镜像
               "http://f1361db2.m.daocloud.io",
               # 中科大镜像
               "https://docker.mirrors.ustc.edu.cn"
             ],

然后,运行如下命令生效配置。

docker-machine provision gitlab-test-env
3.3.4.2 科学加速

修改$HOME\.docker\machine\machines\gitlab-test-env\config.json文件,找到Env增加如下内容:

"HostOptions": {
    "Driver": "",
    ...
    "EngineOptions": {
   		 ...
            "Env": [
                #代理地址
                "HTTP_PROXY=http://10.121.8.110:8080",
                "HTTPS_PROXY=http://10.121.8.110:8080",
                # docker-machine虚机ip
                "NO_PROXY=192.168.99.102"
            ],

然后,运行如下命令生效配置。

docker-machine provision gitlab-test-env