Skip to content

Blogs

Run Ubuntu docker in Windows 11

Overview

Summary

This guide demonstrates how to set up a self-hosted GitHub Actions runner within an Ubuntu WSL (Windows Subsystem for Linux) environment on Windows 11.

Prerequisites

  • Windows 11
  • WSL 2 installed (wsl --install)
  • Docker Desktop (optional, but recommended for container workflows)

Installation Process

The following log session details the complete installation process, from setting up the WSL environment to registering the runner.

View Full Installation Log Session
C:\Users\WJLEE>wsl -l
Windows Subsystem for Linux Distributions:
Ubuntu-24.04 (Default)
docker-desktop

C:\Users\WJLEE>wsl -d Ubuntu-24.04
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE$ mkdir actions-runner && cd actions-runner
wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$ curl -o actions-runner-linux-x64-2.322.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.322.0/actions-runner-linux-x64-2.322.0.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  113M  100  113M    0     0  11.5M      0  0:00:09  0:00:09 --:--:-- 12.5M
wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$ echo "b13b784808359f31bc79b08a191f5f83757852957dd8fe3dbfcc38202ccf5768  actions-runner-linux-x64-2.322.0.tar.gz" | shasum -a 256 -c
actions-runner-linux-x64-2.322.0.tar.gz: OK
wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$ tar xzf ./actions-runner-linux-x64-2.322.0.tar.gz


wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$
wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$
wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$ ./config.sh --url https://github.com/wenchiehlee/Selenium-Actions.Auction --token ACV3XP4YIAC7ZDQSFUKTJZ3HYVWI4

--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
|      | |  _| | __| |_| | | | | '_ \    / _ \ / __| __| |/ _ \| '_ \/ __|     |
|      | |_| | | |_|  _  | |_| | |_) |  / ___ \ (__| |_| | (_) | | | \__ \     |
|       \____|_|\__|_| |_|\__,_|_.__/  /_/   \_\___|\__|_|\___/|_| |_|___/     |
|                                                                              |
|                       Self-hosted runner registration                        |
|                                                                              |
--------------------------------------------------------------------------------

# Authentication


√ Connected to GitHub

# Runner Registration

Enter the name of the runner group to add this runner to: [press Enter for Default]

Enter the name of runner: [press Enter for TAICLTb37TmOcq7]

This runner will have the following labels: 'self-hosted', 'Linux', 'X64'
Enter any additional labels (ex. label-1,label-2): [press Enter to skip] ubuntu-latest

√ Runner successfully added
√ Runner connection is good

# Runner settings

Enter name of work folder: [press Enter for _work]

√ Settings Saved.

wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$ ubuntu-latest
ubuntu-latest: command not found
wjlee@TAICLTb37TmOcq7:/mnt/c/Users/WJLEE/actions-runner$ ./run.sh

√ Connected to GitHub

Current runner version: '2.322.0'
2025-03-03 07:52:30Z: Listening for Jobs
2025-03-03 07:52:36Z: Running job: sync-backup-workflow

Outcome

The runner is successfully registered and listening for jobs.

IOT Device Comparison

Overview

Executive Summary

This article provides a side-by-side specification comparison between the Raspberry Pi 5 and a generic/unnamed IoT device. This comparison highlights differences in AI performance, processing power, and connectivity.

Comparison Table

Specification Device (Provided) Raspberry Pi 5
AI Performance 67 INT8 TOPS 13 or 26 TOPS (with AI HAT+ accessory)
GPU NVIDIA Ampere architecture with 1024 CUDA cores and 32 Tensor cores VideoCore VII
CPU 6-core Arm Cortex-A78AE v8.2 64-bit CPU, 1.5MB L2 + 4MB L3 2.4GHz quad-core 64-bit Arm Cortex-A76 CPU, 512KB L2 (per core) + 2MB shared L3
Memory 8GB 128-bit LPDDR5, 102 GB/s LPDDR4X-4267 SDRAM, available in 2GB, 4GB, and 8GB variants
Storage Supports SD card slot and external NVMe MicroSD card slot; PCIe 2.0 x1 interface (requires adapter for external NVMe)
USB Ports Not specified 2 × USB 3.0 ports, 2 × USB 2.0 ports
Networking Not specified Gigabit Ethernet, Dual-band 802.11ac Wi-Fi, Bluetooth 5.0/BLE
Display Outputs Not specified Dual 4Kp60 HDMI display output with HDR support
Camera/Display Interface Not specified 2 × 4-lane MIPI camera/display transceivers
Power Supply Not specified 5V/5A DC power via USB-C, with Power Delivery support
Additional Features Not specified Real-time clock (RTC), Power button, Raspberry Pi standard 40-pin header

Note

The "Device (Provided)" specifications suggest a high-performance edge AI device, likely based on NVIDIA Jetson Orin Nano or similar architecture due to the "Ampere architecture" and "67 TOPS" reference.

Remote Chromium VNC Review

Troubleshooting

Chinese Character Display Issues

Problem

Users accessing Chromium via VNC may encounter issues where Chinese characters are not displayed correctly (e.g., showing as squares or tofu characters).

Solution

Refer to the following guide for a comprehensive fix:

让开源浏览器Chromium正常显示中文

Fonts

Requirement

Ensure you have Traditional Chinese fonts installed on the system.

  • Recommended: fonts-noto-cjk or similar packages.
  • Verification: Check for 繁體中文字體 support.

Github runner in Synology NAS

Overview

QuickPOC
Figure 1 DevOps with AI

Configuration Steps

  1. Create YAML file: Use the docker-compose structure provided below (configured for an Organization runner).
  2. Clean Data: In /volume1/docker/github-runner/data, ensure you remove any existing .runner file if resetting.
  3. Deploy: Generate the docker container with the new YAML and restart.

docker-compose.yml

version: '2.3'
services:
  worker:
    image: myoung34/github-runner:latest
    container_name: GITHUB-RUNNER
    restart: always
    environment:
      RUNNER_SCOPE: org
      ORG_NAME: xxx
      ACCESS_TOKEN: github_pat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      RUNNER_NAME: wenchiehlee.quickconnect.to
      RUNNER_WORKDIR: /tmp/runner/work
      RUNNER_GROUP: xxxx
      RUNNER_ALLOW_RUNASROOT: true
      DISABLE_AUTOMATIC_DEREGISTRATION: true
      CONFIGURED_ACTIONS_RUNNER_FILES_DIR: /actions-runner-data # Required for persistence
      LABELS: linux,x64,gpu,ubuntu-latest
    security_opt:
      # needed on SELinux systems to allow docker container to manage other docker containers
      - label:disable
    volumes:
      - /volume1/docker/docker.sock:/var/run/docker.sock
      - /volume1/docker/github-runner/tmp:/tmp:rw,Z
      - /volume1/docker/github-runner/data:/actions-runner-data:rw,Z # required for persistence
      - /volume1/web:/web:rw,Z
      - /volume1/docker:/docker:rw,Z
      - /volume1/homes:/homes:rw,Z
      # note: a quirk of docker-in-docker is that this path
      # needs to be the same path on host and inside the container,
      # docker mgmt cmds run outside of docker but expect the paths from within

References