# Workspace-in-docker Workspace-in-docker - is a completely self-contained and fully isolated development environment, that runs inside a docker container. This image includes everything necessary to start coding right away. To use Workspace-in-docker, you don't need to install or use any other tools, apart from docker itself. Workspace can be used on a laptop, PC or launched on the remote server with HTTPS and authentication. Can be shared, backed up, and has versions. #### Try it out ``` docker run --name space-1 -d -p 8020-8035:8020-8035 alnoda/workspace-in-docker ``` ## Contents * [Why this image](#why-this-image) * [Use-cases](#use-cases) * [Features](#features) * [Launch Workspace](#launch-workspace) * [Workspace terminal](#workspace-terminal) * [Multiple workspaces](#multiple-workspaces) * [Open more ports](#open-more-ports) * [Docker in docker](#docker-in-docker) * [Run on remote server](#run-on-remote-server) * [Use Workspace](#use-workspace) * [Install applications](#install-applications) * [Schedule jobs with Cron](#schedule-jobs-with-cron) * [Python](#python) * [Node.js](#node.js) * [Run applications and services inside the workspace](#run-applications-and-services-inside-the-workspace) * [Manage workspaces](#manage-workspaces) * [Start and stop workspaces](#start-and-stop-workspaces) * [Create new workspace image](#create-new-workspace-image) * [Manage workspace images](#manage-workspace-images) * [Save and load workspace images](#save-and-load-workspace-images) * [Move workspace to the cloud](#move-workspace-to-the-cloud) ## Why this image > Have your ever participated in several software development projects at the same time? And each of them having different environments (dev, stage, prod). > Managing such multiple environments is much easier is everything is packaged inside a docker container. This workspace allows complete isolation of many IT-related projects, such as software development, DevOps, QA, data analysis, data engineering, data science, and others. Workspace can be used as a local development environment, as well as a remote dev environment, when started on the cloud server, and can be secured with a password. Workspace-in-docker allows to completely isolate and switch easily between projects that involve multiple programming languages, cloud CLIs, k8s clusters, configurations, and have system dependencies. Without this workspace, switching between such complex environments would require multiple actions and can be tedious work. Workspace-in-docker is great for collaborative work - it can be easily shared, moved to any cloud server, backed up, has versions, and can be easily extended and customized. Can be used as a build, test, or even runtime environment. Workspace makes it extremely easy to launch small products, created by hobby developers. The fact that the development, build, and runtime environment is the very same workspace, deployment of a web application becomes as easy, as committing workspace to a docker image and run it on any server. No need to write dockerfile, and waste time trying to replicate your development environment in a production docker image. Workspace-in-docker is a good choice if you want to control and versatility. It is lightweight, includes open-source tools and is nearly as convenient as working directly with a local environment. ## Use-cases - Avoid tedious process of setting dev environment on your laptop - Move dev environments between powerful PC and laptop in a minute - Work conveniently with multtiple IT projects on your laptop - Run dev environment in cloud and whork from any device, being independent on any cloudd service or cloud provider - Back-up and version control entire dev environments - Collaborate with peers by sharing entire workspace or run it in cloud - Move from dev to production in a minute - Create custom dev environment for your team, and help new-comers to save time on setting up their environments - Simple way to start coding for newbies ## Features Workspace-in-docker has all the features of the [*Base-Workspace*](https://github.com/bluxmit/alnoda-workspaces/blob/main/workspaces/base-workspace/README.md), in addition it includes a powerful browser-based version of Visual Studio Code. It is a lightweight VM alternative, which provides full isolation, consumes little resources and contains full-fledged IDE. ![Workspaces are amazing!](./img/workspace-demo.gif) - **Workspace UI** - launch all workspace tools from one place. - [**Eclipse Theia**](https://theia-ide.org/docs/) - open source version of popular Visual Studio Code IDE. Theia is trully open-source, has VS-Code extensions and works in browser. This means it can run inside a docker container on local machine or in cloud. - [**FileBrowser**](https://github.com/filebrowser/filebrowser) - manage files and folders inside the workspace, and exchange data between local environment and the workspace - [**Cronicle**](https://github.com/jhuckaby/Cronicle) - task scheduler and runner, with a web based front-end UI. It handles both scheduled, repeating and on-demand jobs, targeting any number of worker servers, with real-time stats and live log viewer. - [**Static File Server**](https://github.com/vercel/serve) - view any static html sites as easy as if you do it on your local machine. Serve static websites easily. - [**Ungit**](https://github.com/FredrikNoren/ungit) - rings user friendliness to git without sacrificing the versatility of it. - [**MkDocs**](https://squidfunk.github.io/mkdocs-material/) - maintain documentation for your workspace or project with only markdown. - [**Midnight Commander**](https://midnight-commander.org/) - Feature rich visual file manager with internal text viewer and editor. - [**Process Monitor**](https://htop.dev/) - Monitor running process and resource utilization. ## Launch Workspace Workspaces - are merely docker containers, that's why managing workspaces is easy and intuitive - it is enough to know only docker commands, no need to learn any new tools. In order to avoid confusion, the following convention is adopted: ```sh command to execute outside of the workspace ``` > `command to execute inside the workspace (after entering running docker container)` To start a workspace simply execute in terminal ```sh docker run --name space-1 -d -p 8020-8035:8020-8035 alnoda/workspace-in-docker ``` *(It is recommended to run workspace in the daemon mode)* ***Open [http://localhost:8020](http://localhost:8020)*** Workspace has its own UI, which includes quiklaunch (home) page and documentation pages. From the quiklaunch you can open any workspace tool. Documentation pages you modify in order to document the project, workspace use and setup. ### Workspace terminal There are several ways how to work with terminal of the the workspace-in-docker: - built-it in-browser terminal - use terminal provided by in-browser IDE [http://localhost:8025](http://localhost:8025) ([unless other ports are mapped](#multiple-workspaces)) - ssh into the running the docker container (of the workspace) from your terminal
*(Browser-based terminals always work under the user you started the workspace with, the default is non root user "abc")* If you want to enter running workspace container from your terminal execute: ```sh docker exec -it space-1 /bin/zsh ``` If you don't want to use z-shell ``` docker exec -it space-1 /bin/bash ``` This way allows to ssh into the workspace as a root user at any time, even if the workspace itself was not starter as root user (the default user is abc) ```sh docker exec -it --user=root space-1 /bin/zsh ``` You can work in Ubuntu terminal now. Execute the followinng command to know your workspace user > `whoami` ### Multiple workspaces Every workspace requires range of ports. If one workspace is up and running, the ports 8020-8035 are taken. Workspace-in-docker itself uses 9 ports (8020-8028), but it is recommended to map several extra ports just in case. Having extra ports, you can always launch new applications on these ports, and they will be immediately exposed outside of the workspace. In order to start another workspace, you either need to stop currently runnning workspace, or to run another workspace on the different port range. If you are planning to run more than one workspace at the same time, you can run another workspace with the different port range, for example ```sh docker run --name space-2 -d -p 8040-8055:8020-8035 -e ENTRY_PORT=8040 alnoda/workspace-in-docker ``` Notice that in addition we need to set environmental variable ENTRY_PORT, which should be equal to the first port in the new range. Workspace UI usues this variable to know the new port range, and redirects to the proper addresses of the workspace applications' UIs. ### Open more ports We started workspace container with a port range mapped "-p 8020-8035". If you are planning to expose more applications from inside of a container, add additional port mapping, for example ```sh docker run --name space-1 -d -p 8020-8035:8020-8035 -p 8080:8080 alnoda/workspace-in-docker ``` You can add multiple port mappings: ```sh docker run --name space-1 -d -p 8020-8035:8020-8035 -p 8080:8080 -p 443:443 alnoda/workspace-in-docker ``` **NOTE:** It is not a problem if you don't expose any ports, but later on realise you need them - you will just create new image, and run it exposing the required port (look in the section [Create new image](#create-new-image)) ### Docker in docker It is possible to work with docker directly from the workspace (using workspace terminal). ``` docker run --name space-1 -d -p 8020-8035:8020-8035 -v /var/run/docker.sock:/var/run/docker.sock alnoda/workspace-in-docker ``` NOTE: in order to use docker in docker you need to or enter into the workspace container as root ```sh docker exec -it --user=root space-1 /bin/zsh ``` ### Run on remote server Because workspace is just a docker image, running it in any other server is as easy as running it on local laptop. Running on remote server makes it much simpler to collaborate, because you can just share credentials to the workspace with your peers, and they will be able to use it. You can also run applications that should run permanently, and run jobs on schedule. #### Unsecure remote workspace The simplest deployment of the workkspace requires only 3 steps: - get virtual server on your favourite cloud (Digital Ocean, Linode, AWS, GC, Azure ...) - [install docker](https://docs.docker.com/engine/install/) on this server - ssh to the remote server and start workspace ``` docker run --name space-1 -d -p 8020-8035:8020-8035 -e WRK_HOST="