Zenn
⛴️

DockerでROS/ROS 2環境を構築・運用する

2025/04/12に公開
1

海洋ロボコンをやってた人です。

ROSのEOLが来月に迫ってきており、DockerのROS/ROS 2環境を改めて整理・運用しようと思い備忘録として記載していきます。

対象者はROS/ROS 2のDocker環境で開発したい方、または手軽にROSを試したい方とします。

修正点等あればご遠慮なくご指摘ください。

以下箇条書きになりますが、何卒宜しくお願い致します。

1. Preparing Docker Image

Dockerは仮想環境として様々なソフトウェア開発で利用されます。
DockerfileやDocker imgを配布・流用することでソフトウェア開発のライフサイクルを効率よく回すことができます。

Dockerで出てくる用語のイメージは下記です。

1.1. Install docker

https://docs.docker.com/engine/install/ubuntu/

公式ドキュメントにしたがってDockerをインストール

docker -v
# Docker version 28.0.4, build b8034c0

docker compose version
# Docker Compose version v2.34.0

1.2. Create Image from Dockerfile

https://hub.docker.com/_/ros/

に記載されているSupported tagsまたは
Github:osrf/docker_images のディストリビューションを参照し、Dockerfileもしくはdocker pullコマンドをでイメージを作成していきます。

mkdir Docker && cd ~/Docker
sudo nano Dockerfile
Dockerfile
# ros:[Supported tags(Reference https://hub.docker.com/_/ros/)]
FROM osrf/ros:jazzy-desktop

