This factor is related to the exposition of the application to the outside.
To be compliant with 12 factor, an app must use specialized dependencies (such as http server, ...) and exposes its service through a port.
The host has the responsibility to route the request to the correct application through port mapping.
Docker already handles that for us, as we can see in the docker-compose file. The app container exposes port 80 internally and the host maps it against its port 8000.
version: '3'
services:
mongo:
image: mongo:3.2
volumes:
- mongo-data:/data/db
expose:
- "27017"
kv:
image: redis:alpine
volumes:
- redis-data:/data
expose:
- "6379"
app:
image: message-app:v0.2 # New version taking into account REDIS_URL
ports:
- "8000:80" // app service is exposed on the port 8000 of the host
links:
- mongo
depends_on:
- mongo
environment:
- MONGO_URL=mongodb://mongo/messageApp
- REDIS_URL=redis
volumes:
mongo-data:
redis-data:
If several instances of the app services needs to be deployed, the configuration above cannot be used as a given port on the host cannot map several ports in the containers.
In this case, we can use a load balancer to which the host will map a port. The load balancer will then be in charge to balance the traffic on the different instances of the services.