目录

  • 什么是Docker
  • Linux安装Docker
  • Win10安装Docker
  • 使用Docker安装Gitlab
    • 使用阿里的镜像加速
    • 安装Gitlab镜像
    • 运行gitlab镜像
  • 配置Docker
    • 提供外网访问
    • 重启gitlab服务
    • Docker控制Gitlab运行
    • 验证安装
  • 优化gitlab内存
  • Gitlab使用
    • 注册小组成员
    • 创建一个仓库
    • 配置ssh并克隆代码

什么是Docker

首先我们的知道什么是docker,为什么我们需要docker?下面我引用知乎里面的一段回答:

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

总之docker就是集装箱原理。

如果还不懂的话,大家可以看我另一篇文章《Docker和K8s的前世今生》

Linux安装Docker

Linux分为不同版本,不同版本安装Docker的方式不一样,网上有很多教程,但是我自己还是喜欢以官方一点的资料为准,参照这篇文章可以完成在Linux的不同发行版本上安装Docker;

Docker安装完之后怎么运行,我们怎么样使用docker?当然是从最简单的Hello world开始啦(戳这篇文章)。

知道了Docker的简单使用后,我们就可以了解如何使用Docker安装我们需要的服务了,比如我想在Docker上安装Gitlab;

注意:Ubantu安装docker的时候可能会遇到一些版本不兼容问题,如果遇到建议按照文章安装旧版本的docker;
不知何种原因我没办法在我的win10下ubantu子系统环境中使用linux的方式安装centos,在启动docker run的时候提示无法找到守护进程,网上有文章说是可以通过先安装windows版本的docker再把window的docker进程作为守护进程(那我还不如直接用windows版本的docker,用什么子系统~~)

Win10安装Docker

  1. 首先在官网下载docker for windows,最新版的大概1g,安装,运行后我们就可与i使用win10自带的powershell终端使用docker了;
  2. 在powerShell中找一个地方新建三个空白目录:
mkdir -p gitlab/etc
mkdir -p gitlab/log
mkdir -p gitlab/data
  1. 使用docker命令拉去gitlab镜像
docker pull gitlab/gitlab-ce
  1. 使用以下命令指定端口映射和容器名和上面新建的目录映射,然后gitlab就跑起来了,以gitlab为例:
docker run -detach --hostname localhost -p 7002:80 -p 7001:443 -p 7003:22 --name gitlab --restart unless-stopped -v c:/docker/gitlab/etc:/etc/gitlab -v c:/docker/gitlab/log:/var/log/gitlab -vc:/docker/gitlab/data:/var/data/gitlab gitlab/gitlab-ce:latest

使用Docker安装Gitlab

我们知道要使用Docker安装一项服务,首先需要确定这项服务运行的环境,因为Docker是一个管理镜像的容器,这个容器里面需要塞入镜像才能运行镜像。这个镜像就是我们的linux发行版镜像(ubantu,centos等);

在这个镜像上我们会部署我们的服务(通常是一个镜像对应一个服务),Docker提供了一个公共的仓库DockerHub(Docker镜像仓库,某种意义上和Github意思一样),就像我们上面使用Helloworld镜像一样,我们可以通过Docker下载我们所需要的镜像,包括Mysql镜像,Gitlab镜像,每一个镜像都安装了他们所需要的依赖。

虽然DockerHub社区提供镜像下载服务,但是里面的镜像有些并不是很稳定,国内的话阿里、腾讯、网易云都有提供镜像下载服务,但是我觉得阿里做的最好。阿里云的镜像加速服务地址和如何配置点击这里(需要登陆阿里云);

使用阿里的镜像加速

虽然阿里巴巴的镜像加速服务使用文档上有Linux和windows,maxos的使用方式,但是我注意到centos和ubantu的配置方式是一样的,都是修改daemon配置文件/etc/docker/daemon.json来使用加速器。
具体使用方式我也贴一下:

$ sudo mkdir -p /etc/docker#  ["https://xxxxxxxx.mirror.aliyuncs.com"]里面是你自己的阿里云账号登陆上去后得到的加速服务地址;
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF# 重新加载daemon文件命令
$ sudo systemctl daemon-reload# 重启docker服务命令:
$ sudo systemctl restart docker# 开机自动启动docker服务命令,不想开机启动可以不输:
sudo systemctl enable docker

