我有一个非常简单的应用程序,它返回“Hello World”字符串,它在本地运行良好。正如你将从下面的应用程序代码中看到的,它在端口4000
上运行。当我创建docker镜像并运行容器时,我无法从机器上的localhost:4000
访问它,但我可以看到docker正确地获得了node index.js
命令,应用程序正在运行,没有任何错误。
我还尝试将其部署到Kubernetes集群,当我访问负载均衡器ip时,我得到ERR_EMPTY_RESPONSE
。通过kubectl
检查此应用程序后,我可以看到一切运行正常,镜像已下载,Pod正在运行。
我很难理解我错过了什么,为什么它只在本地工作。
NodeJS应用
import fastify from 'fastify';
const server = fastify();
server.get('/', (_request, reply) => {
reply.status(200).send("Hello World");
});
server.listen(4000, error => {
if (error) {
process.exit(1);
}
});
Dockerfile
FROM node:14.2-alpine
WORKDIR /app
COPY package.json yarn.lock /app/
RUN yarn
COPY . .
EXPOSE 4000
CMD ["node", "index.js"]
Kubernetes清单
---
# Load balancer
apiVersion: v1
kind: Service
metadata:
name: development-actions-lb
annotations:
service.beta.kubernetes.io/do-loadbalancer-name: "development-actions-lb"
service.beta.kubernetes.io/do-loadbalancer-algorithm: "round_robin"
spec:
type: LoadBalancer
selector:
app: development-actions
ports:
- name: http
protocol: TCP
port: 80
targetPort: 4000
---
# Actions deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: development-actions
spec:
replicas: 1
selector:
matchLabels:
app: development-actions
template:
metadata:
labels:
app: development-actions
spec:
containers:
- image: registry.digitalocean.com/myapp/my-image:latest
name: development-actions
ports:
- containerPort: 4000
protocol: TCP
imagePullSecrets:
- name: registry-myapp
2条答案
按热度按时间t1rydlwq1#
首先,当我尝试你的代码时,我使用本地docker尝试它,但行为是一样的,所以我希望它是因为默认情况下
fastify
只监听localhost
。在Docker内部,你应该明确提到
'0.0.0.0'
,因为默认情况下fastify
只监听localhost 127.0.0.1
接口。要监听所有可用的IPv4接口,应该修改示例以监听0.0.0.0
,如下所示:其余的应该是相同的。要在本地尝试,您可以使用以下命令:
参考文献:
r7xajy2e2#
如果你是在2023年之后阅读这篇文章的,说明API已经改变了。试试: