使用Docker构建应用程序堆栈

时间:2017-01-26 12:12:19

标签: node.js docker

我是Docker的新手,并试图围绕构建应用程序堆栈。

对于使用Nginx,MongoDB和Redis在Linux上运行的Node应用程序,您如何编写堆栈?

在DockerHub上,我可以看到NodeMongoDBRedis的图片,那么您是否需要堆叠中每个组件的图像?

您是否将所有这些链接在Dockerfile中,然后将各个配置设置放在docker-compose.yaml中,如此gist

试图获得一般的想法。

2 个答案:

答案 0 :(得分:3)

Docker的最佳做法是run one process per container,故意难以编写运行多个服务的Dockerfiles。

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'

运行docker-compose up redis的库图片后,nginxmongo将从Docker中心拉出。

然后,它将尝试从与Dockerfile文件相同的目录中的docker-compose.yml构建一个容器。

如果您正在构建节点应用程序,它可能看起来像这样:

FROM node

COPY . /app
RUN npm install
CMD ["npm", "start"]

Docker Compose还配置网络,以便您的每个组合服务都获得映射到容器的IP地址的描述性主机。

例如,如果您从节点应用程序连接到Redis,您将无法在localhost上找到它(因为那是您的容器)。相反,它将在redis:6379

它是为Python编写的,但getting started article非常好。

答案 1 :(得分:2)

使用每个dockerfile,您只构建一个应用程序,将它们基于其他图像确实是一个很好的做法。具体来说,如果要运行节点,则不需要Ubuntu。只需选择official node image作为起点,例如node/6.9

(或者甚至可以查看基于阿尔卑斯山的图像以获得较小的内存占用量。)

如果您需要mysql use mysql:8,如果您需要nginx,请使用nignx:stable

最初的错误之一是制作一个通用"来统治所有容器"。初学者喜欢在Ubuntu上建立映像,然后通过apt-get或运行安装脚本安装所有工具。这是太多的体力劳动。

虽然有时仍需要对图像进行微调,但通过使用特定图像作为起点,您可以从码头生态系统中获益更多。通常,仅通过环境变量配置图像容器就足够了。

仅使用docker进行链接可能相当困难。 docker-compose不是构建堆栈的必要工具,但却是一个方便的工具。

将容器链接在一起不会发生在Dockerfile中,而是发生在docker-compose.yml中。

docker-compose是一个工具,用于协调整个堆栈并链接不同的图像,无论是构建还是仅拉动。它是如何让你的nginx和nodejs图像相互通信的。