はじめに
docker-composeを使用して複数コンテナでROSノードを起動する機会があったので方法をメモ
docker-composeのインストールはこちら
https://docs.docker.com/compose/install/
実行環境
ホストPCのOS : ubuntu20.04.4LTS
DockerコンテナのROS : Noetic
docker-composeのバージョン:1.29.2
作成するもの
ros_tutorialsのtalkerとlistenerを別々のコンテナで実行してコンテナ間で通信するサンプルを作成する。
Dockerfileの作成
ベースイメージのros:noeticにはros_tutorialはインストールされていないため、ros_tutorialをインストールするDockerfileを作成する
こちらの記事のDockerfileをNoetic用に変更
https://qiita.com/Leonardo-mbc/items/cfd38a4fae8667593cf1
FROM ros:noetic-ros-core
RUN apt-get update && apt-get install -y
RUN apt-get install -y ros-noetic-ros-tutorials \
ros-noetic-common-tutorials \
&& rm -rf /var/lib/apt/lists/
Dockefileをbuildしてイメージの作成
$ docker build --tag ros:ros-tutorials .
docker-compose.ymlファイルの作成
コンテナを作成して実行するためのdocker-compose.ymlファイルを作成する。
以下のチュートリアルを参考に作成
version: '3'
networks:
ros:
driver: bridge
services:
ros-master:
image: ros:noetic-ros-core
hostname: ros-master
command: roscore
networks:
- ros
restart: always
talker:
image: ros:ros-tutorials
depends_on:
- ros-master
hostname: talker
environment:
- "ROS_HOSTNAME=talker"
- "ROS_MASTER_URI=http://ros-master:11311"
command: rosrun roscpp_tutorials talker
networks:
- ros
restart: always
listener:
image: ros:ros-tutorials
depends_on:
- ros-master
hostname: listener
environment:
- "ROS_HOSTNAME=listener"
- "ROS_MASTER_URI=http://ros-master:11311"
command: rosrun roscpp_tutorials listener
networks:
- ros
restart: always
実行
$ docker-compose up
バックグラウンドで実行
$ docker-compose up -d
以下のようなメッセージが出ていれば成功
listener_1 | [ INFO] [1652702560.567117299]: I heard: [hello world 122]
listener_1 | [ INFO] [1652702560.667229181]: I heard: [hello world 123]
listener_1 | [ INFO] [1652702560.767135910]: I heard: [hello world 124]
listener_1 | [ INFO] [1652702560.867152489]: I heard: [hello world 125]
talker_1 | [ INFO] [1652702555.667214803]: hello world 73
talker_1 | [ INFO] [1652702555.766609058]: hello world 74
talker_1 | [ INFO] [1652702555.866571646]: hello world 75
talker_1 | [ INFO] [1652702555.966563110]: hello world 76
docker-compose.yamlファイルの説明
以下yamlファイルの中身の説明
docker-composeで作成するコンテナは以下の3つ
- ros-master : ROS masterにするコンテナ roscoreだけ実行する
- talker : tutorials talkerを実行するコンテナ
- listener : tutorials listenerを実行するコンテナ
以下でdocker-composeで使用するネットワークの作成
networks:
ros:
driver: bridge
talkerを実行する部分
depends_on オプションにros-masterを指定することでros-masterが起動した後にtalkerコンテナが起動する。
environment オプションでROS_HOSTNAMEとROS_MASTER_URIの設定。
listenerも同様。
talker:
image: ros:ros-tutorials
depends_on:
- ros-master
hostname: talker
environment:
- "ROS_HOSTNAME=talker"
- "ROS_MASTER_URI=http://ros-master:11311"
command: rosrun roscpp_tutorials talker
networks:
- ros
参考文献
Docker + ROS(kinetic)でチュートリアル