Docker默认不提供服务

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

我已经到了让我的网站以下列configuration运行的地步,但是还有一些重大问题。

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

每次我重新启动docker(docker-compose)时,我必须确保IP地址没有改变我的MySQL容器。 当它改变时,我需要改变我的代码,以便它连接到正确的服务器。 这创造了一个不可用的环境。

当我终于明白,我可以通过select一些模糊的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,每个容器都连接到单个dockernetworking中的每个其他容器。 这是你的情况,因为默认情况下,在一个单一的合成文件中的所有docker-compose服务都是在名为(%currentdirectoryname%_default)的“默认”networking中创build的。

你真正需要做的就是正确地处理其他容器。 最直接,最合乎逻辑的方法就是使用服务名称 mysql ,就像在你的撰写文件中命名一样。

如果你设置了另一个容器,你也可以通过它的主机名来解决,或者如果你这么倾向的话,甚至可以通过它的容器ID来解决。

这真棒的好处是,如果你碰巧使用了docker swarm并且把你的服务扩展到很多实例,它们仍然可以在同一个单一的服务器名称之后被使用,并且在每次调用时都是循环的。 所以你不必为每个服务提供主机名。

PS :请不要使用链接,因为没有明确的变化,不推荐使用,并且在群集模式下被忽略。

如果你想expression依赖,使用depends_on 。 它与healthcheck工作得很好,以确保正确的启动顺序。

那么它很简单,你不需要使用IP,你只需要设置你正在使用的每个容器的主机名。 之后,在Docker Compose文件中,您将不得不使用“链接”来将容器链接在一起。

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