How to containerize my legacy app?

1. Why containerize?

Containers are taking the lead on the virtual machines, as it makes installation quicker and easier, it runs faster and it takes less space on your computer. To understand the technological reasons behind this, read this great article.

If you’re using an old app deployed using VMs, here is a way to migrate to a containerized app with Docker and docker-compose.

2. Questions to answer before containerizing

  1. First take a white board and draw a schema of the architecture using, for example, the C4 model. Make sure that for service you have the language/framework, how it communicates with the other services, the crons that may be executed, etc. Be careful, draw your production app, or at least your staging app to help you to as iso prod as possible.

  2. Then make sure you are able to run it completely on your laptop « the old way ».
    It helps you find non-authenticated routes you can easily call to test, understand the db provisioning which is done, etc.
    Take this opportunity to measure the installation time to check the difference with your new docker environnement ;)

  3. For each part answer these questions to list the steps you will need in your Dockerfile:

      1. Which process starts the app? For example for a node app it could be node ./server.js. Which files need to be inside the docker during the runtime?

      2. Do base images already exist in docker hub? Are they maintained? If yes, are an “alpine” version, usually the lighter one, available?

      3. Which environment variables are set? You should look for .env file.

  4. Build each Dockerfile. Start with the FROM instruction, then COPY the necessary files, declare the environment variables with the ENV instruction. RUN the necessary commands to build the binary file and use the CMD instruction to be sure it will be executed. Remember, one container equals to one process.
    Then test each part individually by running  docker build -t <IMAGE_TAG> and then docker run -p <HOST_PORT>:<CONTAINER_PORT> <IMAGE_TAG>

  5. Finally, connect all your services with docker-compose.
    To benefit from live reloading and to keep your fixtures in the potential database, mount some volumes.

  6. Test that your deployment into staging is still working.

3. Final thought

When you’re containerizing your application, it’s easy to separate the reverse proxy, the app and the database, and it often tempting to do more by turning your monolithic app into microservices. Nevertheless it’s not always a good idea as it can turn the containerization into a big thing. First containerize your monolithic app, then you will be able to improve it and create easily microservices one after the other.

Later on you could even transform each services into Kubernetes resources to have an iso software factory!

Aurore Malherbes

Aurore Malherbes

Aurore is the CTO of Padok. Previously architect developer in the world of mobile, she decided to move to the ops world, with one mission: put the develpment team in the best conditions with a fast dev environment and a reliable production.

What do you think? Leave your comments here !