php - Docker默认不提供服务

原文 标签 php mysql docker memcached docker-compose

在过去的两天里,我一直在努力与docker搏斗,并在docker官方网站和stackoverflow上阅读了许多页面,但我仅阅读的所有内容似乎都增加了混乱。不仅因为docker-compose.yml文件的语法似乎在每个版本中都会改变。

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

服务似乎在您期望的位置不可用。

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

最终我确定可以通过选择一些晦涩的IP地址进行连接(172.18.0.x)来使MySQL正常工作后,我的下一个问题是在PHP容器中也可以使用memcached。在我的GIT存储库中,将此处的IP地址更改为晦涩的docker IP也看起来不太好。

有什么办法可以普遍解决此问题,而不是每次添加服务时都必须面对同样的晦涩之处?

这是我的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_onhealthcheck可以很好地工作,以另外确保正确的启动顺序。

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

相关文章:

mysql - 在 select 中获取列表中的记录不会限制在 mysql 中列出

php - 新的文本字段显示在选项卡上吗?

java - 如何在docker-compose中修复Jedis中的连接拒绝错误?

python - 用于运行带有参数的 Python 程序的 Docker 文件

docker - Jenkins Pipeline是否可以编写/配置单独的Jenkins作业?

php - 具有左右值的可嵌套树

javascript - 创建上一页按钮

php - 正则表达式PHP试图剖析字符串

mysql - 根据ID过滤数据

php - 在 PHP 中 is_null($x) 与 $x === null