使用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

其中VIRTUAL_HOST和VIRTUAL_PORT是nginx-proxy进行自动代理时会用到的环境变量, 将VIRTUAL_HOST值设置为你的域名, VIRUTAL_PORT设置为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服务, 恭喜.