gpt4 book ai didi

php - Docker 默认情况下不提供服务

转载 作者:行者123 更新时间:2023-11-29 10:35:20 26 4
gpt4 key购买 nike

过去 2 天我一直在与 docker 搏斗,并在 docker 官方网站和 stackoverflow 上阅读了大量页面,但我读到的所有内容似乎都增加了困惑。不仅因为 docker-compose.yml 文件的语法似乎随每个版本而变化。

我已经成功地使用以下配置运行我的网站,但存在一些主要问题。

服务似乎无法在您期望的位置提供。

每次重新启动 docker (docker-compose up) 时,我都必须确保 MySQL 容器的 IP 地址没有更改。当它发生变化时,我需要更改我的代码,以便它连接到正确的服务器。这会创建一个无法使用的环境。

当我最终发现我可以通过选择一些不起眼的 IP 地址(172.18.0.x)来使 MySQL 工作时,我的下一个问题是 memcached 在 PHP 容器内也可用。将此处的 IP 地址更改为不起眼的 docker IP 在我的 GIT 存储库中看起来也不太好。

有什么方法可以普遍解决这个问题,而不必每次添加服务时都必须处理相同的模糊问题?

这是我的 docker-compose.yml:

version: "3.3"

services:
memcached:
image: memcached:alpine
container_name: gok_mamcached
ports:
- "11211:11211"
expose:
- 11211

mysql:
image: mysql:5.7
container_name: gok_mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=database
- MYSQL_USER=user
- MYSQL_PASSWORD=password
ports:
- "3306:3306"
expose:
- 3306
restart: always

php:
image: wildscamp/php
container_name: gok_php
environment:
- TIMEZONE=Asia/Hong_Kong
ports:
- "80:80"
- "443:443"
working_dir: /var/www/html
links:
- mysql
restart: always

请帮助我摆脱这个噩梦。

谢谢。

最佳答案

默认情况下,由于内部 docker DNS,每个容器都连接到单个 docker 网络中的所有其他容器。这就是您的情况,因为默认情况下,单个撰写文件中的所有 docker-compose 服务都是在名为 (%currentdirectoryname%_default) 的“默认”网络中创建的。

您实际上需要做的就是正确地寻址另一个容器。最直接、最符合逻辑的方法是使用服务名称mysql,就像您在撰写文件中命名它一样。

如果您设置了主机名,您还可以通过其主机名来寻址另一个容器,如果您愿意,甚至可以通过其容器 ID 来寻址。

这样做的最大好处是,如果您碰巧使用 docker swarm 并将您的服务扩展到许多实例,它们仍然可以在同一个服务器名称后面使用,并且只需在每次调用时进行循环。因此您不必为每项服务提供主机名。

附注:请不要使用链接,因为显式不会改变任何内容,已被弃用并在群体模式中被忽略。

如果您想表达依赖性,请使用depends_on。它与 healthcheck 配合得很好,可以额外确保正确的启动顺序。

关于php - Docker 默认情况下不提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46520044/

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