Docker默认不提供服务

时间:2017-10-02 05:40:25

标签: php mysql docker memcached docker-compose

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

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

服务似乎无法在您期望的地方使用。

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

在我终于发现我可以通过为连接选择一些不起眼的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

请帮我摆脱这场噩梦。

感谢。

2 个答案:

答案 0 :(得分:1)

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

您实际需要做的就是正确地处理另一个容器。最简单和最合乎逻辑的方法是使用服务名称 mysql ,就像您在撰写文件中命名一样。

如果你设置了另一个容器,你也可以通过它的主机名来解决它,如果你愿意,也可以通过它的容器ID来解决它。

令人敬畏的好处是,如果您碰巧使用docker swarm并将服务扩展到许多实例,它们仍然可以在相同的单个服务器名称后面使用,并且只需在每次调用时循环访问。因此,您不必为每项服务提供主机名。

<强> P.S 即可。: 请不要使用链接,因为显式更改不会被弃用,并且在群集模式下会被忽略。

如果要表达依赖关系,请使用depends_on。它与healthcheck的效果非常好,可以进一步确保正确的启动顺序。

答案 1 :(得分:0)

安静简单,您不需要使用IP,只需为您正在使用的每个容器设置主机名即可。在您的Docker Compose文件中,您必须使用&#39;链接&#39;为了将容器链接在一起。

然后在您的应用程序中,您只需使用主机名而不是IP地址。