Many of us using Docker to make our lives easier have ran into the issue of conflicting ports due to running more than 1 docker container. It’s easy to get bogged down into changing config files and squander an entire afternoon. I intend to write this article as a reminder to my future self whenever I need to set up multiple instances of docker container on a single machine.My development environment consists of — A Linux machine and two separate Laravel projects to run in distinct containers.
The files to modify
There are essentially 2 files which require modification:
Both of these files are located at the root directory of the Laravel projects.
Before we proceed let’s refresh the format of the ports as defined in the docker-compose.yml.
The format is: <External>:<Internal>
This is super important to remember.
So, if you see the MySQL port defined as 33060:3306, you immediately know that 33060 is the external port that the container exposes to the outside world. Whereas 3306 is the internal port used inside the container itself.
Now, let’s get into business!
Modifying the docker-compose.yml file
Initially both of my projects came with a docker-compose.yml file containing the ports as follows:
mysql:
ports: '3306:3306'
appid:
ports: '8000:80'
redis:
ports: '6379: 6379'
Notice that both the projects will attempt to run on the same ports since both of them have the exact same ports exposed (defined as external).Now, in order to solve this issue, you need to change one of the project’s config file and update the exposed ports to different ones. But another issue pops-up. It is likely you will be collaborating with multiple developers on the same project. A config change pushed by you might not be on par with their development environment. You are left in a conundrum!The idea to tackle this issue, lies in creating a separate config file that ONLY serves your dev environment and put it into .gitignoreThe steps goes like this:
- Create a docker-compose-dev.yml
- Add it in .gitignore
- Update it’s contents with PORTs of your choice and not conflicting with other docker containers running
My docker-compose-dev.yml looked like this:
mysql:
ports: '33060:3306'
appid:
ports: '8001:80'
redis:
ports: '6378: 6379'
Notice that, the internal ports on the right are still the same. Cause other containers on the machine don’t care about any internal ports running in any other container. Thus it is safe to change the external ports only!
Modifying the .env file
The key thing to remember here is:
the .env file should always contain the external ports as defined in the docker-compose.yml
Keeping that in mind we update our .env file and add the external ports to it.The modified file should have the following ports defined:
APP_URL=//localhost:8001
DB_PORT=33060
REDIS_PORT=6378
Considering the case where a separate application is running on the 8000 port of localhost.
Wrapping it up
To wrap up everything, we need to follow just 1 rule while running our docker-compose cmds.
> docker-compose -f docker-compose-dev.yml build/run/<other docker cmds>
The key thing to remember here is, appending this line:
docker-compose -f <your-updated-docker-compose-filename> before giving any cmds.
This should do the job!
Previously published at //medium.com/consol/running-multiple-docker-containers-with-custom-config-files-777a0f57fe89