Podman 컨테이너 환경에서 ROS2 Jazzy 설치

The Elder Node·2026년 8월 15일
post-thumbnail

이 글들은 ROS 2의 기초를 다루지 않는다. 먼저 ROS 2 공식 튜토리얼의 Intermediate 단계 (https://docs.ros.org/en/jazzy/Tutorials/Intermediate.html) 까지는 학습을 마쳐야 한다. 공식 튜토리얼이 아니더라도 기초 개념과 예제는 웹에 충분히 공개되어 있으므로, 공식 문서를 참조하여 해당 과정을 먼저 마치기 바란다.

ROS 2는 Ubuntu 버전에 의존성이 높아서 시스템에서 사용중인 리눅스 배포판에 따라서 실행이 불가능할 수도 있다. 그래서 컨테이너 환경을 적극적으로 고려하였다.

Docker를 몇 번 써보기는 했지만 root 권한이 필요하고 데몬이 항상 실행되어 있어야 한다던지 여러가지 문제점이 있었다. 그러던 중 Podman을 알게되었고 rootless, 데몬 없음, systemd 친화적 등의 장점이 있어 이를 적극적으로 사용하게 되었다.

Podman 설치는 공식 문서를 참고한다.
Podman Installation Instructions

컨테이너 파일의 기본 틀은 아래 링크에서 참고하였다. (Docker 기반)
https://automaticaddison.com/the-complete-guide-to-docker-for-ros-2-jazzy-projects/

먼저 전체 소스와 환경을 Github에 올려 두었으니 혹 따라해 보고 싶은 사람은 이를 복제해서 사용한다.
https://github.com/hwjeon0123/robot-arm-study/

git clone https://github.com/hwjeon0123/robot-arm-study/ 

컨테이너 파일 내용은 아래 Github 링크를 참고하면 된다.
https://github.com/hwjeon0123/robot-arm-study/blob/main/environment/Containerfile

컨테이너 파일에 주석을 일부 달아 두었으며 일부 중요한 사항은 다음과 같다.

  • 컨테이너에서 ROS2 패키지 설치는 ROS2의 공식 문서를 참고한다. 지금 사용하는 jazzy의 경우 https://docs.ros.org/en/jazzy/Installation.html
  • RUN으로 패키지들을 설치할 때 한 번에 가능한 한 많은 패키지를 설치하고 마지막에 rm -rf /var/lib/apt/lists/* 명령을 추가하여 캐시를 삭제하면 생성되는 이미지 크기를 줄일 수 있다.
  • 컨테이너 내부에서 root로 작업을 하면 생성된 파일을 호스트에서 접근하거나 반대인 경우에 문제가 많아진다. 호스트에서 사용중인 자신의 id와 group에 맞추어 컨테이너의 사용자 id와 group을 생성하여 이 문제를 미연에 방지할 수 있다.
RUN usermod -l $USERNAME ubuntu && \
groupmod -n $USERNAME ubuntu && \
usermod -d /home/$USERNAME -m $USERNAME

또한, 컨테이너에서 패키지 설치 때 sudo 실행 시 암호를 물어보는 경우 설치에 문제가 발생할 수 있으므로 sudoer 설정에서 암호를 물어보지 않도록 설정한다.

RUN echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME && \
chmod 0440 /etc/sudoers.d/$USERNAME
  • Gazebo는 ROS 버전에 따라 호환되는 버전이 달라진다. 아래 Gazebo Github 링크에서 확인할 수 있다.
    https://github.com/gazebosim/ros_gz

  • 컨테이너 이미지를 빌드하기 전에 UR Robot의 ros2 소스는 vcstool로 호스트의 ur_ws에 미리 복제해 두어야 한다. 호스트의 디렉토리 구조는 아래와 같다.
    <호스트의 작업 디렉토리>/
    ├─ robot-arm-study/ ← 내가 작성한 Github 저장소 복제 (오버레이)
    └─ ur_ws/ ← 여기에 vcs import (언더레이, 저장소 밖)

  • 이미지를 빌드할 때 호스트의 작업 디렉토리가 기준이 되어 그 디렉토리의 ur_ws/src를 컨테이너 내부의 임시 경로로 복사해 rosdep로 의존성만 미리 설치한 뒤 임시로 복사한 소스는 지운다.
    컨테이너를 실행할 때 podman 명령줄의 옵션으로 <호스트의 작업 디렉토리>/ur_ws 와 컨테이너의 ~/ur_ws를 매핑하여 사용한다.

위 내용들이 저장소의 README.md와 environment/build.sh, environment/jazzy.sh 에 적용되어 있다.

그리고, 한가지 내 개발 환경이 일반적이지 않은 부분이 있다.
environment/jazzy.sh을 보면 NVIDIA 그래픽 카드 번호 1번을 사용하고 있다.
이유는 내가 사용하는 개발 환경에 그래픽 카드가 두 개가 있기 때문이다. 하나는 local LLM을 사용하기 위한 그래픽 카드이고 다른 하나는 일반 용도의 구형 그래픽 카드이다. 이 두 카드 중 구형 그래픽 카드의 번호가 1번이어서 이 그래픽 카드가 Podman 컨테이너에서 사용될 수 있도록 설정되어 있다.

그리고 GPU를 컨테이너 환경에서 사용하는 방법에 대한 설명은 따로 글을 올려 두었으니 참고하기 바란다.
Podman 컨테이너 환경에서 NVIDIA 그래픽 라이브러리 사용

이제 컨테이너 파일의 작성이나 수정이 완료되면 호스트에서 Podman 이미지를 빌드 할 수 있다.

<작업 디렉토리>/environment/build.sh 

빌드가 완료되면 컨테이너의 쉘로 진입하여 잘 동작하는지 확인한다.

<작업 디렉토리>/environment/jazzy.sh 

실행중인 컨테이너는 아래와 같이 podman 명령으로 중지할 수 있다.

podman stop robot-arm-study 

Turtlesim을 실행시켜서 잘 동작하는지 확인해 본다.

vglrun ros2 run turtlesim turtlesim_node

터틀심 실행 화면

참고로 컨테이너 이미지를 실행 할 때 --rm 옵션을 추가하여 컨테이너를 중지하면 컨테이너가 삭제될 수 있도록 하였다. 컨테이너를 지우지 않고 남겨두면 그 안에 임시로 설치한 패키지나 파일이 남게 되는데 이 일이 반복될수록 Containerfile과 컨테이너 내용이 서로 어긋나게 되어 새로 이미지를 빌드할 경우 정상 동작하지 않는 경우가 발생할 수 있다. 필요한 패키지가 늘어나거나 환경을 변경해야 할 상황이 있다면 Containerfile을 수정한 후 이미지를 다시 빌드하는 방향으로 처리하는 것이 좋다.

profile
무선/임베디드 엔지니어의 ROS2 & AI 개척기

0개의 댓글