如何链接多个Docker容器并封装结果?

我有一个连接到Neo4j数据库的Node.js Web应用程序。 我想将这些封装在一个Docker镜像中(也使用一个Neo4j Docker容器 ),但是我是一个docker新手,似乎无法弄清楚这一点。 在最新的Docker版本中推荐使用的方法是什么?

我的直觉是运行嵌套在应用程序容器的Neo4j容器。 但从我读到的,我认为支持/推荐的方法是将容器连接在一起。 我需要的是在这个图像中很好的说明。 但是图片来源的文章对我并不清楚。 无论如何,它正在使用即将被弃用的遗留容器链接 ,而现在推荐使用networking 。 教程或解释将不胜感激。

另外, docker-compose如何适应这一切?

在另一个容器中运行容器意味着在Docker容器中运行Docker引擎 。 这被引用为Docker-in-Docker中的dind ,我强烈build议不要这样做 。 你可以在线search“dind”,并发现为什么在大多数情况下这是一个坏主意,但因为它不是你的问题的主要对象,我不会再延伸这个问题。

在同一个容器中同时运行node.js进程和neo4j进程

虽然大多数人会告诉你不要在Docker容器中运行多个进程,但是没有什么能够阻止你这么做。 如果你想遵循这个path,请看Docker文档网站上的使用Supervisor和 Docker镜像,或者在Phusion的baseimage Docker镜像上看看 。

只要意识到这种做事方式会使你的Docker映像越来越难保持一段时间。

链接容器

正如你发现的,保持Docker镜像尽可能简单(即:在Docker容器中只运行一个应用程序)将使你的生活更容易。

当两个容器在相同的Docker引擎上运行时,将容器链接在一起并不重要。 这只是一个问题:

  • 让你的neo4j容器暴露其服务侦听的端口
  • 使用--link <neo4j container name>:<alias>选项运行node.js容器
  • 在node.js应用程序configuration中,将neo4j主机设置为<alias>主机名,docker将负责将该连接转发给分配给neo4j容器的IP

当你想在不同的主机上运行这两个容器时,情况会变得更加困难。

使用Docker Compose,您必须使用link:键来定义您的链接

新的Dockernetworkingfunction

您还发现将来不会支持链接容器,并且创build多个Docker容器的新方法是创build一个虚拟networking并将这两个容器连接到该networking。

以下是如何继续:

 docker network create mynet docker run --detach --name myneo4j --net mynet neo4j docker run --detach --name mynodejs --net mynet <your nodejs image> 

然后,您的节点应用程序configuration应该使用myneo4j作为连接到的主机。

为了让Docker Compose使用新的networkingfunction,您必须使用--x-networking选项。 你也不会使用links:键。

使用新的networkingfunction也意味着你将无法为数据库定义任何别名 。 结果你必须使用容器名称 。 请注意,除非在docker-compose.yml文件中使用container_name:键,否则Compose将根据包含docker-compose.yml文件的目录,在yml文件中find的服务名称和一个数字来创build容器名称。

例如,以下docker-compose.yml文件(如果在名为“foo”的目录中)将创build两个名为foo_web_1foo_db_1容器:

 web: build: . ports: - "8000:8000" db: image: postgres 

当用docker-compose --x-networking up ,web应用configuration应该使用foo_db_1作为db主机名。

而如果你使用container_name

 web: build: . ports: - "8000:8000" db: image: postgres container_name: mydb 

当用docker-compose --x-networking up ,web应用configuration应该使用mydb作为db主机名。


使用Docker Compose使用nodeJS和neo4j运行Web应用程序的示例

在这个例子中,我将展示如何使用nodejs和neo4j对来自github项目aseemk / node-neo4j-template的示例应用程序进行dockerize。

我假设你已经安装了Docker 1.9.0+和Docker Compose 1.5+。

这个项目将使用2个docker容器,一个运行neo4j数据库,一个运行nodeJS web应用程序。

Docker化Web应用程序

我们需要构build一个Docker镜像 ,Docker将从这个镜像中运行一个容器。 为此,我们将编写一个Dockerfile

