在另一个容器中运行容器意味着在Docker容器中运行Docker引擎.这被称为Docker-in-Docker的dind,我强烈反对它.你可以在线搜索’dind’并发现为什么在大多数情况下这是一个坏主意,但由于它不是你问题的主要对象,我不会进一步扩展这个主题.
在同一容器中运行node.js进程和neo4j进程
虽然大多数人会告诉你不要在Docker容器中运行多个进程,但没有什么能阻止你这样做.如果您想要遵循此路径,请查看Docker文档网站上的Using Supervisor with Docker或Phusion baseimage Docker镜像.
请注意,这种做事方式会使Docker镜像越来越难以维护.
链接容器
正如您所发现的那样,保持Docker图像尽可能简单(即:在Docker容器中运行一个且只有一个应用程序)将使您的生活更加轻松.
当两个容器在同一个Docker引擎上运行时,将容器链接在一起是微不足道的.这只是一个问题:
>让你的neo4j容器expose服务器监听它的端口
>使用–link< neo4j容器名称>运行node.js容器:< alias>选项
>在node.js应用程序配置中,将neo4j主机设置为< alias> hostname,docker将负责将该连接转发到它分配给neo4j容器的IP
如果要在不同的主机上运行这两个容器,事情会变得更加困难.
使用Docker Compose,您必须使用link:键来定义链接
新的Docker网络功能
您还发现将来不再支持链接容器,并且使多个Docker容器进行通信的新方法是创建虚拟网络并将这两个容器附加到该网络.
以下是如何继续:
docker network create mynet
docker run --detach --name myneo4j --net mynet neo4j
docker run --detach --name mynodejs --net mynet
然后,您的节点应用程序配置应使用myneo4??j作为要连接的主机.
要告诉Docker Compose使用新的网络功能,您必须使用--x-networking选项.你也不会使用链接:key.
使用新的网络功能还意味着您将无法为db定义任何别名.因此,您必须使用容器名称.请注意,除非您在docker-compose.yml文件中使用container_name:密钥,否则Compose将根据包含docker-compose.yml文件的目录,yml文件中的服务名称和编号创建容器名称.
例如,以下docker-compose.yml文件,如果在名为“foo”的目录中,将创建两个名为foo_web_1和foo_db_1的容器:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
当使用docker-compose –x-networking启动时,Web应用程序配置应该使用foo_db_1作为db主机名.
如果您使用container_name:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
container_name: mydb
当使用docker-compose -x-networking启动时,Web应用程序配置应该使用mydb作为db主机名.
使用Docker Compose使用nodeJS和neo4j运行Web应用程序的示例
该项目将使用2个docker容器,一个用于运行neo4j数据库,另一个用于运行nodeJS Web应用程序.
Docker化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引擎为我们的Web应用程序构建docker镜像必须遵循的步骤.此泊坞窗图像将:
>基于official node docker image
>从Github克隆nodeJS示例项目
>将工作目录更改为包含git clone的目录
>运行npm install命令以下载并安装nodeJS应用程序依赖项
>指示docker在运行该映像的容器时使用哪个命令
对nodeJS代码的快速回顾表明,作者允许我们使用NEO4J_URL环境变量配置要用于connect to the neo4j database的URL.
Docker化neo4j数据库
好吧,人们已经为我们照顾好了.我们将使用可以在Docker Hub上找到的official Docker image for neo4j.
快速阅读自述文件告诉我们使用NEO4J_AUTH环境变量来更改neo4j密码.将此变量设置为none将同时禁用身份验证.
设置Docker Compose
在与包含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环境变量设置为none.
Web服务将使用从当前目录(build:.)中找到的Dockerfile构建的docker镜像生成一个以docker命名的容器.它将启动该容器,将环境变量NEO4J_URL设置为http:// my-neo4j-db:7474(注意我们如何在这里使用neo4j容器my-neo4j-db的名称).此外,docker compose将指示Docker引擎在docker主机端口80上公开Web容器的端口3000.
解雇它
确保您位于包含docker-compose.yml文件的目录中,并键入:docker-compose –x-networking up.
Docker compose将读取docker-compose.yml文件,弄清楚它必须首先为Web服务构建一个docker镜像,然后创建并启动两个容器,最后将为您提供来自两个容器的日志.
一旦日志显示web_1 |快速服务器监听:http:// localhost:3000 /,一切都已熟,您可以将您的Internet导航器指向http://< ip of docker host> /.
要停止应用程序,请按Ctrl C.
如果您想在后台启动应用程序,请使用docker-compose –x-networking up -d.然后,为了显示日志,请运行docker-compose logs.
停止服务:docker-compose stop
删除容器:docker-compose rm
使neo4j存储持久化
官方的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时,docker compose将创建一个neo4j-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文件的目录中才能启动第二个实例.