gpt4 book ai didi

docker - “links”指令如何在docker-compose中工作?

转载 作者:行者123 更新时间:2023-12-02 19:22:52 25 4
gpt4 key购买 nike

在下面的docker-compose.yml文件中:

app:
build: ../../
dockerfile: docker/release/Dockerfile
links:
- dbc
volumes_from:
- webroot
environment:
DJANGO_SETTINGS_MODULE: someapp.settings.release
MYSQL_HOST: db
MYSQL_USER: user1
MYSQL_PASSWORD: passwd
command:
- uwsgi
- "--socket /var/www/someapp/someapp.sock"
- "--chmod-socket=666"
- "--module someapp.wsgi"
- "--master"
- "--die-on-term"

dbc:
image: mysql:5.6
hostname: db
expose:
- "3386"
environment:
MYSQL_DATABASE: someapp
MYSQL_USER: user1
MYSQL_PASSWORD: passwd
MYSQL_ROOT_PASSWORD: passwd
app服务依赖于 dbc服务。
  links:
- dbc

但是,应用无法使用上述语法连接到数据库。

我们编写了一个ansible探针作为单独的容器服务,该探针可以:
wait_for host={{ probe_host }}
port={{ probe_port }}
links到底能确保什么?

最佳答案

Docker链接仅对于legacy "default bridge network" mode是必需的。 Docker Compose将automatically create a "user-defined bridge network"links:不再是docker-compose.yml文件所必需的。

实际上,这意味着links:的行为与 depends_on: 完全相同。如果您运行docker-compose up app,它也会为您启动dbc。 Compose将在开始启动应用程序之前开始启动数据库,但是它无法知道数据库已完成启动。通常,您使用诸如wait-for-it之类的脚本来确保数据库已准备就绪,或者设置 restart: 策略,如果尚无法访问数据库,则崩溃。

为了使容器a到达同一b文件中的容器docker-compose.yml,唯一的要求是它们必须位于同一网络上。最简单的方法是根本不拥有networks:块。如果两者都相同,则它们必须具有相同的名称,如果只有一个,则必须包含default。服务名称(在您的示例中为appdbc)可以用作普通主机名,而无需您进行进一步配置。设置hostname:对网络没有影响。 container_name:将为容器提供其他名称;两者都不是必需的。

无论其他设置如何,容器间通信始终使用容器内服务器进程正在侦听的任何端口。既不需要ports:也不需要expose:;如果您具有ports:并且两个端口号不同,则将连接到第二个端口号。对于显示的mysql:5.6图像,您将始终连接到端口3306(公开其他端口号无效)。

在大多数情况下,您永远不要指定links:expose:hostname:container_name:;它们对于联网是不必要的,并且不设置容器的有用属性。我还建议仅使用默认的网络设置,不要在文件中的任何位置指定networks:

关于docker - “links”指令如何在docker-compose中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58478593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com