如何在 Apache httpd 后面公开 Docker-Registry?

Posted

技术标签:

【中文标题】如何在 Apache httpd 后面公开 Docker-Registry?【英文标题】:How to expose Docker-Registry behind Apache httpd? 【发布时间】:2019-03-25 03:17:15 【问题描述】:

我正在使用以下 docker-compose.yml 文件运行私有 docker-registry v2:

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/server-cert.pem
    REGISTRY_HTTP_TLS_KEY: /certs/server-key.pem
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /data/docker-registry:/var/lib/registry
    - /certs/docker-registry:/certs
    - /auth/docker-registry:/auth

我可以通过 http://localhost:5000 进行本地登录(SSH、Jenkins、...)。

现在我想用 Apache httpd 公开这个注册表。 我在 CentOS 7 上运行以下版本的 httpd:

[root@dev-machine conf.d]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Jun 27 2018 13:48:59

这是我的 vhosts.conf

<VirtualHost *:443>
    ServerName dev-machine.com
    ServerAlias www.dev-machine.com

    ErrorLog logs/dev-machine.com-error_log
    CustomLog logs/dev-machine.com-access_log common

    SSLEngine on
    SSLCertificateFile /certs/docker-registry/server-cert.pem
    SSLCertificateKeyFile /certs/docker-registry/server-key.pem

    Header set Host "dev-machine.com"
    Header set "Docker-Distribution-Api-Version" "registry/2.0"
    RequestHeader set X-Forwarded-Proto "https"

    ProxyRequests off
    ProxyPreserveHost on

    ProxyPass           /registry       http://127.0.0.1:5000/
    ProxyPassReverse    /registry       http://127.0.0.1:5000/

    <Location /registry>
        Order deny,allow
        Allow from all

        AuthName "Registry Authentication"
        AuthType basic
        AuthUserFile "/auth/htpasswd"
        Require valid-user
    </Location>
</VirtualHost>

我面临的问题是,当我尝试登录注册表时出现以下错误:

izio@1z10:~$ docker login https://dev-machine.com/registry
Username: user
Password: 
Error response from daemon: login attempt to https://dev-machine/v2/ failed with status: 404 Not Found

似乎重定向到 /v2 而不是使用虚拟主机中分配的 url。此配置有什么遗漏或错误?

【问题讨论】:

也许它很容易使用 nginx 而不是 apache 这会不会造成问题,因为现在它都落后于 Apache,而且我可以使用的唯一端口是 80 和 443? @IjazAhmadKhan 在 apache 中也很容易。另请注意,带有multi-threaded mpm 的 apache 性能非常好(我没有基准,但我怀疑它可能比 nginx 更好)。 这个配置还能用吗?我尝试进行相同的配置,但无论我做什么,我都无法使用 /v2 以外的别名。 【参考方案1】:

像这样更新你的 httpd.conf

ProxyPass /registry http://127.0.0.1:5000/v2 ProxyPassReverse /registry http://127.0.0.1:5000/v2

【讨论】:

以上是关于如何在 Apache httpd 后面公开 Docker-Registry?的主要内容,如果未能解决你的问题,请参考以下文章

Apache httpd拒绝服务漏洞(CVE-2017-7659)利用方式公开 创宇盾无需升级即可防护

apache httpd端口8009后面的Docker tomcat未连接

Apache2 HTTPD(v2.4.23)后面的Tomcat(v7.0.47):Java升级后连接失败

httpd.conf文件夹在哪里,需要apache 配置完httpd.conf

windows linux如何安装多个apache

webserver / apache webdav / apache httpd