How to deploy docker-compose to a remote host
Let's take your questions one-by-one:


  I want to be able to specify different versions of microservices for different prodction servers. How should I approach this?


There are many different ways to handle this.  One possibility be to "tag" your docker images and have different docker-compose files that use these images.


  Should I have one general docker-compose file or one file with specified versions for each production environment?


Depends.  How many environments do you have?  What I've often seen is a single docker-compose that references a separate environment file.


  Where should I keep docker-compose? In a repository? 


Again this depends.  A standard enterprise best practice would be to store this in a repository so that it is naturally version controlled, and can easily be accessed by others.


  How it is copied then to a remote host? How to deploy docker-compose.yml file to a remote host?


For deploying a docker-compose.yml it depends on the target architecture.  Since you mentioned Linux you could use scp to copy the file.


  How can I deploy new version of a microservice to a remote host?


The industry leading tool for this right now is Kubernetes.  If you go this approach your docker-compose could be morphed into a Kubernetes deployment.  Using just docker-compose you will need to somehow detect that a new container is available and pull it.  Watchtower or a similar tool may be helpful.

Based on what you've described I would recommend taking a look at the interactive Kubernetes tutorials, and seeing if that is ultimately an easier approach than everything I outlined above.