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

标签 php mysql docker memcached docker-compose

过去 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/

相关文章:

javascript - 存储来自 php 脚本的信息

mysql - 使用 LIMIT 关键字检索项目总数

php - Docker中的Apache/PHP error_log位置?

php - Zend_Db 和无缓冲查询

php - jQuery - 与 undefined variable 作斗争

php - 点赞按钮 (PHP/MySQL)

docker - Gitlab-runner将自定义选项传递给docker

linux - Docker $(pwd) 和 bash 别名

javascript - AJAX insert in MySQL delay - 非插入

MySQL 外键约束 - 错误 1452 - 无法添加或更新子行