- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个连接到Neo4j数据库的Node.js Web应用程序。我想将它们封装在单个Docker镜像中(也使用Neo4j Docker container),但是我是Docker新手,似乎无法弄清楚。在最新的Docker版本中,推荐的做法是什么?
我的直觉是运行嵌套在应用程序容器内的Neo4j容器。但是从我阅读的内容来看,我认为支持/推荐的方法是将容器链接在一起。我需要的东西在this image中已经很好地说明了。但是图像来源的the article对我来说还不清楚。无论如何,它正在使用即将弃用的legacy container linking,而最近推荐使用networking。教程或解释将不胜感激。
另外,docker-compose如何适合所有这些?
最佳答案
在另一个容器中运行一个容器意味着要在一个Docker容器中运行一个Docker引擎。这是Docker-in-Docker的参考,我强烈建议不要这样做。您可以在线搜索“查找”,以了解为什么在大多数情况下这是一个坏主意,但是由于它不是您问题的主要对象,因此我不会对此主题进行进一步的扩展。
在同一容器中运行node.js进程和neo4j进程
虽然大多数人会告诉您不要在Docker容器中运行多个进程,但没有什么可以阻止您这样做。如果要遵循此路径,请查看Docker文档网站上的Using Supervisor with Docker或Phusion baseimage Docker镜像。
请注意,这种处理方式会使您的Docker镜像随着时间的推移越来越难维护。
链接容器
如您所知,尽可能地简化Docker镜像(即在Docker容器中运行一个且只有一个应用程序)将使您的生活从长远来看更加轻松。
当两个容器都在同一个Docker引擎上运行时,将容器链接在一起很简单。这只是一个问题:
--link <neo4j container name>:<alias>
选项<alias>
主机名,docker将负责将该连接转发到它分配给neo4j容器link:
键来定义链接
docker network create mynet
docker run --detach --name myneo4j --net mynet neo4j
docker run --detach --name mynodejs --net mynet <your nodejs image>
myneo4j
作为连接的主机。
--x-networking
选项。同样,您不会使用
links:
键。
container_name:
密钥,否则Compose将基于包含docker-compose.yml文件的目录,yml文件中的服务名称和一个数字创建容器名称。
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
作为数据库主机名。
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
npm install
命令以下载并安装nodeJS应用程序依赖项NEO4J_URL
环境变量来配置要用于
connect to the neo4j database的URL。
NEO4J_AUTH
环境变量来更改neo4j密码。并将此变量设置为
none
将一起禁用身份验证。
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
db
和
web
。
db
服务将从官方neo4j docker镜像生成一个名为
my-neo4j-db
的容器,并将启动该容器,将
NEO4J_AUTH
环境变量设置为
none
。
web
服务将使用从当前目录(
build: .
)中找到的Dockerfile构建的docker镜像生成一个以docker compose斟酌命名的容器。它将启动该容器,将环境变量
NEO4J_URL
设置为
http://my-neo4j-db:7474
(请注意,我们在此处使用neo4j容器
my-neo4j-db
的名称)。此外,docker compose将指示Docker引擎在docker主机端口
web
上公开
3000
容器的端口
80
。
docker-compose --x-networking up
。
web
服务构建一个docker镜像,然后创建并启动两个容器,最后将为您提供来自两个容器的日志。
web_1 | Express server listening at: http://localhost:3000/
后,一切就绪,您可以将Internet导航器定向到
http://<ip of the docker host>/
。
docker-compose --x-networking up -d
。然后,为了显示日志,请运行
docker-compose logs
。
docker-compose stop
docker-compose rm
/data
的卷上。然后,我们需要指示Docker Compose将卷安装到Docker主机上的目录中。
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
文件。
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文件的目录中,才能启动第二个实例。
关于docker - 如何链接多个Docker容器并封装结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694933/
我需要使用封装打印3个变量,并且无法修改主类。 主类声明变量[汽缸、制造商、所有者],并希望使用如下参数创建和打印一个对象: System.out.println (new Vehicle (cyli
我正在研究“Beginning Ruby”这本书,在我进行封装之前一切都进行得很顺利。我明白这段代码在做什么,我只是不知道为什么要用这些方法设置它。 对于那些感兴趣的人 this is the lin
所以我一直在研究面向对象的完整开发 JavaScript 实践,并对以下示例感到好奇。 据我了解,(这对我来说很有意义)以下“ secret ”字段是“私有(private)”的: var MyObj
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代
封装 被定义为 把一个或多个项目封闭在一个物理的或者逻辑的包中 。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可
今天我读了一本书,作者写道,在一个设计良好的类中,访问属性的唯一方法是通过其中一个类方法。这是一个被广泛接受的想法吗?为什么封装属性如此重要?不做会有什么后果?我早些时候在某处读到这可以提高安全性或类
今天我接受了软件工程职位的面试。我已经从 stackoverflow 中阅读了很多关于面试的内容。他们向我询问了与 OOP 相关的正常情况。但他们也问我这些: 没有继承就可以封装吗? 没有继承就可以抽
我正在制作一个简单的网站,并编写了gradle构建脚本,该脚本将执行诸如lint并最小化css / html / js之类的事情。 在这一阶段,我刚刚完成了正在运行的CSS,但是只是初始的非结构化格式
下面的幻灯片是指 C++ 语言,它说 "encapsulation is about ensuring the user uses our ADT in a safe way" 但是,如果他可以访问我
尝试设置一个 Person 类 我在尝试将信息封装在类中以使其不会被意外更改时遇到了问题。除了当我尝试使用 setter/getters 进行封装时,该类工作得非常好。我认为问题是这些方法最终会互相循
面向对象的概念:封装、数据抽象和数据隐藏是3个不同的概念,但彼此之间非常相关。所以我很难通过阅读互联网上的信息来完全理解这些概念。一个地方可用的信息与互联网上另一个地方的信息相矛盾。有人可以指导我阅读
我被封装困住了。在我看来,好像我已经按照规则做了一切,但仍然不起作用。虽然我知道我错过了一些东西。我正在使用 Eclipse。 我想要通过创建一副标准 52 张卡片来进行一些练习,并尝试我学到的新东西
在java中,要获取映射中的所有键,我们可以使用方法keySet。但我想知道为什么方法名称不只是 keys ?名称 Set 是否会泄露有关实现的详细信息? 据我了解,Java 是静态类型语言,名称中包
我正在尝试找出如何防止应用程序中的页面变量被全局定义。我想出了一些方法,但我想知道是否有人们使用的通用标准方法。 我使用这种方法得到了我的插件设计模式:http://www.virgentech.co
我有一个 tcp 连接,我想在服务器类的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。 private async void HandleConnecti
这是我类(class)的一个小样本: #include #include using std::string; using std::vector; struct Book { string
我想要类似下面的代码: class Foo{ public: void update() { for( auto dataModifier : _dataModifierLis
这已经困扰我一段时间了,所以我问了一个同事他是否能理解它,现在我来了;) 为什么可以在依赖属性的 PropertyChangedCallback 中访问持有类的私有(private)成员? 让我通过这
我知道封装意味着一个对象不应该直接访问不同对象的成员……但我猜它与公共(public)领域有关?我假设公共(public)方法不会破坏封装..?我只是在这里不清楚,很高兴得到任何解释。 最佳答案
我就废话不多说了,大家还是直接看代码吧~ ? 1
我是一名优秀的程序员,十分优秀!