Esta es la configuración que recomiendo a los estudiantes del Máster en Robótica e Inteligencia Artificial de la Universidad de León.

Distintas asignaturas pueden requerir distribuciones de ROS, versiones de Ubuntu o dependencias diferentes. Docker permite mantenerlas una junto a otra sin instalar una versión concreta de ROS en el sistema host ni intentar que un único entorno global de Python y pip funcione para todos los proyectos. Cada contenedor tiene su propia instalación de ROS, dependencias del sistema y paquetes de Python para que la máquina host se mantenga limpia.

El resultado es un escritorio VNC de ROS que se abre en el navegador, un workspace que vive en la máquina host y VS Code conectado directamente al contenedor. Permite iterar rápido sobre un proyecto, cambiar a otra asignatura con requisitos distintos y volver después sin tener que arreglar antes el entorno local.

Instalar Docker

Instala Docker Engine para Ubuntu siguiendo las instrucciones oficiales actualizadas. Los comandos y las versiones de Ubuntu compatibles cambian con suficiente frecuencia como para que copiarlos aquí haga que la guía envejezca mal.

Comprueba que Docker puede ejecutar un contenedor:

docker run hello-world

Si Docker pide sudo, sigue las instrucciones de postinstalación. Añadir un usuario al grupo docker le da acceso privilegiado al daemon, así que es una comodidad para una máquina personal de desarrollo, no un cambio de permisos inocuo. Cierra sesión y vuelve a entrar después de añadir el grupo.

Docker Desktop es opcional. Puede venir bien si prefieres una vista gráfica de las imágenes y los contenedores, pero el flujo de esta guía solo necesita la CLI de Docker.

Elegir e iniciar un entorno de ROS

Para trabajo nuevo, la opción por defecto de abajo es ROS 2 Lyrical. Jazzy es una LTS madura, mientras que Humble resulta útil cuando un proyecto existente todavía depende de ella. ROS 1 Noetic sigue disponible solo para asignaturas y proyectos que lo necesitan porque ya no tiene soporte upstream.

La versión LTS más reciente de ROS 2. El tag de la imagen está fijado para que el entorno sea reproducible.

Workspace en tu máquina: ~/ros2_lyrical_ws

Abrir en VS Code: /home/ubuntu/ros2_lyrical_ws

Nombre del contenedor ros2_lyrical_vnc

Iniciar el contenedor

mkdir -p ~/ros2_lyrical_ws

docker run -d \
  --name ros2_lyrical_vnc \
  -p 127.0.0.1:6080:80 \
  --mount type=bind,source=$HOME/ros2_lyrical_ws,target=/home/ubuntu/ros2_lyrical_ws \
  -e RESOLUTION=1600x900 \
  --shm-size=512m \
  tiryoh/ros2-desktop-vnc:lyrical-20260621T0550

Después abre http://localhost:6080

El bind mount es la parte importante del comando. El selector muestra el workspace de la distribución elegida. Se guarda en la máquina host, no solo en el sistema de archivos del contenedor, así que puedes detener o recrear el contenedor sin perder los ficheros del proyecto. Mantener un workspace por distribución también permite tener varios entornos de ROS a la vez sin mezclarlos.

El binding del puerto abre el escritorio en el navegador en http://localhost:6080. Al asociarlo a 127.0.0.1, solo será accesible desde la misma máquina. Si el puerto ya está ocupado, cambia el primer 6080, por ejemplo por 6081.

Las imágenes de esta guía son las imágenes ROS desktop VNC de tiryoh. Son cómodas para prácticas porque ROS y un escritorio ligero ya están configurados. Para un proyecto que vaya a durar, conviene fijar el digest de la imagen o mantener un Dockerfile pequeño para que el entorno sea reproducible.

Para iniciar de nuevo el mismo contenedor más adelante, usa el nombre que muestra el selector. Con la opción por defecto:

docker start ros2_lyrical_vnc

Por ejemplo, Jazzy usa ros2_jazzy_vnc y Noetic usa ros1_noetic_vnc. Para ver todos los contenedores, incluso los detenidos:

docker ps -a

Conectar con VS Code

Instala la extensión oficial Dev Containers en VS Code. Abre la paleta de comandos con Ctrl + Shift + P, ejecuta Dev Containers: Attach to Running Container… y selecciona el contenedor.

Después abre la ruta que aparece como Abrir en VS Code en el selector. Es la versión montada del workspace dentro del contenedor.

Dev Containers inicia un servidor de VS Code dentro del contenedor en ejecución. La ventana del editor sigue en la máquina host, pero la terminal, los servidores de lenguaje, los depuradores y la mayoría de extensiones del workspace se ejecutan dentro del contenedor. En la práctica, python, pip, colcon y los comandos de ROS de esa ventana de VS Code usan el entorno de ROS elegido, no el sistema host. Las extensiones de VS Code que necesitan acceder al workspace también se instalan en el contenedor; VS Code te ofrecerá hacerlo cuando sea necesario.

Cuando vuelvas a conectarte, VS Code recuerda la carpeta elegida y la configuración específica del contenedor. La configuración para contenedores conectados también es un buen sitio para dejar esa configuración escrita si vas a usarla a menudo.

Detener o eliminarlo

Cerrar VS Code solo desconecta el editor. Detén el escritorio cuando dejes de usarlo:

docker stop ros2_lyrical_vnc

Eliminar un contenedor es seguro cuando el workspace está montado en la máquina host:

docker rm ros2_lyrical_vnc

Esto elimina el entorno de escritorio y los cambios hechos solo dentro del contenedor. El código fuente sigue en el workspace que muestra el selector.