我有两个独立的docker-compose。Yml文件在两个不同的文件夹:
~/front/docker-compose.yml
~/api/docker-compose.yml
我如何确保前面的容器可以在api中向容器发送请求?
我知道——default-gateway选项可以使用docker run为单个容器设置,这样就可以为该容器分配特定的IP地址,但似乎在使用docker-compose时这个选项不可用。
目前,我结束了一个docker检查my_api_container_id,并查看输出中的网关。它是有效的,但问题是这个IP是随机分配的,所以我不能依赖它。
这个问题的另一种形式可能是:
我可以使用docker-compose将一个固定的IP地址归属于特定的容器吗?
但最终我所追求的是:
两个不同的docker-compose项目如何相互通信?
回答Docker,写“3”以上
默认情况下,Docker Compose使用网桥网络来提供容器之间的通信。有关容器间网络的更多信息,请阅读本文。
重要的是,默认情况下,Docker Compose会创建一个与Docker - Compose中的服务名相同的主机名。yml文件。考虑下面的docker-compose.yml:
version: '3.9'
services:
server:
image: node:16.9.0
container_name: server
tty: true
stdin_open: true
depends_on:
- mongo
command: bash
mongo:
image: mongo
environment:
MONGO_INITDB_DATABASE: my-database
当你运行Docker -compose up时,Docker将创建一个默认网络,并为mongo和server分配服务名作为主机名。
你现在可以通过以下方式访问后端容器:
docker exec -it server bash
现在你可以使用Dockers内部网络(默认端口为27017)来ping mongo容器:
curl -v http://mongo:27017/my-database
就是这样。这同样适用于您的设置。
更新:作为撰写文件版本3.5:
现在可以工作了:
version: "3.5"
services:
proxy:
image: hello-world
ports:
- "80:80"
networks:
- proxynet
networks:
proxynet:
name: custom_network
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
现在,你可以这样做:
version: "2"
services:
web:
image: hello-world
networks:
- my-proxy-net
networks:
my-proxy-net:
external:
name: custom_network
这将创建一个位于外部网络上的容器。
我在文档中找不到任何参考资料,但它是有效的!
我有一个类似的例子,我正在使用单独的docker-compose文件,在一个覆盖网络的docker swarm上工作,我所要做的就是改变网络参数:
第一个docker-compose.yaml
version: '3.9'
.
.
.
networks:
net:
driver: overlay
attachable: true
docker-compose -p app up
因为我已经使用-p将应用程序名称指定为app,初始网络将是app_net。
现在,为了运行另一个docker-compose与多个使用同一网络的服务,你需要这样设置:
第二个docker-compose.yaml
version: '3.9'
.
.
.
networks:
net-ref:
external: true
name: app_net
docker stack deploy -c docker-compose.yml mystack
无论给堆栈取什么名字,网络都不会受到影响,它总是引用名为app_net的现有外部网络。
PS:确保检查docker-compose版本是很重要的。
之前的帖子信息是正确的,但是没有详细说明如何链接容器,应该连接为“external_links”。
希望这个例子能让你更清楚:
假设您有app1/docker-compose。Yml,包含两个服务(svc11和svc12),以及app2/docker-compose。Yml和另外两个服务(svc21和svc22),假设你需要以交叉方式连接:
Svc11需要连接到svc22的容器
Svc21需要连接到svc11的容器。
所以构型应该是这样的:
这是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
这是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