用以下内容创build一个名为Dockerfile的文件(介意大写Dockerfile D ):

 FROM node RUN git clone https://github.com/aseemk/node-neo4j-template.git WORKDIR /node-neo4j-template RUN npm install # ugly 20s sleep to wait for neo4j to initialize CMD sleep 20s && node app.js 

这个Dockerfile描述了Docker引擎必须遵循的步骤来为我们的Web应用程序构build Docker 镜像 。 这个docker的形象将:

  • 基于官方节点泊坞窗的形象
  • 从Github中克隆nodeJS示例项目
  • 将工作目录更改为包含git克隆的目录
  • 运行npm install命令来下载并安装nodeJS应用程序依赖项
  • 指导docker在运行该映像的容器时使用的命令

对nodeJS代码的快速回顾显示,作者允许我们使用NEO4J_URL环境variables来configurationURL以连接到neo4j数据库 。

Docker化neo4j数据库

那么人们已经为我们照顾了。 我们将使用Docker Hub上可以find的neo4j官方Docker镜像 。

自述文件的快速回顾告诉我们使用NEO4J_AUTH环境variables来更改neo4j密码。 将这个variables设置为none将一起禁用authentication。

设置Docker撰写

在与包含我们的Dockerfile的目录相同的目录中,使用以下内容创build一个docker-compose.yml文件:

 db: container_name: my-neo4j-db image: neo4j environment: NEO4J_AUTH: none web: build: . environment: NEO4J_URL: http://my-neo4j-db:7474 ports: - 80:3000 

这个Composeconfiguration文件描述了2个服务: dbweb

db服务将从官方的neo4j docker镜像产生一个名为my-neo4j-db的容器,并启动该容器,将NEO4J_AUTH环境variables设置为none

web服务将生成一个在docker中命名的容器,使用从当前目录build: . :。)中find的Dockerfile构build的docker镜像组合自行决定。 它会启动该容器,将环境variablesNEO4J_URL设置为http://my-neo4j-db:7474 (注意我们在这里如何使用neo4j容器的名称my-neo4j-db )。 此外,docker compose将指示Docker引擎在Docker主机端口80上公开web容器的端口3000

射击它

确保你在包含docker-compose.yml文件的目录中,input: docker docker-compose --x-networking up

Docker compose将读取docker-compose.yml文件,找出它必须首先为web服务构build一个docker镜像,然后创build并启动这两个容器,最后将为这两个容器提供日志。

一旦日志显示web_1 | Express server listening at: http://localhost:3000/ web_1 | Express server listening at: http://localhost:3000/ ,一切都已经完成,您可以将您的Internet导航器指向http://<ip of the docker host>/

要停止应用程序,请按Ctrl + C。

如果您想在后台启动应用程序,请改为使用docker-compose --x-networking up -d 。 然后为了显示日志,运行docker-compose logs

停止服务: docker-compose stop

要删除容器: docker-compose rm

使neo4j存储持久

官方的neo4j docker镜像自述文件说容器将数据保存在/data的卷上。 然后,我们需要指示Docker Compose将该卷挂载到docker主机上的一个目录中。

使用以下内容更改docker-compose.yml文件:

 db: container_name: my-neo4j-db image: neo4j environment: NEO4J_AUTH: none volumes: - ./neo4j-data:/data web: build: . environment: NEO4J_URL: http://my-neo4j-db:7474 ports: - 80:3000 

使用该configuration文件,当您运行neo4j-data compose neo4j-data docker-compose --x-networking upneo4j-data compose将创build一个neo4j-data目录,并将其安装到位于/data的容器中。

开始应用程序的第二个实例

创build一个新目录并复制Dockerfiledocker-compose.yml文件。

然后,我们需要编辑docker-compose.yml文件,以避免neo4j容器的名称冲突和docker主机上的端口冲突。

将其内容更改为:

 db: container_name: my-neo4j-db2 image: neo4j environment: NEO4J_AUTH: none volumes: - ./neo4j-data:/data web: build: . environment: NEO4J_URL: http://my-neo4j-db2:7474 ports: - 81:3000 

现在已经准备好了docker-compose --x-networking up命令。 请注意,您必须位于具有新docker-compose.yml文件的目录中才能启动第二个实例。

Interesting Posts