Using Remote Docker Containers in Visual Studio Code

Using Remote Docker Containers in Visual Studio Code

You need ssh access on remote server via authorized_keys

Setup SSH Access if Required

Get your public key

cat ~/.ssh/id_rsa.pub

Logon to your target server and install your public key

cat >> ~/.ssh/authorized_keys

Make sure authorized_keys has proper permission; otherwise it won't work

chmod 600 ~/.ssh/authorized_keys

Visual Studio Code Setup

Prerequisites

  • Docker machine installed on remote server
  • Visual Studio Code installed on local machine
  • Docker plug-in installed on Visual Studio Code
  • Remote - Containers plug-in installed on Visual Studio Code

You will need to create a Docker Context

Refer: https://stackoverflow.com/questions/60425053/vs-code-connect-a-docker-container-in-a-remote-server

Here's an example of one

docker context create macbook-parallels --docker "host=ssh://mruckman@192.168.86.34"

Now you need to use this context, any Docker command you run, will be against that remote server, once context is used

docker context use macbook-parallels

Now launch Visual Studio Code, you will see your remote container and images now. Launch your desired remote container, and you can now attach to it.

If you want to revert back to your local Docker context

docker context use default

Other helpful context commands

List all of your contexts

docker ls

Remove a context

docker rm context-to-remove

Simple Example to Avoid Writing as Root to Host System

Simple way to write to host as current user

Refer: docker-shared-permissions

docker create --name ubuntu1804 \
  --net=host \
  -v ${PWD}:/home \
  --user "$(id -u):$(id -g)" \
  -it mruckman/ubuntu1804:201001

docker start ubuntu1804
docker exec -it ubuntu1804 /bin/bash
docker stop ubuntu1804
docker rm ubuntu1804

Or you can build you container where you pass in the credentials on the host machine.

Build the right image
Now it gets more interesting. Here is how you can build, configure and run your Docker containers correctly, so you don’t have to fight permission errors and access your files easily.

As you should create a non-root user in your Dockerfile in any case, this is a nice thing to do. While we’re at it, we might as well set the user id and group id explicitly.

Here is a minimal Dockerfile which expects to receive build-time arguments, and creates a new user called “user”:

FROM ubuntu

ARG USER_ID
ARG GROUP_ID

RUN addgroup --gid $GROUP_ID user
RUN adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID user
USER user

Refer: add-user-to-docker-container for more info on adduser

We can use this Dockerfile, to build a fresh image with the host uid and gid. This image, needs to be built specifically for each machine it will run on to make sure everything is in order.

Then, we can run use this image for our command. The user id and group id are correct without having to specify them when running the container.

docker build -t myimage \
  --build-arg USER_ID=$(id -u) \
  --build-arg GROUP_ID=$(id -g) .

docker run -it --rm \
  --mount "type=bind,src=$(pwd)/shared,dst=/opt/shared" \
  --workdir /opt/shared \
  myimage bash

No need to use “chown”, and no annoying permission errors anymore!