mhe*_*ens 3 encapsulation docker docker-networking
我有一个连接到Neo4j数据库的Node.js Web应用程序.我想将这些封装在一个Docker镜像中(也使用Neo4j Docker容器),但我是一个Docker新手,似乎无法解决这个问题.在最新的Docker版本中,推荐的方法是什么?
我的直觉是运行嵌套在 app容器内的Neo4j 容器.但是从我读过的内容来看,我认为支持/推荐的方法是将容器链接在一起.我需要的是在这张图片中很好地说明了.但是图像来自的文章对我来说并不清楚.无论如何,它正在使用即将被弃用的旧容器链接,而这些天推荐使用网络.非常感谢教程或解释.
另外,docker-compose如何适应这一切?
Tho*_*eil 12
在另一个容器中运行容器意味着在Docker容器中运行Docker引擎.这被称为Docker-in-Docker的dind,我强烈反对它.你可以在线搜索'dind'并发现为什么在大多数情况下这是一个坏主意,但由于它不是你问题的主要对象,我不会进一步扩展这个主题.
虽然大多数人会告诉你不要在Docker容器中运行多个进程,但没有什么能阻止你这样做.如果您想要遵循这条路径,请查看Docker文档网站上的" 使用Supervisor with Docker "或Phusion baseimage Docker镜像.
请注意,这种做事方式会使Docker镜像越来越难以维护.
正如您所发现的那样,保持Docker图像尽可能简单(即:在Docker容器中运行一个且只有一个应用程序)将使您的生活更加轻松.
当两个容器在同一个Docker引擎上运行时,将容器链接在一起是微不足道的.这只是一个问题:
--link <neo4j container name>:<alias>选项运行node.js容器<alias>名,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 <your nodejs image>
Run Code Online (Sandbox Code Playgroud)
然后,您的节点应用程序配置应该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
Run Code Online (Sandbox Code Playgroud)
在开始时docker-compose --x-networking up,Web应用程序配置应该foo_db_1用作db主机名.
如果您使用container_name:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
container_name: mydb
Run Code Online (Sandbox Code Playgroud)
在开始时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
Run Code Online (Sandbox Code Playgroud)
这Dockerfile描述的步骤泊坞窗引擎将纷纷效仿建立一个码头工人像我们的Web应用程序.此泊坞窗图像将:
npm install命令以下载并安装nodeJS应用程序依赖项对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
Run Code Online (Sandbox Code Playgroud)
此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://<ip of the docker host>/.
要停止应用程序,请按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
Run Code Online (Sandbox Code Playgroud)
使用该配置文件,当您运行时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
Run Code Online (Sandbox Code Playgroud)
现在它准备好了docker-compose --x-networking up命令.请注意,您必须位于具有该新docker-compose.yml文件的目录中才能启动第二个实例.
| 归档时间: |
|
| 查看次数: |
2602 次 |
| 最近记录: |