过去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
请帮我摆脱这场噩梦。
感谢。
答案 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地址。