# 如何通过 Docker 搭建一个轻量 Git 服务端，并讲讲 Docker 的配置逻辑

> 本文公开全文。

原文：https://utgd.net/article/9835

在上周更新的《Obsidian 的 PC 端同步方案，无代码搞定 Git 同步》一文中我们讲到，如果想把 Obsidian 笔记通过 Git 同步，就需要选择一个合适的运营商。

上次已经提到了一些可以选择的服务商，例如公共的有 Github、 Gitee；私有的有 Gitlab、Gogs\.io 。使用公共服务的方法上次已经讲过，这次主要讲解如何本地部署一个 Git 服务。

如果你不知道为什么要用 Git 同步的话，我在上篇文章中的”网盘实时同步的麻烦事“部分详细说明了原因。

## 为何选择 Gogs ？

我选择了 Gogs 来讲解，主要是出于以下几个原因：

- Gogs 是一个轻量化的 Git 服务，对系统占用较小。

- Gogs 的功能够用。

- Gogs 的安装流程简便。

其中第一点最重要，因为 Gitlab 对系统配置的要求比较高，单是内存这一项就要求大于 4 GB，如果是 2 GB 内存则会直接无法运行，这个要求已经可以淘汰掉一些入门级服务器了。而 Gogs 在 NAS、树莓派、入门级服务器上都可以无压力运行，长期运行也不会影响其他服务。

而且我们介绍的场景也不是多人开发协作，只是个人同步笔记用，不需要过多的开发相关功能，有最基本的 Git 服务和一个便于操作的网页就足够了。

Gogs 的安装过程也比较简单，官方的 Docker 版本基本做到了开箱即用，连数据库都不需要额外配置，有个文件夹存放数据就可以。

## 如何在图形界面中安装 Docker 版 Gogs

我通常建议通过图形化界面来管理 Docker，这样能够直观看到容器的运行状态，像启动、停止、修改配置这样的操作，都能以最简单的方式完成。

所以先来讲讲在图像界面下如何安装 Docker 版本的 Gogs。

### 了解 Docker 的关键配置

我们借助 Gogs 顺便了解一下通过 Docker 跑一个服务需要做什么配置。

首先我们找到 Gogs 在 hub\.docker\.com 中的包：Gogs \- Docker Hub 。

根据它下方的文档提示可以得知，Gogs 的必要配置很少，我们根据它的官方配置可以得知，它需要这下面两行核心代码就可以完成部署。

```
docker pull gogs/gogs
docker run --name=gogs -p 10022:22 -p 10880:3000 -v /var/gogs:/data gogs/gogs
```

我们把这段命令拆分一下，再用白话翻译一下——

```
docker run      # 通过 Docker 运行
--name=gogs     # 取个名字叫 gogs
-p 10022:22     # 把 Docker 中的 22 端口映射到宿主机的 10022 端口。
-p 3000:3000    # 把 Docker 中的 3000 端口映射到宿主机的 3000 端口。
-v /var/gogs:/data   # 把 Docker 中的 /data 目录映射到 /var/gogs 目录。
gogs/gogs       # 用 gogs/gogs 这个镜像创建。
```

为照顾初学者，解释一下其中的名词：

- 宿主机（host）：就是运行着 Docker 的这台机器。

- 镜像（image）：可以理解为是一个系统的模板，其中包含了系统、软件、配置等文件。

- 容器（container）：当 docker run 命令执行完，就会产生一个容器。每个容器都是独立的、隔离的、可运行的。

- 映射（mapping）：是指将容器内部的端口或目录映射到宿主机上。当你在外部访问宿主机的 10022 端口时，就好像访问了容器的 22 端口一样。可以理解为打开一个通道。

由于镜像是不变的，所以端口 22、端口 3000，目录 /data 都是不变的。变的只是宿主机上的配置，如果你的 3000 端口已经被占用了，你可以改成 3001 。

还有一点需要注意，如果直接套用上面的代码，宿主机的 /var/gogs 应该是空的，并具有可读写权限。

### 在 NAS 中安装 Gogs

这里以群晖 DSM 系统中的 Docker 套件为例，这个套件可以直接在套件中心里安装（可能有机型限制）。如果没有找到，可以参考本文后半段的 Linux 方式在 NAS 上安装。

首先在“注册表”中搜索 gogs，第一个赞数最多的就是官方镜像，双击下载。

等待下载完毕后，在“映像”菜单中，找到 gogs/gogs\:latest 双击安装。

根据上面的解释，应该很容易理解接下来的步骤，你只需要在图像界面中根据 Gogs 给出的信息，进行配置。其他的保持默认就可以了。

在映射文件夹这一步，还需要注意目录权限问题，这一点往往是安装服务后不正常或者打不开的重要原因。

