But that is the point of containers. To abstract away the need to worry about "finding underutilized boxes". The second you said "find an underutilized box" my mind went immediately to a pile of what I call "special snowflake" boxes. Each one is it's own unique thing. Symptoms usually include having cute names for each server instead of random, machine generated names. That shit is hard and expensive to maintain--especially in a fault tolerant way.
The best way to treat your infrastructure is to make it as ephemeral as possible. Absolutely any part of it should be able to go out of commission at any time and a new instance should go online to replace it.
If you are loading up multiple things onto a single m4 instance, I'm gonna say right now you are using AWS wrong....
At some point you get tried of trying to find an underutilized box to launch a new docker container.
At this point any service should just be a docker container but you still have to find a home with enough memory, cpu, and temp space to run the container.
"M4 instances provide a balance of compute, memory, and network resources, and it is a good choice for many applications."