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