为避免权限问题，通常可以建立一些公用目录，而不是放在 /home 目录下。我的做法是新建一个 docker 共享文件夹，把 docker/gogs 作为宿主机的映射目录。然后再修改目录的权限。

在容器启动后，访问 http\://宿主机\-ip\:3000 就可以访问 Gogs 服务了。例如 http\://192\.168\.1\.168\:3000 。

相同的操作也可以用在 Portainer 中，Portainer 也是一个 Docker 的图形化管理器，每个系统上都有。

不过为了覆盖 Docker 的大部分功能，Portainer 的界面反而没有 NAS 上的 Docker 管理器那么直观，还需要多学习了解一下创建的流程。不过配置 Gogs 的流程还是大同小异的。

## 如何在 Linux 中安装 Docker 版 Gogs

接下来讲讲在 Linux 系统下如何用命令行安装 Docker 版本的 Gogs。因为 Git 服务很适合搭建在云服务器上，Git 仓库不会占据太多容量，也不用考虑远程访问的问题。

注意：如果在 NAS 上通过命令行安装，则需要开启 NAS 的命令行权限，请查阅不同 NAS 的官方文档。

### 安装 Docker

首先你需要安装 Docker，Linux 版本的 Docker 可以通过各个发行版内置的包管理工具进行安装。

- Ubuntu 安装 Docker

```
apt install docker.io
```

- CentOS 安装 Docker

```
sudo yum install docker-ce docker-ce-cli containerd.io
```

默认 Docker 不会启动，需要手动启动。

- 启动 Docker

```
$ sudo systemctl enable docker
$ sudo systemctl start docker
```

最后还有个可选步骤，你可以运行 sudo docker run hello\-world 验证一下有没有安装成功，这个命令会下载一个简单的镜像并运行，如果你已经正确安装 Docker，你会看到一条 Hello from Docker\! 的信息。

### 安装 Gogs 的 Docker 版本

在安装完 Docker 后，可以在终端中运行以下命令来下载 Gogs Docker 镜像：

```
docker pull gogs/gogs
```

然后使用以下命令启动 Gogs：

```
docker run --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogs:/data gogs/gogs
```

这段代码的含义我们上面已经拆分解释过了。需要注意的是如果你的宿主机上没有 /var/gogs 这个目录，应该改成一个已存在的目录，后面的 /data 则不需要改动。此外，宿主机的 /var/gogs 应该是空的，并具有可读写权限。

在这些配置之后，应该就可以在浏览器中访问 Gogs 了，地址是 http\://宿主机\-ip\:3000

## 如何使用 Gogs

使用 Gogs 创建仓库和 Github 类似，注册账户，创建仓库……图形化界面总是容易让人理解。这里就不再赘述了。

不过有一点需要注意。在完成仓库创建后，我们需要通过 git clone 把仓库下载到本地。往常在 Github 中 git clone 仓库后再尝试 push 时会提示用账号密码登录，然后由服务器判别你是否有这个仓库的更多权限，允许你做进一步的操作。

不同于 Github，在 Gogs 中推荐用个人令牌来取代密码。你需要在刚刚搭建完的 Gogs 网页中，进入”头像 \- 用户设置 \- 授权应用“这个界面下生成一个个人令牌。

这个个人令牌类似一次性密码的作用，用于证明你的身份。然后当你在执行 git clone 的时候，需要在仓库地址中加上这个令牌，格式如下：

```
http(s)://【个人令牌】@【服务器地址:端口号】/【用户名】/【仓库名】.git
```

最终组合出来如下：

```
http://eb36xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbf21@servername.myds.me:5080/username/repositorg.git
```

这样这个仓库就不再会丢失登录状态，始终以你的账号进行推送拉取操作了。

如果你想要同步 Obsidian 库，后续的操作就可以继续参考 Obsidian 的 PC 端同步方案，无代码搞定 Git 同步 完成。如果你想同步自己的代码库也是一样的。

Gogs 还提供了工单管理和知识库管理功能，支持多用户，对于小团队来说也是非常合适的选择。

## 小结

本文比较细致地讲解了关于 Docker 的基础操作，这一套操作在未来讲解其他服务安装时还会使用多次。

尽管 Docker 是一种非常便利的部署方式，但可别以为所有的部署都跟这次一样简单，未来也会涉及到一些复杂的情况。比如有些服务是把数据库外置的，你需要先安装一个 MySQL 的容器，再将两个容器连接在一起。再比如有些服务需要在配置阶段进行一些额外的参数配置，例如用户名、默认密码、时区等信息。

总之，在通过 Docker 部署个人服务这一步上，恭喜你迈出了第一步。

---

[前往标准阅读页](https://utgd.net/article/9835?audience=web)