# install ros package
RUN apt-get update && apt-get install -y \
      ros-${ROS_DISTRO}-demo-nodes-cpp \
      ros-${ROS_DISTRO}-demo-nodes-py && \
    rm -rf /var/lib/apt/lists/*

# launch ros package
# CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener_launch.py"]
# docker build --tag IMAGE_NAME:TAG_NAME
sudo docker build --tag ros:foxy .

1.3. Create Image from Hub

pullコマンドにより、DockerHubからイメージ作成できます。

# sudo docker pull ros:[Supported tags]
sudo docker pull ros:noetic # 20.04 ROS 1 EOL 01 May 2025
sudo docker pull ros:foxy # 20.04 ROS 2 EOL 01 May 2023
sudo docker pull ros:humble # 22.04 ROS 2 EOL 01 May 2027
sudo docker pull ros:jazzy # 24.04 ROS 2 EOL 01 May 2029

# desktop
sudo docker pull osrf/ros:foxy-desktop # 20.04 ROS 2 EOL 01 May 2023
sudo docker pull osrf/ros:humble-desktop # 22.04 ROS 2 EOL 01 May 2027
sudo docker pull osrf/ros:jazzy-desktop # 24.04 ROS 2 EOL 01 May 2029

1.4. Confirm docker img

ビルドが完了すると、イメージが作成されていることがわかる。
イメージで使用するコマンドは下記。

# Dockerイメージの一覧表示
sudo docker image ls

# Dockerイメージの停止&削除
sudo docker image rm --force [IMAGE ID]
sudo docker image rmi --force [REPOSITORY]:[TAG] # *1

# リポジトリ名、タグ名を変更して複製
sudo docker tag ros_noetic:v0 ros:noetic_v1

Error response from daemon: conflict: unable to delete c445e4e9450d (cannot be forced) - image has dependent child images

2. Preparing Docker Container

イメージからDockerコンテナの作成、起動、削除などを行います。

2.1. Create Container

# Dockerコンテナの一覧表示
sudo docker container ps -a

# コンテナに名前をつけて起動 --name [コンテナ名] [IMAGE ID]
sudo docker container run -it --name ros2_foxy 45f7e3294c0d
# ★コンテナに外部GUI出力を付与して起動
sudo docker container run -it \
  --name ros_jazzy_x11 \
  --net host \
  --privileged \
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  ros_jazzy_desktop:v1.0.1 \
  bash


# コンテナの名前(NAMES)を変更
sudo docker rename ros2_foxy ros2_foxy_x11

# 既存コンテナの起動と停止 (*複数ターミナル開いて入るときにも使用)
# sudo docker containeer start [NAMES]
sudo docker container start ros2_foxy
sudo docker container exec -it ros2_foxy bash

sudo docker container stop ros2_foxy

# コンテナの停止&削除
sudo docker container rm --force [CONTAINER ID]

2.2. Confirm X11 & ROS

コンテナを作成・起動したらx11, ROSコマンドが動くかを確認します。

予めUbuntu Host側でxhostの設定をしておきましょう。

xhost +local:root

Docker側で下記を実行していきます。

sudo apt -y update
sudo apt-get install -y x11-apps
sudo apt -y install ros-$ROS_DISTRO-demo-nodes-cpp ros-$ROS_DISTRO-demo-nodes-py
sudo apt -y install ros-$ROS_DISTRO-rviz* # desktop以外は適宜インストール

xeyes
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_cpp listener

3. Distribute Dockerfile

ros-$ROS_DISTRO-desktopではGazeboやMoveitなどはDLされていないので、環境構築したものを一つ作成しておき、Dockerfileとして再配布することで、再利用が可能となります。

ros_jazzy_x11をベースに環境を作っていきます。

sudo docker start ros_jazzy_x11 && sudo docker exec -it ros_jazzy_x11 bash
install pkg

sudo apt -y install ros-$ROS_DISTRO-ament-cmake-google-benchmark
sudo apt -y install python3-colcon-common-extensions
sudo apt -y install ros-$ROS_DISTRO-ros-testing
sudo apt -y install ros-$ROS_DISTRO-graph-msgs
sudo apt -y install ros-$ROS_DISTRO-warehouse-ros-sqlite
sudo apt -y install ros-$ROS_DISTRO-gz-ros2-control

3.1. Export and Import container

# コンテナからイメージをexportする: export [コンテナ名] > [出力ファイル名.tar」
sudo docker export ros_jazzy_x11 > ros_jazzy_x11.tar

# .tarからコンテナをインポートする
cat ros_jazzy_x11.tar | sudo docker import - ros_jazzy_x11:v1.0.1

tarファイルを配布すれば、Docker環境を使いまわすことができます。
ただ、tarファイルなので推奨は'Dockerfile'での運用となります。(T.B.D)

4. Setting Docker-compose

Docker composeを使用して、複数のコンテン、描画ツールを扱ってみます。

Docker composeのイメージは下記。

4.1. Setting yaml

yamlファイルで参照するイメージファイル、起動するコンテナ名、各種設定を記載します。

cd ~/Docker
sudo nano docker-compose.yaml
docker-compose.yaml
version: '3'

services:
  talker:
    image: osrf/ros:jazzy-desktop
    container_name: talker
    environment:
      - DISPLAY=${DISPLAY}
      - ROS_DOMAIN_ID=1
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
    command: ros2 run demo_nodes_cpp talker
    networks:
      - ros2
    ipc: host
    restart: always
    privileged: true

  listener:
    image: osrf/ros:jazzy-desktop
    container_name: listener
    environment:
      - DISPLAY=${DISPLAY}
      - ROS_DOMAIN_ID=1
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
    command: ros2 run demo_nodes_cpp listener
    networks:
      - ros2
    ipc: host
    restart: always
    privileged: true

  rqt:
    image: osrf/ros:jazzy-desktop
    container_name: rqt
    environment:
      - DISPLAY=${DISPLAY}
      - ROS_DOMAIN_ID=1
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
    command: rqt
    networks:
      - ros2
    ipc: host
    restart: always
    privileged: true

networks:
  ros2:
    driver: bridge

4.2. Run Docker Compose

下記で確認します。

sudo docker compose up

Reference

Qiita, porizou1, Docker ComposeでROS2ノードを起動する


以上。
Likeいただけると大変励みになりますので、よろしくお願いいたします。

1

Discussion

ログインするとコメントできます