提问人:SerGO 提问时间:11/28/2020 更新时间:11/28/2020 访问量:2620
容器之间的 docker-compose 连接
docker-compose connection between containers
问:
我有 3 个容器,里面有我的机器人、服务器和数据库。docker-compose 启动后,服务器和数据库正在工作。Telegram Bot 执行 get-request 并出现以下错误: 获取“http://localhost:8080/user/”:拨打 tcp 127.0.0.1:8080:连接:连接被拒绝
docker-compose.ymlversion: "3"
services:
db:
image: postgres
container_name: todo_postgres
restart: always
ports:
- "5432:5432"
environment:
# TODO: Change it to environment variables
POSTGRES_USER: user
POSTGRES_DB: somedb
POSTGRES_PASSWORD: pass
server:
depends_on:
- db
build: .
restart: always
ports:
- 8080:8080
environment:
DB_NAME: somedb
DB_USERNAME: user
DB_PASSWORD: pass
bot:
depends_on:
- server
build:
./src/telegram_bot
environment:
BOT_TOKEN: TOKEN
restart: always
links:
- server
答:
0赞
Nir Gofman
11/28/2020
#1
你的容器在你的服务器和数据库容器之前启动。
当您使用时,它不会等待他们完成设置主题。
您应该尝试一些棘手的算法来等待其他容器完成设置。
我记得当我使用 Nginx 代理时,我使用了一种叫做 wait-for-it.sh
bot
depends_on
3赞
agentsmith
11/28/2020
#2
您尝试的是访问容器(服务)中的 localhost。bot
也许这个答案会帮助你解决问题。这听起来与您的问题相似。
但我想为你的问题提供另一种解决方案:
如果不需要从外部(从您的主机)访问容器,那么一个应用就是使用该功能和 docker 网络。expose
- 请参阅 docs.docker.com:网络。
该功能允许访问网络中的其他容器expose
公开端口而不将其发布到主机 - 它们只能由链接服务访问。只能指定内部端口。
例
这个例子在做什么?
几个不是强制性的步骤
- 在 docker 容器中设置静态 ip 这些步骤不是必需的,可以省略。但是,我喜欢这样做,因为您现在可以更好地控制网络。您也可以通过容器的主机名(即容器名称或服务名称)访问容器。
所需的步骤如下:
- 这会公开端口 8080,但不要发布它。
expose: - 8080
- 允许静态 ip 配置的网络
networks: vpcbr: driver: bridge ipam: config: - subnet: 10.5.0.0/16
完整的文件可能如下所示:
version: "3.8"
services:
first-service:
image: <your-image>
networks:
vpcbr:
ipv4_address: 10.5.0.2
expose:
- 8080
second-service:
image: <your-image>
networks:
vpcbr:
ipv4_address: 10.5.0.3
depends_on:
- first-service
networks:
vpcbr:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
3赞
Henrique Capozzi
11/28/2020
#3
使用 compose 时,请尝试使用容器主机名。如果机器人应尝试连接到
服务器:8080
Compose 将处理您需要的 IP 的名称解析
评论
depends_on
links
localhost
在 Docker 中几乎总是表示“这个容器”;Docker 文档中的 Compose 中的网络介绍了如何连接到其他容器。在现代 Docker 中,您根本不需要。links: