Node.js 使用Docker构建应用程序堆栈
我是一名码头工人新手,正在努力构建一个应用程序堆栈 对于使用Nginx、MongoDB和Redis在Linux上运行的节点应用程序,如何组合堆栈 在DockerHub上,我可以看到的图像,所以堆栈中的每个组件都需要一个图像吗 您是否将所有这些链接在Dockerfile中,然后像这样将各个配置设置放在docker-compose.yaml中Node.js 使用Docker构建应用程序堆栈,node.js,docker,Node.js,Docker,我是一名码头工人新手,正在努力构建一个应用程序堆栈 对于使用Nginx、MongoDB和Redis在Linux上运行的节点应用程序,如何组合堆栈 在DockerHub上,我可以看到的图像,所以堆栈中的每个组件都需要一个图像吗 您是否将所有这些链接在Dockerfile中,然后像这样将各个配置设置放在docker-compose.yaml中 只是想了解一下大概情况。Docker的最佳实践是,故意让编写运行多个服务的DockerFile变得困难 Docker Compose通过为您提供运行多个容器(
只是想了解一下大概情况。Docker的最佳实践是,故意让编写运行多个服务的DockerFile变得困难 Docker Compose通过为您提供运行多个容器(每个容器运行一个服务)而不是运行多个服务的单个容器所需的工具来解决此问题 您可以使用Compose设置如下堆栈:
version: '2'
services:
redis:
image: 'redis'
ports:
- '6379:6379'
nginx:
image: 'nginx'
ports:
- '80:80'
mongodb:
image: 'mongo'
ports:
- '27017:27017'
app:
build: .
ports:
- '3000:3000'
FROM node
COPY . /app
RUN npm install
CMD ["npm", "start"]
运行docker compose后
的库图像,并将从docker hub中提取
然后,它将尝试从Dockerfile
中构建一个容器,该文件与您的docker compose.yml
文件位于同一目录中
如果您正在构建一个节点应用程序,它可能如下所示:
version: '2'
services:
redis:
image: 'redis'
ports:
- '6379:6379'
nginx:
image: 'nginx'
ports:
- '80:80'
mongodb:
image: 'mongo'
ports:
- '27017:27017'
app:
build: .
ports:
- '3000:3000'
FROM node
COPY . /app
RUN npm install
CMD ["npm", "start"]
Docker Compose还配置网络,以便您的每个组合服务都获得映射到容器ip地址的描述性主机
例如,如果您从节点应用程序连接到Redis,您将不会发现它在localhost
上运行(因为那是您的容器)。相反,它将位于redis:6379
它是为Python编写的,但是非常好。对于每个dockerfile,您只需构建一个应用程序,并且基于其他图像确实是一个很好的实践。具体来说,如果你想运行node,你不需要Ubuntu。只需选择作为起点,例如
节点/6.9
(甚至可以查看基于alpine的图像以获得较小的内存占用。)
如果您需要mysql,如果您需要nginx,请使用
第一个错误之一是使用一个通用的“将它们全部规则化”容器。初学者喜欢将图像建立在Ubuntu上,然后通过apt-get
或运行安装脚本来安装所有工具。这是太多的体力劳动了
虽然有时仍有必要对图像进行微调,但通过使用特定图像作为起点,您可以从docker生态系统中获得更多好处。通常,仅通过环境变量配置映像的容器就足够了
仅使用docker
链接是可能的,但相当困难。docker compose不是构建堆栈的必要工具,但却是一个方便的工具
将容器链接在一起不会发生在Dockerfile
中,而是发生在docker compose.yml
中
docker compose是一种工具,用于编排整个堆栈,并将不同的图像链接在一起,这些图像可以是构建的,也可以是拉到一起的。这是如何让您的nginx和nodejs图像相互对话。我在周末一直在玩这个,并且取得了良好的进展。看起来最难的部分是为您的特定用例找到最好的图像,并将其绑定到docker compose文件中。谢谢您的解释。我能够使用Node、Nginx、Redis和Mongo使用docker-compose.yaml构建一个堆栈。这不是100%没有麻烦,但经过一些尝试和错误,我得到了堆栈运行。