我有一个基本的docker设置。问题是端口与其他项目中已使用的端口冲突。
例如,这个docker-compose.yml
为mysql使用端口3306:3306
,但我已经使用了这个端口。
我可以将端口更改为其他端口,但我不想错误地提交此更改,并且我不想忽略git中的此文件,以防我需要制作一些功能的永久性变化。
是否有覆盖当前文件的全局docker-compose.yml
文件?无论是针对个别项目还是针对所有项目......
有什么想法吗?
答案 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-domain
或my-host/my-service
等地址访问它们,无论暴露哪个随机端口。
我使用traefik获得了一些很好的经验,nginx docker reverse proxy project也很有效。
如果您对这种方式感兴趣,可以在互联网上找到很多教程。