Ubuntu 使用 Docker 安装 Gitlab

前言

最近帮公司重新搭建了 Gitlab,中间遇到了一些坑,折腾了不少时间,在此记录供大家参考。


正文

安装 Docker CE

卸载旧版本

如果有使用旧版本的 Docker (称为 docker 或者 docker-engine),请使用下列命令卸载。

$ sudo apt-get remove docker \
               docker-engine \
               docker.io

安装前准备

Ubuntu 14.04

从 Ubuntu 14.04 开始,一部分内核模块移到了可选内核模块包 (linux-image-extra-*) ,以减少内核软件包的体积。正常安装的系统应该会包含可选内核模块包,而一些裁剪后的系统可能会将其精简掉。AUFS 内核驱动属于可选内核模块的一部分,作为推荐的 Docker 存储层驱动,一般建议安装可选内核模块包以使用 AUFS。

如果系统没有安装可选内核模块的话,可以执行下面的命令来安装可选内核模块包:

$ sudo apt-get update
$ sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual

使用 APT 安装

由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

添加国内下载源(官方源在注释中)

首先为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

然后,向 source.list 中添加 Docker 软件源:

$ sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
# 官方源
# $ sudo add-apt-repository \
#    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
#    $(lsb_release -cs) \
#    stable"

以上命令会添加稳定版本的 Docker CE APT 镜像源,如果需要测试或每日构建版本的 Docker CE 请将 stable 改为 test 或者 nightly。 安装 Docker CE 更新 apt 软件包缓存,并安装 docker-ce: $ sudo apt-get update

$ sudo apt-get install docker-ce

使用脚本自动安装

同时也可以选择使用下列脚本快速安装:

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

执行脚本自动安装 Docker CE。

启动 Docker CE

$ sudo systemctl enable docker
$ sudo systemctl start docker

Ubuntu 14.04 请用下列命令启动:

$ sudo service docker start

安装 Gitlab

我们使用 sameersbn/gitlab Gitlab 镜像,Github 地址:https://github.com/sameersbn/docker-gitlab。 首先我们安装 docker-compose

sudo pip install docker-compose -U

然后下载 sameersbn/gitlab Gitlab 镜像的 docker-compose.yml 文件:

wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml

然后修改其中的配置,以下是我修改后的版本:

version: '2'
services:
  redis:
    restart: always
    image: sameersbn/redis:4.0.9-1
    command:
    - --loglevel warning
    volumes:
    # redis 储存空间挂载到外部
    - /data/gitlab/redis:/var/lib/redis:Z
  postgresql:
    restart: always
    image: sameersbn/postgresql:10
    volumes:
    # postgresql 储存空间挂载到外部
    - /data/gitlab/postgresql:/var/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm
  gitlab:
    restart: always
    # 此处应注意修改为 9.2.5 版本,最新版通过 repo by URL 从其他仓库迁移过来的项目使用 create merge request 时会出现 503 bug
    image: sameersbn/gitlab:9.2.5
    depends_on:
    - redis
    - postgresql
    ports:
    # 将容器中的 80、443、22 端口映射到宿主机
    - "127.0.0.1:10080:80"
    - "127.0.0.1:10443:443"
    - "10022:22"
    volumes:
    # gitlab 储存空间挂载到外部
    - /data/gitlab/gitlab:/home/git/data:Z
    environment:
    - DEBUG=false
    - DB_ADAPTER=postgresql
    - DB_HOST=postgresql
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - REDIS_HOST=redis
    - REDIS_PORT=6379
    - TZ=Asia/Kolkata
    - GITLAB_TIMEZONE=Kolkata
    - GITLAB_HTTPS=false
    - SSL_SELF_SIGNED=false
    
    # 此处需要改为你访问 gitlab 的域名或者IP
    - GITLAB_HOST=xxx
    # 如果访问时使用 http 为 80,https 则为 443
    - GITLAB_PORT=80
    - GITLAB_SSH_PORT=10022
    - GITLAB_RELATIVE_URL_ROOT=
    # 为了安全起见可以使用 pwgen -Bsv1 64 命令生成随机的 64 个字符串值替换下面三个变量的值
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string
    
    # 需要设置一个默认的 root 用户邮箱,密码不填第一次登录会让你自己设置
    - GITLAB_ROOT_PASSWORD=
    - GITLAB_ROOT_EMAIL=xxx@xxx.xxx
    - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
    - GITLAB_NOTIFY_PUSHER=false
    - GITLAB_EMAIL=notifications@example.com
    - GITLAB_EMAIL_REPLY_TO=noreply@example.com
    - GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com
    - GITLAB_BACKUP_SCHEDULE=daily
    - GITLAB_BACKUP_TIME=01:00
    
    # 以下为 QQ 企业邮箱配置
    - SMTP_ENABLED=true
    - SMTP_DOMAIN=exmail.qq.com
    - SMTP_HOST=smtp.exmail.qq.com
    - SMTP_PORT=465
    - SMTP_USER=xxx@xxx.xxx
    - SMTP_PASS=password
    - SMTP_STARTTLS=true
    # SMTP_TLS 选项原始配置文件中没有,默认为 false,使用 QQ 企业邮箱一定要加上,否则无法发送邮件
    - SMTP_TLS=true
    - SMTP_AUTHENTICATION=login
    - IMAP_ENABLED=false
    - IMAP_HOST=imap.gmail.com
    - IMAP_PORT=993
    - IMAP_USER=mailer@example.com
    - IMAP_PASS=password
    - IMAP_SSL=true
    - IMAP_STARTTLS=false
    - OAUTH_ENABLED=false
    - OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=
    - OAUTH_ALLOW_SSO=
    - OAUTH_BLOCK_AUTO_CREATED_USERS=true
    - OAUTH_AUTO_LINK_LDAP_USER=false
    - OAUTH_AUTO_LINK_SAML_USER=false
    - OAUTH_EXTERNAL_PROVIDERS=
    - OAUTH_CAS3_LABEL=cas3
    - OAUTH_CAS3_SERVER=
    - OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false
    - OAUTH_CAS3_LOGIN_URL=/cas/login
    - OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate
    - OAUTH_CAS3_LOGOUT_URL=/cas/logout
    - OAUTH_GOOGLE_API_KEY=
    - OAUTH_GOOGLE_APP_SECRET=
    - OAUTH_GOOGLE_RESTRICT_DOMAIN=
    - OAUTH_FACEBOOK_API_KEY=
    - OAUTH_FACEBOOK_APP_SECRET=
    - OAUTH_TWITTER_API_KEY=
    - OAUTH_TWITTER_APP_SECRET=
    - OAUTH_GITHUB_API_KEY=
    - OAUTH_GITHUB_APP_SECRET=
    - OAUTH_GITHUB_URL=
    - OAUTH_GITHUB_VERIFY_SSL=
    - OAUTH_GITLAB_API_KEY=
    - OAUTH_GITLAB_APP_SECRET=
    - OAUTH_BITBUCKET_API_KEY=
    - OAUTH_BITBUCKET_APP_SECRET=
    - OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=
    - OAUTH_SAML_IDP_CERT_FINGERPRINT=
    - OAUTH_SAML_IDP_SSO_TARGET_URL=
    - OAUTH_SAML_ISSUER=
    - OAUTH_SAML_LABEL="Our SAML Provider"
    - OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient
    - OAUTH_SAML_GROUPS_ATTRIBUTE=
    - OAUTH_SAML_EXTERNAL_GROUPS=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=
    - OAUTH_CROWD_SERVER_URL=
    - OAUTH_CROWD_APP_NAME=
    - OAUTH_CROWD_APP_PASSWORD=
    - OAUTH_AUTH0_CLIENT_ID=
    - OAUTH_AUTH0_CLIENT_SECRET=
    - OAUTH_AUTH0_DOMAIN=
    - OAUTH_AZURE_API_KEY=
    - OAUTH_AZURE_API_SECRET=
    - OAUTH_AZURE_TENANT_ID=

