Docker supports maintaining several versions of the same app. You can achieve it in following ways:
1. Use Docker Tags
The common way to have several versions of the same app is to use Docker tags. The Docker tag is just a version of Docker image. With Docker tags, you can version your images like v1.0, v1.1 or v2.0 etc. Just like you maintain different application versions in Git.
For example, you can tag your Docker images like the following:
```
docker tag myapp:latest myapp:v1
docker tag myapp:latest myapp:v2
```
In the above commands, `myapp` is your Docker image and `v1`, `v2` are your tags or versions.
1. Use Docker Files
For small changes in versions, you can create different Dockerfiles for different versions of your application. Name your Dockerfile as Dockerfile-v1, Dockerfile-v2 etc. and build them separately.
For example:
```
docker build -f Dockerfile-v1 -t myapp:v1 .
docker build -f Dockerfile-v2 -t myapp:v2 .
```
1. Use different Docker Compose files
If your application needs distinct service versions, you can write different Docker Compose files for different versions of your application. Name your Docker Compose files as docker-compose-v1.yml, docker-compose-v2.yml etc.
After that, you can use them with Docker Compose command:
```
docker-compose -f docker-compose-v1.yml up -d
docker-compose -f docker-compose-v2.yml up -d
```
1. Use Docker Registries
You can push different Docker image versions to Docker registry just like you push your application code to Git. After that, you can pull them and use the required version when needed.
Remember to always specify a tag when you are running docker containers in Production systems. It ensures that your environment is predictable and repeatable. It also helps in debugging issues by allowing you to identify which version is running in a particular environment.