how to use docker?

I guess it really depend on what you are loading and visualizing. But if you can not share a machine across users, you probably need a setup similar to JupyterHub where you start your new machine dynamically for your app. Another path could be to leverage Trame reverse websocket connection, so you could start a job “as a lambda” and have a central/static routing service. The latter is what we do when we schedule jobs on HPC.