注:请注意有注释的变量! 主要有以下几个关键点:

  1. 将 Redis、PostgreSQL、Gitlab 的储存空间挂载到外部;
  2. sameersbn/gitlab 镜像的版本建议使用 10 以下,这里使用的 9.2.5。否则可能会有 bug;
  3. 设置 GITLAB_HOSTGITLAB_PORT,GITLAB_HOST 会在仓库地址中得到体现,如果你用域名访问此处就为域名,用 IP 访问此处为 IP。GITLAB_PORT 取决于访问 gitlab 的协议,http 为 80,https 则为 443;
  4. 设置一个 root 邮箱;
  5. 使用 QQ 企业邮箱发送邮件一定要加上 SMTP_TLS=true, 否则邮件发送不了。其他邮箱配置请参考 Gitlab 官方配置

在配置文件 docker-compose.yml 所在目录下执行下列命令启动 Gitlab:

sudo docker-compose up -d

Nginx 配置

http 协议

upstream gitlab {
        server 127.0.0.1:10080;
}
server {
    server_name git.xxx.xxx;
    listen 80;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://gitlab;
    }
}

https 协议

upstream gitlab {
        server 127.0.0.1:10080;
}
server {
    listen 80;
    server_name git.xxx.xxx;
    rewrite ^/(.*)$ https://git.xxx.xxx/$1 permanent;
}
server {
    server_name git.xxx.xxx;
    listen 443 ssl;
    ssl on;
    ssl_certificate /etc/nginx/xxx.crt;
    ssl_certificate_key /etc/nginx/xxx.key;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://gitlab;
    }
}

载入 Gitlab Nginx 配置

配置好相应的协议的配置文件,执行下列命令使其生效:

sudo nginx -s reload

访问域名即可进入 gitlab 首页。

参考

  1. Ubuntu 安装 Docker CE
  2. sameersbn/docker-gitlab

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏华仔的技术笔记

Boinc for Linux,在服务器上一边科研,一边挖矿

https://www.toutiao.com/i6589514965932048910/

2641
来自专栏喵了个咪的博客空间

Docker编排工具Docker-compose

3137
来自专栏landv

烽火R2600交换机配置脚本

1162
来自专栏CodingToDie

天才第一步 Docker 纸尿裤

Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到...

3053
来自专栏散尽浮华

openstack虚拟机迁移的操作记录

需求说明: 计算节点linux-node1.openstack:192.168.1.8   计算节点linux-node2.openstack:192.168....

6979
来自专栏圣杰的专栏

.NET Core+MySql+Nginx 容器化部署

1. 引言 上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容...

4238
来自专栏姚俊刚的专栏

Dockerfile 分享之 SSH Server

Docker 官方网站上给出的示例里面有个 用 Dockerfile 构建 SSH Server 的例子, 我在腾讯云的主机上实验了一下, 中间添加了一些优化,...

1.6K0
来自专栏友弟技术工作室

docker快速入门

docker已经是一年前的时候学习的了,当时,不会go语言。工作中一直没有使用,已经忘光了。在放假前,sdk那边说线上docker的打包环境每次打包特别慢,查询...

43013
来自专栏杨建荣的学习笔记

使用shell定制awr脚本(r3笔记第32天)

大家在做性能问题诊断的时候,awr是不可或缺的工具,使用?/rdbms/admin/awrrpt.sql可能大家使用的多了,可能有时候感觉输入参数还是有些太繁琐...

2754
来自专栏刘君君

docker部署基于nodejs的vue应用

5044

扫码关注云+社区