如何创建docker-compose.yml全局文件?

时间:2018-04-02 16:25:44

标签: docker docker-compose

我有一个基本的docker设置。问题是端口与其他项目中已使用的端口冲突。

例如,这个docker-compose.yml为mysql使用端口3306:3306,但我已经使用了这个端口。

我可以将端口更改为其他端口,但我不想错误地提交此更改,并且我不想忽略git中的此文件,以防我需要制作一些功能的永久性变化。

是否有覆盖当前文件的全局docker-compose.yml文件?无论是针对个别项目还是针对所有项目......

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用docker-compose.override.yml

例如,如果您有两个文件,如下所示。

# docker-compose.yml
web:
  ports:
    - 8883:80
# docker-compose.override.yml
web:
  prots:
    - 9999:80

当您运行docker-compose up时,它会自动与docker-compose.override.yml一起阅读docker-compose.yml,然后使用端口9999:80覆盖docker-compose.yml配置。

(它只会覆盖docker-compose.override.yml指定的内容,然后完整地使用docker-compose.yml

因此,通过创建docker-compose.override.yml并在git中忽略它,您可以实现您想要的目标。

有关详细信息,请参阅the document

答案 1 :(得分:1)

在同一主机上运行多个Docker应用程序时,为了避免端口冲突,您可能要考虑根本不使用固定端口。

正如in the documentation所写:

Either specify both ports (HOST:CONTAINER), or just the container port (an ephemeral host port is chosen).

因此,如果您想运行两个内部使用端口3306的Docker容器,这样两个容器都会将此端口映射到主机上的随机可用端口(例如32775第一个容器,第二个容器32776

要找出使用了哪个外部端口,只需通过docker ps -a查找即可。要在自动化shell脚本中自动使用,请运行类似

的操作
container_id=docker-compose ps -q <service name as in docker-compose.yml file>
echo $(docker port "${container_id}" | cut -d: -f2)

或者,如果您知道内部端口并且它已修复,您也可以运行

docker-compose port <service name as in docker-compose.yml file> <private port>

每次删除和重新创建服务时,随机端口都会更改。如果这不是一个选项,例如因为您需要固定的URL来与您的用户进行通信,所以下一步可能是在容器前面使用反向代理。这样,您可以通过my-service.my-host.some-domainmy-host/my-service等地址访问它们,无论暴露哪个随机端口。

我使用traefik获得了一些很好的经验,nginx docker reverse proxy project也很有效。

如果您对这种方式感兴趣,可以在互联网上找到很多教程。