解决 Docker Compose 启动容器报错 “Error starting userland proxy: listen tcp 0.0.0.0:22: bind: address already in use”

44次阅读
没有评论

问题描述

在使用 Docker Compose 在 macOS 上运行 gitlab/gitlab-ce 镜像时,执行 docker-compose up -d 命令启动容器时出现以下错误:

ERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint gitlab-docker_web_1 (236233cf090b94f98e2e82c2fa795bc7f6f5ff38e2ea14f3649e87313a21d196): Error starting userland proxy: listen tcp 0.0.0.0:22: bind: address already in use
ERROR: Encountered errors while bringing up the project.

用户在主机上没有找到占用端口 22 的进程。

解决方案

请注意以下操作可能涉及版本差异,请谨慎操作,并在执行前备份数据。

这个问题可能是由于 macOS 上的 Docker Compose 实际上在虚拟机中运行,而在该虚拟机中的 Linux 内核和 dockerd 进程在监听端口 22,用于 SSH 访问。以下是两种解决方案,你可以根据实际情况选择。

方案1:修改虚拟机绑定端口

  1. 停止已经运行的 Docker Compose 项目:
    bash
    docker-compose down

  2. 使用以下命令停止虚拟机的 SSH 服务:
    bash
    docker-machine ssh your-machine-name sudo systemctl stop sshd.service

  3. 编辑虚拟机的配置文件,添加对应的端口绑定配置。将虚拟机的端口 22 绑定到主机的端口 2222,以便在主机上避免端口冲突。运行以下命令编辑虚拟机配置文件:
    bash
    docker-machine ssh your-machine-name sudo vi /var/lib/boot2docker/profile

  4. 在配置文件中添加以下内容:
    EXTRA_ARGS="--host=tcp://0.0.0.0:2376 --tls-san=<your-machine-name> -H=unix:///var/run/docker.sock -H=tcp://0.0.0.0:2376 -H=tcp://0.0.0.0:12376"
    DOCKER_HOST='-H tcp://0.0.0.0:2376'
    DOCKER_TLS_VERIFY="1"
    DOCKER_CERT_PATH="/mnt/sda1/var/lib/boot2docker/tls/<your-machine-name>"
    SSH_PORT=2222

  5. 保存并退出编辑。

  6. 重新启动虚拟机:
    bash
    docker-machine restart your-machine-name

  7. 确认虚拟机的 SSH 服务已经停止,Docker 守护进程已经使用了新的端口配置。

  8. 在 Docker Compose 项目目录中,运行以下命令重新启动项目:
    bash
    docker-compose up -d

方案2:更换端口

如果你不打算使用虚拟机上的 SSH 访问,你也可以考虑将 Docker Compose 项目中的 SSH 端口更改为其他端口。

  1. 打开你的 docker-compose.yml 文件。

  2. 将 SSH 端口(默认是 22)更改为其他未被占用的端口,比如 2222:
    “`yaml
    ports:

    • “80:80”
    • “443:443”
    • “2222:22” # 更改这一行的端口号
      “`
  3. 保存并关闭文件。

  4. 在 Docker Compose 项目目录中,运行以下命令重新启动项目:
    bash
    docker-compose up -d

请注意,方案2 更改了容器的端口映射,但仍然会在主机上占用端口 22,如果以后有其他需要使用端口 22 的情况,请考虑方案1。

注意事项

  • 在执行任何更改之前,请确保备份了所有重要的数据和配置。
  • 在修改虚拟机配置时,要小心不要破坏虚拟机的正常运行。
  • 更改端口映射后,你可能需要使用新的端口来访问服务(例如 SSH 访问)。

提示:以上解决方案是基于问题描述和现有的问答数据提供的,实际操作中可能会因环境和版本差异有所不同。在操作之前,请确保充分了解相关技术,并谨慎处理。

正文完