我有一个连接到Neo4j数据库的Node.js Web应用程序.我想将这些封装在一个Docker镜像中(也使用Neo4j Docker容器),但我是一个Docker新手,似乎无法解决这个问题.在最新的Docker版本中,推荐的方法是什么?
我的直觉是运行嵌套在 app容器内的Neo4j 容器.但是从我读过的内容来看,我认为支持/推荐的方法是将容器链接在一起.我需要的是在这张图片中很好地说明了.但是图像来自的文章对我来说并不清楚.无论如何,它正在使用即将被弃用的旧容器链接,而这些天推荐使用网络.非常感谢教程或解释.
另外,docker-compose如何适应这一切?
在另一个容器中运行容器意味着在Docker容器中运行Docker引擎.这被称为Docker-in-Docker的dind,我强烈反对它.你可以在线搜索'dind'并发现为什么在大多数情况下这是一个坏主意,但由于它不是你问题的主要对象,我不会进一步扩展这个主题.
虽然大多数人会告诉你不要在Docker容器中运行多个进程,但没有什么能阻止你这样做.如果您想要遵循这条路径,请查看Docker文档网站上的" 使用Supervisor with Docker "或Phusion baseimage Docker镜像.
请注意,这种做事方式会使Docker镜像越来越难以维护.
正如您所发现的那样,保持Docker图像尽可能简单(即:在Docker容器中运行一个且只有一个应用程序)将使您的生活更加轻松.
当两个容器在同一个Docker引擎上运行时,将容器链接在一起是微不足道的.这只是一个问题:
让你的neo4j容器暴露其服务侦听的端口
使用该--link
选项运行node.js容器
在node.js应用程序配置中,将neo4j主机设置为主机
名,docker 将负责将该连接转发到它分配给neo4j容器的IP
如果要在不同的主机上运行这两个容器,事情会变得更加困难.
使用Docker Compose,您必须使用link:
密钥来定义链接
您还发现将来不再支持链接容器,并且使多个Docker容器进行通信的新方法是创建虚拟网络并将这两个容器附加到该网络.
以下是如何继续:
docker network create mynet docker run --detach --name myneo4j --net mynet neo4j docker run --detach --name mynodejs --net mynet
然后,您的节点应用程序配置应该myneo4j
用作要连接的主机.
要告诉Docker Compose使用新的网络功能,您必须使用该--x-networking
选项.你也不会使用links:
密钥.
使用新的网络功能还意味着您将无法为db 定义任何别名.因此,您必须使用容器名称.请注意,除非您使用docker-compose.yml文件中的container_name:
密钥,否则Compose将根据包含docker-compose.yml文件的目录,yml文件中的服务名称和编号创建容器名称.
例如,下面的泊坞窗,compose.yml文件,如果一个名为目录中的"富"将创建两个容器命名foo_web_1
和foo_db_1
:
web: build: . ports: - "8000:8000" db: image: postgres
在开始时docker-compose --x-networking up
,Web应用程序配置应该foo_db_1
用作db主机名.
如果您使用container_name
:
web: build: . ports: - "8000:8000" db: image: postgres container_name: mydb
在开始时docker-compose --x-networking up
,Web应用程序配置应该mydb
用作db主机名.
在这个例子中,我将展示如何使用nodejs和neo4j 从github项目aseemk/node-neo4j-template对示例应用程序进行dockerize.
我假设你已经安装了Docker 1.9.0+和Docker Compose 1.5+.
该项目将使用2个docker容器,一个用于运行neo4j数据库,另一个用于运行nodeJS Web应用程序.
我们需要构建一个Docker镜像,Docker将从该镜像中运行一个容器.为此,我们将编写一个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描述的步骤泊坞窗引擎将纷纷效仿建立一个码头工人像我们的Web应用程序.此泊坞窗图像将:
基于官方节点docker镜像
克隆来自Github的nodeJS示例项目
将工作目录更改为包含git clone的目录
运行该npm install
命令以下载并安装nodeJS应用程序依赖项
指示docker在运行该映像的容器时使用哪个命令
对nodeJS代码的快速回顾表明,作者允许我们使用环境变量配置用于连接到neo4j数据库的URL NEO4J_URL
.
好吧,人们已经为我们照顾好了.我们将使用可以在Docker Hub上找到的neo4j的官方Docker镜像.
快速阅读自述文件告诉我们使用NEO4J_AUTH
环境变量来更改neo4j密码.并将此变量设置为none
将一起禁用身份验证.
在与包含Dockerfile的目录相同的目录中,使用以下内容创建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
此Compose配置文件描述了2个服务:db
和web
.
该db
服务将生成一个以my-neo4j-db
官方neo4j docker镜像命名的容器,并将启动该容器设置NEO4J_AUTH
环境变量none
.
该web
服务将使用从当前目录(build: .
)中找到的Dockerfile构建的docker镜像生成一个以docker命名的容器.这将启动容器设置环境变量NEO4J_URL
来http://my-neo4j-db:7474
(注意,我们怎么会在这里使用的Neo4j容器的名称my-neo4j-db
).此外,docker compose将指示Docker引擎公开docker主机端口上的web
容器3000
端口80
.
确保您位于包含docker-compose.yml文件的目录中,并键入:docker-compose --x-networking up
.
Docker compose将读取docker-compose.yml文件,弄清楚它必须首先为web
服务构建一个docker镜像,然后创建并启动两个容器,最后将为您提供来自两个容器的日志.
日志显示后web_1 | Express server listening at: http://localhost:3000/
,所有内容都已煮熟,您可以将Internet导航器指向http://
.
要停止应用程序,请按Ctrl+ C.
如果要在后台启动应用程序,请docker-compose --x-networking up -d
改用.然后为了显示日志,运行docker-compose logs
.
要停止服务: docker-compose stop
要删除容器: docker-compose rm
官方的neo4j docker image自述文件说容器将数据保存在卷上/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
使用该配置文件,当您运行时docker-compose --x-networking up
,docker compose将创建一个neo4j-data
目录并将其安装到位置的容器中/data
.
创建一个新目录并复制Dockerfile
和docker-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文件的目录中才能启动第二个实例.