如何链接多个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_1
和foo_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个服务: db
和web
。
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 up
, neo4j-data
compose将创build一个neo4j-data
目录,并将其安装到位于/data
的容器中。
开始应用程序的第二个实例
创build一个新目录并复制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文件的目录中才能启动第二个实例。