我正在运行一个sharelatex容器。这个docker compose文件包含一个mongo和redis容器。
这是 sharelatex docker组成:
version: '2'
services:
sharelatex:
restart: always
image: rigon/sharelatex-full
#image: sharelatex/sharelatex
container_name: sharelatex
networks:
- test-network
depends_on:
- mongo
- redis
privileged: true
links:
- mongo
- redis
volumes:
- ./sharelatex_data:/var/lib/sharelatex
- /var/run/docker.sock:/var/run/docker.sock
environment:
SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
SHARELATEX_REDIS_HOST: redis
SHARELATEX_APP_NAME: ShareLaTeX
SHARELATEX_SITE_URL: https://latex.tkwant.de
mongo:
restart: always
image: mongo
container_name: mongo
expose:
- 27017
volumes:
- ./mongo_data:/data/db
networks:
- test-network
redis:
restart: always
image: redis
container_name: redis
networks:
- test-network
expose:
- 6379
volumes:
- ./redis_data:/data
networks:
test-network:
external: true
我也想创建一个需要mongodb的节点应用程序。 如何连接这两个容器? 我了解了网络,并尝试了docker网络,但没有成功。
这是我的 node docker compose :
version: '3.5'
services:
app:
container_name: app
restart: always
build: .
ports:
- '3001:3000'
networks:
- test-network
networks:
test-network:
driver: external
,这里是我的 index.js :
// Connect to MongoDB
mongoose
.connect(
'mongodb://mongo:27017/test2',
{ useNewUrlParser: true }
)
.then(() => console.log('MongoDB Connected'))
.catch(err => console.log("errorErrorError"));
我愿意接受所有答案... 在自己的容器中运行mongo或创建docker网络。但是我不知道什么是最好的还是最简单的。
更新1:
第一个问题:Sharelatex不再起作用-> sharelatex现在在另一个网络中。我的Nginx反向代理不再找到sharelatex容器。第二个问题是:当我要启动节点docker时,我得到此错误(不知道为什么,但它想创建一个新网络):使用驱动程序“ external”创建网络“ dockernodemongo_test-network”错误:未找到插件“ external” < / p>
答案 0 :(得分:6)
您可以尝试这样的事情。
按如下所示创建docker网络。
docker network create <NETWORK_NAME>
在您的 sharelatex docker compose 中,您可以像这样添加此网络(test-network是网络的名称)
services:
mongo:
restart: always
image: mongo
container_name: mongo
networks:
- test-network
expose:
- 27017
volumes:
- ./mongo_data:/data/db
networks:
test-network:
external: true
类似地,您可以在docker compose文件中为节点应用程序执行相同的操作(使用相同的网络名称)。
两个容器都位于同一网络中后,您可以将容器名称用作连接到它的主机名。
另外,您可以使用以下命令验证容器是否在同一网络中运行
docker network <NETWORK_NAME> inspect
PS
答案 1 :(得分:1)
好吧,看来您在两个实例上都指定了一个自定义网络,但实际上并没有为它们命名。标题“ test-network”只能用于从同一文件中引用。
networks:
test-network:
external: true
这将有效地创建一个自定义网络,但是没有指定名称,它将创建一个默认名称[projectname] _test-network。您正在有效地使用[projectname] _test-network创建两个不同的网络,这就是为什么它试图创建“ dockernodemongo_test-network”网络的原因。
在您的节点docker-compose上,您可以尝试:
networks:
test-network:
external:
name: [sharelatexname]_test-network
这将有效地搜索具有该名称的现有网络。另外,您可以从创建网络的第一个实例中为网络命名,这样可以省去尝试找出名称的麻烦。
sharelatex docker-compose:
networks:
test-network:
name: test-network
external: true
节点docker-compose:
networks:
test-network:
external:
name: test-network
为什么它不创建节点网络; “驱动程序:”您没有现有的名为“外部”的插件,而有一些内置的驱动程序可以为网络添加许多功能(例如,多主机),例如网桥,覆盖和macvlan。您也可以下载其他自定义插件。我不认为您需要这些来完成您想要完成的任务。同样,由于您仅使用一个网络,因此服务中所有“网络:”实例都是不必要的。它们都将成为唯一指定网络的一部分。如果您在同一docker-compose上有多个网络,并且希望为其中的特定服务隔离/指定网络,则“ networks:”将很有用。
答案 2 :(得分:-1)
您可以尝试一下。
version: '2'
services:
mongo: // declare first
restart: always
image: mongo
container_name: mongo
expose:
- 27017
volumes:
- ./mongo_data:/data/db
redis: // declare first
restart: always
image: redis
container_name: redis
expose:
- 6379
volumes:
- ./redis_data:/data
sharelatex:
restart: always
image: rigon/sharelatex-full
#image: sharelatex/sharelatex
container_name: sharelatex
depends_on:
- mongo
- redis
privileged: true
links:
- mongo:mongo // added :mongo
- redis:redis // added :redis
volumes:
- ./sharelatex_data:/var/lib/sharelatex
- /var/run/docker.sock:/var/run/docker.sock
environment:
SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
SHARELATEX_REDIS_HOST: redis
SHARELATEX_APP_NAME: ShareLaTeX
SHARELATEX_SITE_URL: https://latex.tkwant.de
如果尝试链接到mongo和redis后声明它们,则docker将不知道它的存在。
来源:https://docs.docker.com/compose/compose-file/#links
请注意,官方文档指出:--link
标志是Docker的旧功能。它最终可能会被删除。除非您绝对需要继续使用它,否则建议您使用用户定义的网络来促进两个容器之间的通信,而不要使用--link
。