使用Docker部署Nginx + Gogs快速搭建在线Git服务

当我们需要一个在线的Git服务的时候, 我们通常会借助于Github、Bitbucket之类已经成熟的在线平台, 而一些情况下我们并不想把东西放在别人的平台上, 此时自行搭建一个Git服务就显得很有必要了. 自建Git服务有多种选择, 其中GitLab是做得最好的, 但可能也正因如此, 它的最低配置需要1GB的内存空间(不算swap), 而且配置起来极尽繁琐, 着实令人望而生畏. 好在我们现在有了国人开发的Gogs作为替代方案, 虽然功能的完整性上不如GitLab, 但其极低的资源占用和简单的初始配置对于小团队而言, 已经很适用了.

由于Gogs是使用Go语言开发的, 因此有着在各个平台上通过二进制文件直接部署的优势, 不过由于这篇文章讲的是Docker部署, 所以通过二进制文件部署有优势啥的, 我们就避开不谈了, 因为Dockerfile已经帮我们搞定了大部分事情——非常夸张的降低了服务的部署成本.

安装Docker

Docker的安装方法非常简单, 官方这里都有了.

甚至很多IaaS的云服务, 也已经把带有Docker的Ubuntu等系统作为可选的初始镜像之一, 所以基本上不用担心无法使用Docker的问题, 如果你的服务商禁止使用Docker或者仍然只提供较低Linux内核版本的CentOS系统, 那么是时候考虑换个服务商了.

部署Nginx

我推荐使用的Nginx镜像是 jwilder/nginx-proxy, 这个镜像傻瓜化的解决了我们最常见的多域名代理的情景, 避免了手动编写和修改配置文件来配合其他Docker容器的窘境, 并且这个镜像产生的容器可以和官方的容器共存.

你所需要做的一切事情, 仅仅是在服务器上运行以下命令:

docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy  

然后检查一下容器有没有正常在运行:

docker ps | grep nginx-proxy  

至此Nginx部署结束.

部署Gogs

在Docker上部署Gogs变得非常简单, 实际上你参照着这份官方的Docker部署指南, 就可以轻松的把Gogs运行起来, 完全不需要我这篇文章.

首先你需要创建一个用于存放Gogs各种文件的目录, 我个人的习惯是把数据存在/data里, 于是执行mkdir命令:

mkdir -p /data/gogs  

然后部署Gogs:

docker run -e VIRTUAL_HOST=git.blackglory.me -e VIRTUAL_PORT=3000 -p 10022:22 --name=gogs -v /data/gogs:/data -d gogs/gogs  

其中VIRTUALHOST和VIRTUALPORT是nginx-proxy进行自动代理时会用到的环境变量, 将VIRTUALHOST值设置为你的域名, VIRUTALPORT设置为3000(gogs在Docker里expose的端口号是3000).

-p 10022:22会将10022暴露给外网, 用于Git的SSH协议, 如果不用SSH可以去掉此项.

-v /data/gogs:/data将映射本地的目录作为volume给容器使用, 根据自己创建的目录修改此项.

接下来你的gogs应该就跑起来了, 设置好你的DNS, 然后我们可以访问网站进行初次的配置, 配置中需要注意的是Repository Root Path(仓库根目录)和Run User(运行用户)项是不需要修改的, HTTP Port(HTTP端口)设置为3000, SSH Port(SSH端口)设置为你-p参数设定的值(比如10022), Application URL(应用网址)设置为你的"http://你的域名"即可, nginx-proxy已经帮我们把容器内的3000端口在服务器上代理给80端口了.

如果你选择sqlite3作为数据库, 那么一切都搞定了, 不需要去考虑更多的事情, 剩下的便是登录你的管理员账号然后在后台设置好你SSH登录用的公钥(如果用SSH的话).

如果你选择MySQL之类的服务作为数据库, 那么你必须在部署Gogs之前部署好MySQL, 然后在Gogs里link你的数据库容器, 如果你用Docker Compose来管理容器, 这里还有一份 官方提供的docker-compose.yml可供你参考.

然后?

没有然后了, 你已经通过Docker成功部署了一个在线Git服务, 恭喜.