【问题标题】:Docker doesn't make services available by defaultDocker 默认不提供服务
【发布时间】:2017-10-02 05:40:24
【问题描述】:

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

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

服务似乎无法在您期望的地方提供。

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

当我最终发现我可以通过为连接选择一些模糊的 IP 地址 (172.18.0.x) 来使 MySQL 工作之后,我的下一个问题是在 PHP 容器中也可以使用 memcached。将此处的 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

请帮助我摆脱这个噩梦。

谢谢。

【问题讨论】:

    标签: php mysql docker memcached docker-compose


    【解决方案1】:

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

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

    如果你设置它,你也可以通过它的主机名来处理另一个容器,如果你愿意的话,甚至可以通过它的容器 id。

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

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

    如果你想表达依赖,使用depends_on。它与healthcheck 配合得非常好,还可以确保正确的启动顺序。

    【讨论】:

    • 嘿,耶瑞丝!对不起,我上次 KM 之旅错过了你!另一件事-我强烈建议将您的数据库连接信息放在环境变量中,而不是在您的存储库中硬编码。使本地开发和其他临时工作变得更容易。如果您还没有阅读有关 12 要素应用程序的信息,请阅读:12factor.net