Skip to content

Workshop environment setup

Pay attention

Make sure you are connected to the EduRoam network! Virtual machines are only accessible via Eduroam

You have been given pieces of papers containing the following information:

ok: [localhost] => (item=virtual-machine-workshop-04) => {
    "msg": [
        "Start here: https://bip-ws-docs.cloud.ut.ee/",
        "Hostname: virtual-machine-workshop-0x.cloud.ut.ee",
        "Address: 172.17.255.258",
        "Password: lively-xxxxx-pineapp"
    ]
}

Note

PS! This was just a sample, use the information provided to you on the pieces of paper.

We are going to use this information to grant you command-line access to the virtual machines that have been set up for you in University of Tartu's High Performance Computing Center's cloud environment.

To access the virtual machines, we are going to use a command-line utility called ssh which is available in linux, Windows and MacOS operating systems. But first, we need to make sure you can reach the virtual machines.

Test the connectivity to the virtual machine

Use the ping tool to see if the machine is reachable from your machine. ping is also available on linux, MacOS and Windows machines.

Open up a terminal emulator of your choice.

Popular terminal emulators are cmd or PowerShell. 
Using WSL is also an option. 
There are alot more.
Popular terminal emulators are Terminal and iTerm2. 
There are a lot more.
If you are using a linux operating system you are 
most-likely familiar with what a terminal is just 
pick the one you are comfortable with.
There are a lot of these.

Run the ping command followed by the IP address you got from the piece of paper.

Execute this:

ping IP-ADDRESS-FROM-THE-PIECE-OF-PAPER

Example output

daisy@fowl % ping -c4 172.17.89.152
PING 172.17.89.152 (172.17.89.152): 56 data bytes
64 bytes from 172.17.89.152: icmp_seq=0 ttl=62 time=18.497 ms
64 bytes from 172.17.89.152: icmp_seq=1 ttl=62 time=19.609 ms
64 bytes from 172.17.89.152: icmp_seq=2 ttl=62 time=18.578 ms
64 bytes from 172.17.89.152: icmp_seq=3 ttl=62 time=16.762 ms

--- 172.17.89.152 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 16.762/18.361/19.609/1.022 ms

Success

4 packets transmitted, 4 packets received, 0.0% packet loss - this means that your computer can access the right network and is able to reach the machine.

If you ping output looks correct move on to the next part. If not, please contact a supervisor.

Connecting to the virtual machine

Like mentioned earlier, you are going to use a command-line utility called ssh to access the virtual machine.

Open up a terminal emulator of your choice.

Important

The default username for this lab is ubuntu. The username goes after the ssh command and before the @ symbol. Substitute the IP-ADDRESS-FROM-THE-PIECE-OF-PAPER with the IP address from the piece of paper that follows Address:

Execute this:

ssh ubuntu@IP-ADDRESS-FROM-THE-PIECE-OF-PAPER

Example output

daisy@circus:~$ ssh ubuntu@172.17.89.152
The authenticity of host '172.17.89.152 (172.17.89.152)' can't be established.
ED25519 key fingerprint is SHA256:8zK6pGfi98hp4Gv9jmpnr2+4vM6Osf0RSmfG+4LvYeo.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes   <=== type 'yes' here
Warning: Permanently added '172.17.89.152' (ED25519) to the list of known hosts.
ubuntu@172.17.89.152's password:                                           <=== enter the password (piece of paper)
                                                                           <=== you will not see 
                                                                           <=== the password!
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-106-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Sun Mar 22 21:53:36 UTC 2026

  System load:  0.0                Processes:               136
  Usage of /:   10.0% of 47.39GB   Users logged in:         0
  Memory usage: 7%                 IPv4 address for enp3s0: 192.168.42.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


Last login: Sun Mar 22 21:54:05 2026 from 172.17.103.103
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@virtual-machine-workshop-01:~$

Success

The ssh connection was successful when you are greeted with:

ubuntu@virtual-machine-workshop-##:~$ style prompt

Ask for help, if this is not the case.

Now that we have successfully connected to the virtual machine over ssh it is time to run our first docker container.

First container

In this section we will run our first docker container. As is customary in IT, the first program, in this case a container should be a Hello world type of exercise.

Let's first make sure the ubuntu user has access to docker.

Let's try to execute docker ps -a command, which tells us if there are currently any containers running on our virtual machines.

Execute this:

docker ps -a

Example output

ubuntu@virtual-machine-workshop-01:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
ubuntu@virtual-machine-workshop-01:~$

Success

If there are no containers listed in the output, then we are good to go!

Now that we have made sure that there are no previous containers running, let's run the hello world container.

Execute this

docker run hello-world

Example output

ubuntu@virtual-machine-workshop-01:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
17eec7bbc9d7: Pull complete 
Digest: sha256:85404b3c53951c3ff5d40de0972b1bb21fafa2e8daa235355baf44f33db9dbdd
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Success

If your commands output looks similar to the example output. Then congratulations, you have successfully ran your first docker container inside a virtual machine

Now it is time to move onto something more complex. So far the hello world container you have ran has confirmed that you are able to run containers. But the container was short lived. It downloaded the container image, executed/ran it and then the container stopped.

Let's set up something that you can share with each other.

Setting up Copyparty with docker compose

ssh into the ubuntu vm and execute the following commands:

Execute this:

mkdir -p ~/copyparty/config ~/copyparty/data && cd ~/copyparty

Let's create a docker-compose.yml file with the touch command:

Execute this:

touch docker-compose.yml

Paste the following content into the docker-compose.yml:

services:
  copyparty:
    image: copyparty/ac:latest
    container_name: copyparty
    restart: unless-stopped
    volumes:
      - ./config:/cfg
      - ./data:/w
    environment:
      - PUID=1000
      - PGID=1000

  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # Mounts the Caddyfile we are about to create
      - ./Caddyfile:/etc/caddy/Caddyfile
      # Persistent storage for SSL certificates (crucial to avoid rate limits)
      - ./caddy_data:/data
      - ./caddy_config:/config

Create a file named Caddyfile inside copyparty directory also.

Execute this:

touch Caddyfile

Paste the following content into the Caddyfile but replace the ## with the number on your piece of paper.

bip-workshop-vm-##.cloud.ut.ee {
    tls internal
    reverse_proxy copyparty:3923
}

Into the newly created config directory, lets create a new file called copyparty.conf.

Execute this:

touch config/copyparty.conf

Paste the following configuration inside the newly created copyparty.conf file.

[global]
# This is where global server settings go. 
# Leaving this here suppresses the missing-config warning.
# Trust the local Docker network (Caddy) to provide real client IPs
xff-src: lan
rproxy: -1

[accounts]
# Define your users here. Format is "username : password"
admin : YourSecure

[/]
/w
# The 'accs' block controls access to this specific folder
accs:
  # 'A' means All access. Grant this to admin.
  A: admin
  # 'r' means Read-only. Grant this to everyone else (*).
  r: *

To start the docker container, please make sure you are inside the copyparty directory and you can see the docker-compose.yml file. From there please execute

Execute this:

docker compose up

And now you can go to your computer's web browser and open up the url, that is something similar to https://bip-workshop-vm-##.cloud.ut.ee