我在Ubuntu 16.04 VM上安装了docker,并且我正在使用nodejs进行个人项目,并且Docker映像来自DockerFile。 容器运行,但是当我尝试使用VP的公共IP访问它时,它是不可访问的。 我试图卷曲,但我卷曲了:(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
docker 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
答案 0 :(得分:0)
让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
d端口上监听。在这里,您的EXPOSE
指令是错误的,您应该这样写:
EXPOSE 3000
因为在容器中仅暴露了端口3000 (3000
是npm
使用的默认端口)。您选择在主机上绑定(或不绑定)的端口仅在运行时指定。
如果您不想通过localhost
来访问应用程序,而只希望通过容器的IP来访问,则无需绑定端口(不需要-p
)。您只需要从主机执行curl <container_ip>:3000
。