docker-组成容器之间的连接
docker-compose connection between containers
我的机器人、服务器和数据库有 3 个容器。在 docker-compose up 之后,服务器和数据库正在运行。电报机器人确实收到请求并接受了这个错误:
获取“http://localhost:8080/user/”:拨打 tcp 127.0.0.1:8080: connect: connection refused
docker-compose.yml
version: "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
您的 bot
容器先于 服务器和数据库容器启动 。
当您使用 depends_on
时,实际上 而不是 等待他们完成设置主题。
您应该尝试一些棘手的算法来等待其他容器完成设置。
我记得当我使用 Nginx 代理时,我使用了一个叫做 wait-for-it.sh
的东西
您尝试访问容器(服务)中的本地主机bot
。
也许this answer能帮你解决问题。这听起来与您的问题相似。
但我想为您的问题提供另一种解决方案:
如果不需要从外部(从您的主机)访问容器,一种方法是使用 expose
功能和 docker 网络。
expose
功能允许访问网络中的其他容器
Expose ports without publishing them to the host machine - they’ll only be accessible to linked services. Only the internal port can be specified.
例子
这个例子在做什么?
一些非强制性步骤
- 在你的 docker 容器中设置一个 static 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
使用 compose 时,请尝试使用容器主机名。以防您的机器人尝试连接到
服务器:8080
Compose 将处理名称解析到您需要的 IP
我的机器人、服务器和数据库有 3 个容器。在 docker-compose up 之后,服务器和数据库正在运行。电报机器人确实收到请求并接受了这个错误: 获取“http://localhost:8080/user/”:拨打 tcp 127.0.0.1:8080: connect: connection refused
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
您的 bot
容器先于 服务器和数据库容器启动 。
当您使用 depends_on
时,实际上 而不是 等待他们完成设置主题。
您应该尝试一些棘手的算法来等待其他容器完成设置。
我记得当我使用 Nginx 代理时,我使用了一个叫做 wait-for-it.sh
您尝试访问容器(服务)中的本地主机bot
。
也许this answer能帮你解决问题。这听起来与您的问题相似。
但我想为您的问题提供另一种解决方案:
如果不需要从外部(从您的主机)访问容器,一种方法是使用 expose
功能和 docker 网络。
expose
功能允许访问网络中的其他容器
Expose ports without publishing them to the host machine - they’ll only be accessible to linked services. Only the internal port can be specified.
例子
这个例子在做什么?
一些非强制性步骤
- 在你的 docker 容器中设置一个 static 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
使用 compose 时,请尝试使用容器主机名。以防您的机器人尝试连接到
服务器:8080
Compose 将处理名称解析到您需要的 IP