Jiv*_*van 191 networking docker docker-compose
我docker-compose.yml
在两个不同的文件夹中有两个单独的文件:
如何确保容器中的容器~/front/docker-compose.yml
可以向容器发送请求~/api/docker-compose.yml
?
我知道front
可以使用api
单个容器设置该选项,以便可以为此容器分配特定的IP地址,但似乎此选项在使用时不可用--default-gateway
.
目前我最终做了一个docker run
并查看输出中的网关.它有效,但问题是这个IP是随机归因的,所以我不能依赖它.
因此,这个问题的另一种形式可能是:
但最后我要照顾的是:
joh*_*s85 247
您只需要确保要彼此通信的容器位于同一网络上.网络是一流的docker构造,并不是特定的组合.
# front/docker-compose.yml
version: '2'
services:
front:
...
networks:
- some-net
networks:
some-net:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
...
# api/docker-compose.yml
version: '2'
services:
api:
...
networks:
- front_some-net
networks:
front_some-net:
external: true
Run Code Online (Sandbox Code Playgroud)
注意:您的应用程序的网络名称基于"项目名称",该名称基于其所在目录的名称,在这种情况下
front_
添加了前缀
然后,他们可以使用服务名称相互通信.从front
你可以做到ping api
,反之亦然.
Tal*_*ffe 63
只是对@ johnharris85的一个很好的答案,当您运行docker compose文件时,default
会创建一个" "网络,这样您就可以将其作为外部网络添加到其他撰写文件中:
# front/docker-compose.yml
version: '2'
services:
front_service:
...
Run Code Online (Sandbox Code Playgroud)
...
# api/docker-compose.yml
version: '2'
services:
api_service:
...
networks:
- front_default
networks:
front_default:
external: true
Run Code Online (Sandbox Code Playgroud)
对我来说这种方法更合适,因为我没有拥有第一个docker-compose文件并希望与之通信.
cst*_*ton 54
更新:从撰写文件版本3.5开始:
这现在有效:
version: "3.5"
services:
proxy:
image: hello-world
ports:
- "80:80"
networks:
- proxynet
networks:
proxynet:
name: custom_network
Run Code Online (Sandbox Code Playgroud)
docker-compose up -d
将加入一个名为'custom_network'的网络.如果它不存在,它将被创建!
现在,你可以这样做:
root@ubuntu-s-1vcpu-1gb-tor1-01:~# docker-compose up -d
Creating network "custom_network" with the default driver
Creating root_proxy_1 ... done
Run Code Online (Sandbox Code Playgroud)
这将创建一个将位于外部网络上的容器.
我在文档中找不到任何参考但是它有效!
Wiq*_*iqi 42
每个人都解释得很好,所以我将通过一个简单的解释来添加必要的代码。
使用在 docker-compose 外部创建的网络(“外部”网络), docker-compose
版本为3.5+
。
第一个 docker-compose.yml
文件应定义名称giveItANamePlease
如下的网络。
networks:
my-network:
name: giveItANamePlease
driver: bridge
Run Code Online (Sandbox Code Playgroud)
第一个文件的服务docker-compose.yml
可以使用网络,如下:
networks:
- my-network
Run Code Online (Sandbox Code Playgroud)
在第二个 docker-compose
文件中,我们需要使用第一个文件中使用的网络名称来代理网络docker-compose
,在本例中为giveItANamePlease
:
networks:
my-proxy-net:
external:
name: giveItANamePlease
Run Code Online (Sandbox Code Playgroud)
现在您可以my-proxy-net
在第二个文件的服务中使用docker-compose.yml
,如下所示。
networks:
- my-proxy-net
Run Code Online (Sandbox Code Playgroud)
ded*_*dek 22
所有容器api
都可以通过以下配置加入front
默认网络:
# api/docker-compose.yml
...
networks:
default:
external:
name: front_default
Run Code Online (Sandbox Code Playgroud)
请参阅docker撰写指南:使用预先存在的网络(参见底部)
Gae*_*ael 18
这么多答案!
首先,避免在服务和网络等实体名称中使用连字符。它们会导致名称解析问题。
示例:my-api
行不通。myapi
或者api
会起作用。
对我有用的是:
# api/docker-compose.yml
version: '3'
services:
api:
container_name: api
...
ports:
- 8081:8080
networks:
- mynetwork
networks:
mynetwork:
name: mynetwork
Run Code Online (Sandbox Code Playgroud)
和
# front/docker-compose.yml
version: '3'
services:
front:
container_name: front
...
ports:
- 81:80
networks:
- mynetwork
networks:
mynetwork:
name: mynetwork
Run Code Online (Sandbox Code Playgroud)
注意:我添加了端口来显示服务如何相互访问以及如何从主机访问它们。
重要提示:如果您未指定网络name
,docker-compose
我们将为您制作一个网络。docker_compose.yml
它使用文件所在文件夹的名称。在本例中:api_mynetwork
和front_mynetwork
。这将阻止容器之间的通信,因为它们将在不同的网络上使用非常相似的名称。
请注意,两个文件中的网络定义完全相同,因此您可以先启动任一服务,它就会工作。无需指定哪个是外部的,docker-compose
我们将负责为您管理。
您可以使用中定义的已发布端口来访问任一容器docker-compose.yml
。
您可以访问 Front 容器:curl http://localhost:81
您可以访问 API 容器:curl http://localhost:8081
您可以使用原始端口(而不是您发布的端口)访问 Front 容器docker-compose.yml
。
例子:curl http://front:80
您可以使用原始端口(而不是您发布的端口)访问 API 容器docker-compose.yml
。
例子:curl http://api:8080
小智 10
以前的帖子信息是正确的,但它没有关于如何链接容器的详细信息,这些容器应该连接为"external_links".
希望这个例子让你更清楚:
假设您有app1/docker-compose.yml,有两个服务(svc11和svc12),app2/docker-compose.yml有两个以上的服务(svc21和svc22),并且假设您需要以交叉方式连接:
svc11需要连接到svc22的容器
所以配置应该是这样的:
这是app1/docker-compose.yml:
version: '2'
services:
svc11:
container_name: container11
[..]
networks:
- default # this network
- app2_default # external network
external_links:
- container22:container22
[..]
svc12:
container_name: container12
[..]
networks:
default: # this network (app1)
driver: bridge
app2_default: # external network (app2)
external: true
Run Code Online (Sandbox Code Playgroud)
这是app2/docker-compose.yml:
version: '2'
services:
svc21:
container_name: container21
[..]
networks:
- default # this network (app2)
- app1_default # external network (app1)
external_links:
- container11:container11
[..]
svc22:
container_name: container22
[..]
networks:
default: # this network (app2)
driver: bridge
app1_default: # external network (app1)
external: true
Run Code Online (Sandbox Code Playgroud)
从 Compose 1.18(规范 3.5)开始,您可以使用您自己的自定义名称为您需要的所有 Compose YAML 文件覆盖默认网络。就像将以下内容附加到它们一样简单:
networks:
default:
name: my-app
Run Code Online (Sandbox Code Playgroud)
以上假设您已
version
设置为3.5
(或以上,如果他们在 4+ 中不弃用它)。
其他答案也指出了同样的问题;这是一个简化的总结。
更新:从 docker-compose 文件版本 3.5 开始:
我遇到了一个类似的问题,我通过在我的一个 docker-compose.yml 项目中添加一个小的更改来解决它。
例如,我们有两个 APIscoring
和ner
. Scoring
API 需要向 API 发送请求以ner
处理输入请求。为了做到这一点,他们都应该共享同一个网络。
注意:每个容器都有自己的网络,它是在 docker 中运行应用程序时自动创建的。例如,将创建 ner API 网络,并将ner_default
评分 API 网络命名为scoring default
. 此解决方案适用于版本:'3'。
在上面的场景中,我的评分 API 想要与 ner API 通信,然后我将添加以下几行。这意味着每当我为 ner API 创建容器时,它就会自动添加到评分默认网络中。
networks:
default:
external:
name: scoring_default
Run Code Online (Sandbox Code Playgroud)
version: '3'
services:
ner:
container_name: "ner_api"
build: .
...
networks:
default:
external:
name: scoring_default
Run Code Online (Sandbox Code Playgroud)
version: '3'
services:
api:
build: .
...
Run Code Online (Sandbox Code Playgroud)
我们可以看到上述容器现在如何成为scoring_default
使用以下命令调用的同一网络的一部分 :
码头工人检查 score_default
{
"Name": "scoring_default",
....
"Containers": {
"14a6...28bf": {
"Name": "ner_api",
"EndpointID": "83b7...d6291",
"MacAddress": "0....",
"IPv4Address": "0.0....",
"IPv6Address": ""
},
"7b32...90d1": {
"Name": "scoring_api",
"EndpointID": "311...280d",
"MacAddress": "0.....3",
"IPv4Address": "1...0",
"IPv6Address": ""
},
...
}
Run Code Online (Sandbox Code Playgroud)
您可以.env
在所有包含COMPOSE_PROJECT_NAME=somename
.
COMPOSE_PROJECT_NAME覆盖用于命名资源的前缀,因此您的所有项目都将用作somename_default
其网络,从而使服务可以像在同一项目中一样相互通信。
注意:您将收到有关从其他项目创建的“孤立”容器的警告。
要使用另一个 docker-compose 网络,您只需执行以下操作(在 docker-compose 之间共享网络):
- 运行第一个 docker-compose 项目
up -d
- 通过以下方式找到第一个docker-compose的网络名称:(
docker network ls
它包含根目录项目的名称)- 然后在第二个 docker-compose 文件中通过下面的结构使用该名称。
第二个 docker-compose.yml
version: '3'
services:
service-on-second-compose: # Define any names that you want.
.
.
.
networks:
- <put it here(the network name that comes from "docker network ls")>
networks:
- <put it here(the network name that comes from "docker network ls")>:
external: true
Run Code Online (Sandbox Code Playgroud)
小智 5
要连接两个 docker-compose,您需要一个网络并将两个 docker-compose 放入该网络中,您可以使用docker network create name-of-network创建 netwrok ,
或者您可以简单地将网络声明放在docker-compose 文件的网络选项中,当您运行 docker-compose (docker-compose up) 时,网络将自动创建。
将以下行放入两个 docker-compose 文件中
networks:
net-for-alpine:
name: test-db-net
Run Code Online (Sandbox Code Playgroud)
注意:net-for-alpine是网络的内部名称,它将在 docker-compose 文件内部使用,可以不同, test-db-net是网络的外部名称,在两个 docker-compose 中必须相同文件。
假设我们有 docker-compose.db.yml 和 docker-compose.alpine.yml
docker-compose.apline.yml 将是:
version: '3.8'
services:
alpine:
image: alpine:3.14
container_name: alpine
networks:
- net-for-alpine
# these two command keeps apline container running
stdin_open: true # docker run -i
tty: true # docker run -t
networks:
net-for-alpine:
name: test-db-net
Run Code Online (Sandbox Code Playgroud)
docker-compose.db.yml 将是:
version: '3.8'
services:
db:
image: postgres:13.4-alpine
container_name: psql
networks:
- net-for-db
networks:
net-for-db:
name: test-db-net
Run Code Online (Sandbox Code Playgroud)
要测试网络,请进入 alpine 容器
docker exec -it alpine sh
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令可以检查网络
# if it returns 0 or see nothing as a result, network is established
nc -z psql (container name)
Run Code Online (Sandbox Code Playgroud)
或者
ping pgsql
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
99676 次 |
最近记录: |