# Docker Registry for a secondary node

> 原文：[https://docs.gitlab.com/ee/administration/geo/replication/docker_registry.html](https://docs.gitlab.com/ee/administration/geo/replication/docker_registry.html)

*   [Storage support](#storage-support)
*   [Replicating Docker Registry](#replicating-docker-registry)
    *   [Configure **primary** node](#configure-primary-node)
    *   [Configure **secondary** node](#configure-secondary-node)
    *   [Verify replication](#verify-replication)

# Docker Registry for a secondary node[](#docker-registry-for-a-secondary-node-premium-only "Permalink")

您可以在**次要** Geo 节点上设置一个[Docker Registry](https://s0docs0docker0com.icopy.site/registry/) ，以镜像**主** Geo 节点上的[Docker Registry](https://s0docs0docker0com.icopy.site/registry/) .

## Storage support[](#storage-support "Permalink")

Docker Registry 当前支持几种类型的存储. 如果您在**主**节点上为 Docker 注册表选择分布式存储（ `azure` ， `gcs` ， `s3` ， `swift`或`oss` ），则也可以将相同的存储用于**辅助** Docker 注册表. 有关更多信息，请阅读部署注册表时的[负载平衡注意事项](https://s0docs0docker0com.icopy.site/registry/deploying/) ，以及如何为 GitLab 的集成[Container Registry](../../packages/container_registry.html#use-object-storage)设置存储驱动程序.

## Replicating Docker Registry[](#replicating-docker-registry "Permalink")

您可以启用与存储无关的复制，以便将其用于云或本地存储. 每当将新映像推送到**主**节点时，每个**辅助**节点都会将其拖到其自己的容器存储库中.

要配置 Docker Registry 复制：

1.  配置[**主**节点](#configure-primary-node) .
2.  配置[**辅助**节点](#configure-secondary-node) .
3.  验证 Docker Registry [复制](#verify-replication) .

### Configure **primary** node[](#configure-primary-node "Permalink")

在执行下一步之前，请确保已设置 Container Registry 并在**主**节点上工作.

我们需要使 Docker Registry 将通知事件发送到**主**节点.

1.  SSH 到您的 GitLab **主**服务器并以 root 用户身份登录：

    ```
    sudo -i 
    ```

2.  Edit `/etc/gitlab/gitlab.rb`:

    ```
    registry['notifications'] = [
      {
        'name' => 'geo_event',
        'url' => 'https://example.com/api/v4/container_registry_event/events',
        'timeout' => '500ms',
        'threshold' => 5,
        'backoff' => '1s',
        'headers' => {
          'Authorization' => ['<replace_with_a_secret_token>']
        }
      }
    ] 
    ```

    **注意：**将`<replace_with_a_secret_token>`替换为以字母开头的区分大小写的字母数字字符串. 您可以使用`< /dev/urandom tr -dc _A-Zaz-0-9 | head -c 32 | sed "s/^[0-9]*//"; echo`生成一个`< /dev/urandom tr -dc _A-Zaz-0-9 | head -c 32 | sed "s/^[0-9]*//"; echo` `< /dev/urandom tr -dc _A-Zaz-0-9 | head -c 32 | sed "s/^[0-9]*//"; echo`**注意：**如果使用外部注册表（而不是与 GitLab 集成的注册表），则必须将这些设置自己添加到其配置中. 在这种情况下，您还必须在`/etc/gitlab/gitlab.rb`文件的`registry.notification_secret`部分中指定通知密钥.**注意：**如果使用 GitLab HA，则还必须在`/etc/gitlab/gitlab.rb`文件的`registry.notification_secret`部分中为每个 Web 节点指定通知密钥.
3.  重新配置**主**节点以使更改生效：

    ```
    gitlab-ctl reconfigure 
    ```

### Configure **secondary** node[](#configure-secondary-node "Permalink")

Make sure you have Container Registry set up and working on the **secondary** node before following the next steps.

在希望看到复制的 Docker 映像的每个**辅助**节点上，应执行以下步骤.

因为我们需要允许**辅助**节点与**主**节点容器注册表安全通信，所以我们需要为所有节点使用单个密钥对. **辅助**节点将使用此密钥来生成短暂的 JWT，该 JWT 具有仅拉功能，可以访问**主**节点 Container Registry.

1.  SSH 进入**辅助**节点并以`root`用户身份登录：

    ```
    sudo -i 
    ```

2.  将`/var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key`从**主**节点复制到**辅助**节点.

3.  Edit `/etc/gitlab/gitlab.rb`:

    ```
    gitlab_rails['geo_registry_replication_enabled'] = true
    gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://primary.example.com:5050/' # Primary registry address, it will be used by the secondary node to directly communicate to primary registry 
    ```

4.  重新配置**辅助**节点以使更改生效：

    ```
    gitlab-ctl reconfigure 
    ```

### Verify replication[](#verify-replication "Permalink")

要验证 Container Registry 复制是否正常工作，请转到 **管理区>** **辅助**节点上的**地理位置** （ `/admin/geo/nodes` ）. 初始复制或"回填"可能仍在进行中. 您可以从浏览器中**主**节点的" **地理节点"**仪表板监视每个地理节点上的同步过程.