问题描述
在 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 和相关工具的官方文档,或者寻求技术支持。