问题描述
在使用 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:修改虚拟机绑定端口
-
停止已经运行的 Docker Compose 项目:
bash
docker-compose down -
使用以下命令停止虚拟机的 SSH 服务:
bash
docker-machine ssh your-machine-name sudo systemctl stop sshd.service -
编辑虚拟机的配置文件,添加对应的端口绑定配置。将虚拟机的端口 22 绑定到主机的端口 2222,以便在主机上避免端口冲突。运行以下命令编辑虚拟机配置文件:
bash
docker-machine ssh your-machine-name sudo vi /var/lib/boot2docker/profile -
在配置文件中添加以下内容:
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 -
保存并退出编辑。
-
重新启动虚拟机:
bash
docker-machine restart your-machine-name -
确认虚拟机的 SSH 服务已经停止,Docker 守护进程已经使用了新的端口配置。
-
在 Docker Compose 项目目录中,运行以下命令重新启动项目:
bash
docker-compose up -d
方案2:更换端口
如果你不打算使用虚拟机上的 SSH 访问,你也可以考虑将 Docker Compose 项目中的 SSH 端口更改为其他端口。
-
打开你的
docker-compose.yml
文件。 -
将 SSH 端口(默认是 22)更改为其他未被占用的端口,比如 2222:
“`yaml
ports:- “80:80”
- “443:443”
- “2222:22” # 更改这一行的端口号
“`
-
保存并关闭文件。
-
在 Docker Compose 项目目录中,运行以下命令重新启动项目:
bash
docker-compose up -d
请注意,方案2 更改了容器的端口映射,但仍然会在主机上占用端口 22,如果以后有其他需要使用端口 22 的情况,请考虑方案1。
注意事项
- 在执行任何更改之前,请确保备份了所有重要的数据和配置。
- 在修改虚拟机配置时,要小心不要破坏虚拟机的正常运行。
- 更改端口映射后,你可能需要使用新的端口来访问服务(例如 SSH 访问)。
提示:以上解决方案是基于问题描述和现有的问答数据提供的,实际操作中可能会因环境和版本差异有所不同。在操作之前,请确保充分了解相关技术,并谨慎处理。