在 macOS Mojave 上 Docker 无法映射端口的解决方案

110次阅读
没有评论

问题描述

在 macOS Mojave 上使用 brew 安装了 Docker、docker-machine 和 docker-compose。一切运行正常,但是在使用 expose 命令将端口映射到主机时却无法正常工作。用户在 docker-machine 内部使用 ssh 进入时,服务在 docker-machine 内部正常运行,但在外部却没有响应。用户的软件版本如下:

  • Docker 版本:18.09.5,构建编号 e8ff056
  • docker-machine 版本:0.16.1,构建编号 cce350d
  • docker-compose 版本:1.24.0
  • 使用 xhyve 进行虚拟化

用户的 Dockerfile 如下:

FROM node
LABEL maintainer xyz@gmail.com
RUN git clone -q https://github.com/docker-in-practice/todo.git
WORKDIR todo
RUN npm install > /dev/null
EXPOSE 8000
CMD ["npm", "start"]

用户使用以下命令运行 Docker 容器:

docker run -i -t -p 8000:8000 --name example1 todoapp

用户已经阅读了很多文章,注意到 Docker 和 macOS 相关的问题,但不确定如何解决。用户由于系统资源限制,不使用 macOS Docker 应用程序。用户还尝试使用 sudo 命令来运行 Docker,但出现了以下错误:

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

用户认为只有当端口低于1000时才需要使用 sudo 命令,而端口8000不需要使用 sudo。

解决方案

请注意以下操作可能因版本差异而有所不同。如果你遇到任何问题,请备份你的数据并小心操作。

方案1:使用 Docker Machine 的 IP 地址连接
1. 首先,通过运行以下命令获取 Docker Machine 的 IP 地址:
bash
docker-machine ls

或者查看环境变量 DOCKER_HOST,其中包含 Docker Machine 的 IP 地址。
2. 使用获取到的 IP 地址,连接到端口8000,以访问你的应用程序。

方案2:直接使用 Docker.app
如果你安装 Docker 的方式是通过官方的 Docker.app 而不是使用 brew,最新的 Docker 版本已经支持在 xhyve 虚拟化环境中运行,并且使用了基于 LinuxKit 的虚拟机,这使得虚拟化环境更加透明,你很难意识到你是在虚拟机中。

在使用 Docker.app 运行容器时,它会将端口直接映射到你的主机上,避免了一些网络问题。因此,如果可能,建议你尝试使用 Docker.app 来运行容器,以获得更好的映射和性能体验。

以上解决方案中的操作可能因不同版本和环境而有所不同。请谨慎操作,确保你已经备份了重要数据。如果你遇到问题,可以参考 Docker 和相关工具的官方文档,或者寻求技术支持。

正文完