安装Gitlab镜像

docker安装镜像很简单,使用docker pull命令,我们这里安装Gitlab-ce版本,网上还有ee版本,ee是企业版,ce是社区版,一般们来说我们用CE版本就完事;

docker pull gitlab/gitlab-ce

下载完成后我们可以通过Docker image命令查看Docker里面的镜像信息,这里从阿里镜像服务里面拉取gitlab镜像有点大(1.89g),需要耐心等待,下载完镜像之后通过docker命令可以看到它的大小;

[root@izwz97itvvtnjerr2a55ptz docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
gitlab/gitlab-ce    latest              a505a4b614a7        41 hours ago        1.89GB
hello-world         latest              fce289e99eb9        13 months ago       1.84kB

运行gitlab镜像

首先我们需要做一些准备工作,提供给docker运行gitlab时的数据卷(Docker中很重要的概念):

$ mkdir -p /home/gitlab/config   #创建config目录,存放gitlab.rb等配置文件
$ mkdir -p /home/gitlab/logs    #创建logs目录,存放运行log
$ mkdir -p /home/gitlab/data    #创建data目录

然后我们使用脚本运行docker,启动一个容器(首次启动花的时间比较长):

$ docker run --detach \--hostname 139.108.222.151 \--publish 7001:443 --publish 7002:80 --publish 7003:22 \--name gitlab --restart always \--volume /home/gitlab/config:/etc/gitlab:Z \--volume /home/gitlab/logs:/var/log/gitlab \--volume /home/gitlab/data:/var/opt/gitlab a505a4b614a7
参数名称 参数说明
detach 指定容器运行于前台还是后台
hostname 指定主机地址,如果有域名可以指向域名,"192.168.1.133"只是示例
publish 指定容器暴露的端口,左边的端口代表宿主机的端口,右边的是代表容器的端口
name 给容器起一个名字
restart always 总是重启
volume 数据卷,在docker中是最重要的一个知识点.

注意:a505a4b614a7代表阿里云拉下的镜像Id,你需要替换成你自己拉下来的镜像Id,具体参考官方文档;
-publish 代表宿主机访问到docker镜像内部使用的端口映射。80端口负责访问管理页面,22端口负责ssh pull代码。
-volume代表宿主机和docker镜像内部的文件映射,如果是window机器则需要携程win文件系统形式比如:-v c:/docker/gitlab/data:/var/data/gitlab
-hostname 如果是docker所在服务器ip地址或者域名,本机则是localhost或127.0.0.1

配置Docker

提供外网访问

按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb(宿主机路径:/home/gitlab/config/gitlab.rb)配置有三个参数如:

external_url 'http://192.168.1.133'
gitlab_rails['gitlab_ssh_host'] = '192.168.1.133'
gitlab_rails['gitlab_shell_ssh_port'] = 703

注意:external_url
填写的地址应该是对于公网的地址或者域名,而且必须是固定ip,如果是可变ip则会因为gitlab配置的ip没有变而无法将代码push到gitlab,也无法从gitlab仓库pull代码到开发者;

重启gitlab服务

配置修改后需要进入docker重新启动gitlab,因为我们运行是使用数据卷参数进行运行的,宿主机的gitlab.rb被修改,是不会同步到容器中的镜像的,这个时候我们需要重启镜像中的服务;在docker容器中操作镜像使用docker exec命令;然后我们使用gitlab-ctl reconfigure重置配置使修改的配置生效。

$ docker exec -it gitlab /bin/bash  //进去gitlab容器的命令
$ gitlab-ctl reconfigure  //重置gitlab客户端的命令

Docker控制Gitlab运行

Docker中控制gitlab运行和linux中控制原理是一样的,有两种方式,一种是使用docker命令控制开始停止和重启,一种通过gitlab的指令实现;

$ docker start gitlab 					//启动命令
$ docker restart gitlab 				//重启命令
$ docker stop gitlab 					//停止命令

通过gitlab-ctl控制:

$ gitlab-ctl reconfigure  // 重新应用gitlab的配置
$ gitlab-ctl restart    // 重启gitlab服务
$ gitlab-ctl status      // 查看gitlab运行状态
$ gitlab-ctl stop      // 停止gitlab服务
$ gitlab-ctl tail     // 查看gitlab运行日志

关于Docker的其他常用命令:

$ docker rm fb087642b497(镜像ID) 		//删除镜像
$ docker container rm c113279e1f27 		//删除容器
$ docker ps -aq							//显示所有容器
$ docker stop $(docker ps -aq)			//停止所有容器

验证安装

浏览器输入http://xxx.xxx.xxx.xxx:7002,如果出现了以下界面说明安装成功了;

优化gitlab内存

gitlab在默认情况下内存消耗极大,我朋友64g内存还剩下2g,我是用的阿里云的丐帮服务器,当然要注意一下了,具体方法是修改/etc/gitlab/gitlab.rb文件(大家对比一下自己的文件,我这里的修改通过larsonzhong modified标识出来了);

# unicorn['enable'] = true
# unicorn['worker_timeout'] = 60# 根据链接来修改:https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/unicorn.md
# 2020/02/23 larsonzhong modified
unicorn['worker_timeout'] = 60###! Minimum worker_processes is 2 at this moment
###! See https://gitlab.com/gitlab-org/gitlab-foss/issues/18771
# unicorn['worker_processes'] = 2# 2020/02/23 larsonzhong modified worker=CPU核数+1
unicorn['worker_processes'] = 2### Advanced settings
# unicorn['listen'] = 'localhost'

然后我们还需要修改一个地方,关于内存的:

### **Only change these settings if you understand well what they mean**
###! Docs: https://docs.gitlab.com/ee/administration/operations/unicorn.html#unicorn-worker-killer
###!       https://github.com/kzk/unicorn-worker-killer
# unicorn['worker_memory_limit_min'] = "1024 * 1 << 20"
# unicorn['worker_memory_limit_max'] = "1280 * 1 << 20"# 2020/02/23 larsonzhong modified 
unicorn['worker_memory_limit_min'] = "200 * 1 << 20"
unicorn['worker_memory_limit_max'] = "300 * 1 << 20"

把最小内存设置为200M,最大内存设置300M;改完了这个我们还需要把sidekiq并发数改一下:大家可以根据自己服务器硬件配套修改哈,我服务器才2g内存+4g虚拟;

# sidekiq['log_directory'] = "/var/log/gitlab/sidekiq"
# sidekiq['log_format'] = "json"
# sidekiq['shutdown_timeout'] = 4
# sidekiq['concurrency'] = 25# 2020/02/23 larsonzhong modified 
sidekiq['concurrency'] = 6# sidekiq['metrics_enabled'] = true
# sidekiq['listen_address'] = "localhost"
# sidekiq['listen_port'] = 8082

然后再修改一下数据库占用;

##! **recommend value is 1/4 of total RAM, up to 14GB.**
# postgresql['shared_buffers'] = "256MB"
# 2020/02/23 larsonzhong modified 
postgresql['shared_buffers'] = "256MB"还有这一处:数据库并发线程数
# postgresql['log_line_prefix'] = "%a"
# postgresql['max_worker_processes'] = 8
# 2020/02/23 larsonzhong modified 
postgresql['max_worker_processes'] = 6

修改完成后,我们使用gitlab-ctl reconfigure使配置生效;

Gitlab使用

我们通过一个简单的例子模拟公司研发小组使用gitlab项目组,步骤如下:

  1. 创建一个私有的代码仓库;
  2. 配置sshkey并在开发机器上拉取该代码仓库代码;
  3. 修改代码并提交到gitlab。
  4. gitlab将提交的代码合入到版本仓库。

注册小组成员

为了简便,我们假设这个研发小组里面只有最简单的成员关系(老板1个,组长1个,开发1个)。

创建一个仓库

点击菜单栏"project"->“starred projects”->填写项目名称,点击创建。然后你会进入到这样一个页面;
使用Docker快速部署Gitlab-编程知识网在这个界面上我们可以看到很多信息,在这里我们初始化一个readMe文件,我随便写了一下;点击"commit changes"保存;
使用Docker快速部署Gitlab-编程知识网完了之后我们发现界面上方多了一句话:
使用Docker快速部署Gitlab-编程知识网大概就是说我们可以用gitlab做持续集成,只需要你有对应的配置即可,这里我们不管他,因为在后续的文章中我会和大家一起分享如何做持续集成;

配置ssh并克隆代码

标题栏提示我们需要添加一个sshkey,否则我们没办法push项目代码。