无法运行已在使用的 gitlab docker 映像端口

Posted

技术标签:

【中文标题】无法运行已在使用的 gitlab docker 映像端口【英文标题】:Cannot run gitlab docker image ports already in use 【发布时间】:2021-01-01 14:49:33 【问题描述】:

我正在尝试运行 gitlab docker 映像。我遇到了已经在使用的端口的问题。

错误:对于 gitlab_web_1 无法启动服务 web:驱动程序失败 在端点 gitlab_web_1 上编程外部连接 (a22b149b76f705ec3e00c7ec4f6bcad8f0e1b575aba1dbf621c4edcc4d4e5508): 启动用户态代理时出错:listen tcp 0.0.0.0:22: bind: address 已经在使用中

这是我的 docker-compose.yml:

web:
  image: 'gitlab/gitlab-ee:latest'
  restart: always
  hostname: 'gitlab.example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://gitlab.example.com'
      # Add any other gitlab.rb configuration here, each on its own line
  ports:
    - '80:80'
    - '443:443'
    - '22:22'
  volumes:
    - '$GITLAB_HOME/config:/etc/gitlab'
    - '$GITLAB_HOME/logs:/var/log/gitlab'
    - '$GITLAB_HOME/data:/var/opt/gitlab'

我之前对端口 80 和 443 有相同的错误消息。 为了修复它,我从我的服务器中删除了 apache。 但是我需要22端口ssh连接,所以不知道怎么弄出来...

是否可以让 apache 和 docker 容器使用相同的端口运行? 为什么gitlab/gitlab-ee 需要端口22?

【问题讨论】:

1) 不,在一台机器上,每个端口只能被一项服务绑定。如果您需要在同一个端口上提供多个服务,则需要反向代理之类的东西。 2)可能容器提供了通过 ssh 与 git 通信的可能性 ... 好的@derpirscher,但我应该能够在多个子域上使用相同的端口。那么为什么不 www.example.com 使用端口 80/443 用于 web 和 example.com 使用端口 22 用于 ssh,那么 gitlab.example.com 可以使用相同的端口? 您可能会想到一个服务于多个域的 apache 服务器。但这只是一项服务。这只是一个过程。如果您希望主机上的 apache 和容器中的 apache 监听同一个端口,这是不可能的,因为这将是两个服务/进程试图绑定同一个板。 在此处阅读可能的解决方法***.com/q/1694144/3776927 一个非常简单的解决方法(如果它适用于您的情况),无需更改图像的配置,就是进行端口映射,如8443:4438080:802222:22,它将连接端口 8443您的主机到容器中的端口 443。当然,那么每个人都需要使用端口 8443、8080 或 2222 来连接容器。但是您可以通过端口 443、80 和 22 连接到主机。 【参考方案1】:

一位朋友告诉我 traefik 将满足我的需求: https://docs.traefik.io/.

另一种解决方案是在 apache 上根据需要创建尽可能多的 VirtualHost,并将它们重新路由到本地 docker 端口。

【讨论】:

这不是一个好主意,因为 traefik 是 HTTP 的反向代理。另请参阅以下答案:***.com/a/44992424/2056125【参考方案2】:

Gitlab 需要 22 端口,因为它是 ssh 连接的默认端口,用于推送/拉取不同的 repos。

因为这个问题有两种不同的协议,所以它们都有非常不同的解决方案。

SSH 端口

为了解决这个问题,我按照here 的步骤进行操作,该步骤说明了如何更新/etc/gitlab/gitlab.rb 文件,将默认侦听端口更改为您选择的端口(示例中为2289)。

注意,应用更改后,当您克隆存储库时,“使用 SSH 克隆”字符串会更改为包含此自定义端口。

Apache 端口

AFAIK 不可能有两个进程在同一个端口上侦听。因此,我为容器发布了不同的端口(即:8080 和 8443),并使用Apache with a virtual host, and a proxy 使其行为符合用户的期望。这确实假设您可以控制您的 DNS。

这允许我有几个容器都发布不同的端口,而 apache 侦听端口 80/442,并充当这些容器的代理。

【讨论】:

以上是关于无法运行已在使用的 gitlab docker 映像端口的主要内容,如果未能解决你的问题,请参考以下文章

由于设备映射器错误,无法运行 Docker 容器

无法在 Windows 服务器上使用 docker 为 gitlab-ci 运行构建

无法连接到 tcp://localhost:2375/ 上的 Docker 守护程序。 docker 守护进程是不是正在运行。在 GitLab 上

无法在GitLab CI docker-in-docker中对neo4j数据库运行测试

Gitlab CI runner 无法暴露嵌套 Docker 容器的端口

Docker 构建失败 - 带有 GKE 的 Gitlab CI。无法通过 tcp://localhost:2375 连接到 Docker 守护程序。 docker 守护进程是不是正在运行?