由于运行多个Docker容器,我们许多人都在使用Docker来简化生活,但遇到端口冲突的问题。 很容易陷入更改配置文件而浪费整个下午的时间。 每当我需要在单台机器上设置多个Docker容器实例时,我打算写这篇文章来提醒自己。
我的开发环境包括-一台Linux机器和两个单独的Laravel项目,分别在不同的容器中运行。
修改文件
基本上有2个文件需要修改:
- .env
- docker-compose.yml
这两个文件都位于Laravel项目的根目录中。
Docker配置中PORT的格式
在继续之前,让我们刷新docker-compose.yml中定义的端口格式。
格式为: <外部>:<内部>
要记住这一点非常重要。
因此,如果您看到定义为33060:3306的MySQL端口,您将立即知道33060是容器向外界公开的外部端口。 而3306是容器本身内部使用的内部端口。
现在,让我们开始业务!
修改docker-compose.yml文件
最初,我的两个项目都带有一个包含端口的docker-compose.yml文件,如下所示:
mysql:
ports: '3306:3306'
appid:
ports: '8000:80'
redis:
ports: '6379: 6379'
请注意,这两个项目都将尝试在相同的端口上运行,因为它们都暴露了完全相同的端口(定义为外部)。
现在,为了解决此问题,您需要更改项目的配置文件之一,并将暴露的端口更新为其他端口。 但是又出现了另一个问题。 您可能将与同一项目的多个开发人员合作。 您推动的配置更改可能与他们的开发环境不符。 你陷入了一个难题!
解决此问题的想法在于创建一个单独的配置文件,该文件仅为您的开发环境提供服务,并将其放入.gitignore
步骤如下:
- 创建一个docker-compose-dev.yml
- 将其添加到.gitignore
- 使用您选择的PORT更新其内容,并且与其他正在运行的Docker容器不冲突
我的docker-compose-dev.yml看起来像这样:
mysql:
ports: '33060:3306'
appid:
ports: '8001:80'
redis:
ports: '6378: 6379'
请注意,右侧的内部端口仍然相同。 原因是机器上的其他容器不关心其他任何容器中运行的内部端口。 因此仅更改外部端口是安全的!
修改.env文件
这里要记住的关键是:
.env文件应始终包含docker-compose.yml中定义的外部端口
请记住,我们将更新.env文件并向其中添加外部端口。
修改后的文件应定义以下端口:
APP_URL =http://localhost: 8001
DB_PORT = 33060
REDIS_PORT = 6378
考虑在本地主机的8000端口上运行单独的应用程序的情况。
包起来
要打包所有内容,我们在运行docker-compose cmds时仅需遵循1条规则。
> docker-compose -f docker-compose-dev.yml build/ run /<other docker cmds>
这里要记住的关键是添加以下行:
docker-compose -f <your-updated-docker-compose-filename> before giving any cmds.
这应该做的工作!
先前发布在https://medium.com/consol/running-multiple-docker-containers-with-custom-config-files-777a0f57fe89
From: https://hackernoon.com/running-multiple-docker-containers-with-custom-config-files-yi9v3yjl