首页 > 解决方案 > 无法访问 Docker 容器

问题描述

我在 Ubuntu 16.04 VM 上安装了 docker,我正在使用 nodejs 开发一个个人项目,而 Docker 映像来自 DockerFile。容器运行,但是当我尝试使用 VP'm 公共 IP 访问它时,它无法访问。我试图卷曲,我得到 curl: (52) 来自服务器的空回复。在花了很长时间之后。端口映射正确,也没有防火墙问题。这是我的码头文件

FROM node:10.13-alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN apk update && apk upgrade \
        && apk add --no-cache git \
        && apk --no-cache add --virtual builds-deps build-base python \
        && npm install -g nodemon cross-env eslint npm-run-all node-gyp 
           node-pre-gyp && npm install\
        && npm rebuild bcrypt --build-from-source
RUN npm install --production --silent && mv node_modules ../
COPY . .
RUN pwd
EXPOSE 3001
CMD npm start

码头工人ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             
STATUS              PORTS                    NAMES
8588419b40c4        xxx:v1             "/bin/sh -c 'npm sta…"   2 days ago          
Up 2 days           0.0.0.0:3000->3001/tcp   youthful_roentgen

标签: node.jsdockerdocker-composedockerfile

解决方案


xxx:v1成为Dockerfile您提供的图像名称。

如果您想通过主机 ( curl localhost:3001) 访问您的应用程序,那么您应该运行:

docker run -p 3001:3000 xxx:v1

3000此命令将容器中的端口绑定到3001主机上的端口(IIRC,3000是 使用的默认端口npm start)。

localhost:3001 然后,您应该能够使用curl.

请注意,运行时 中EXPOSE的指令Dockerfile不会自动公开端口docker run。这只是一个指示,表明您的容器正在侦听您的端口EXPOSE。在这里,你的EXPOSE指令是错误的,你应该写:

EXPOSE 3000

因为容器中只公开了 3000 端口(3000是使用的默认端口npm)。您选择在主机上绑定(或不绑定)的端口仅在运行时指定。

如果您不想通过 访问您的应用程序localhost,而只想通过容器的 IP,则无需绑定端口(否-p)。你只需curl <container_ip>:3000要从你的主机做。


推荐阅读