docker 的写法

docker build -t ros2 -f dockerfile.ros .

FROM docker.m.daocloud.io/library/ubuntu:22.04

# 安装软件时不要进入交互界面
ENV DEBIAN_FRONTEND=noninteractive \
    # 设置时区是UTC
    TZ=Etc/UTC \
    # 定义conda的安装目录变量                     
    CONDA_DIR=/opt/conda \
    # 将conda的可执行目录加到系统 PATH 最前面
    PATH=/opt/conda/bin:$PATH


# 基础依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    # --- 基础工具 ---
    git wget vim zsh curl sudo tmux tree cloc cmake g++ gcc\
    # --- 网络诊断 ---
    iputils-ping net-tools iproute2 tcpdump nmap iperf3 \
    # --- 硬件/总线调试 ---
    can-utils usbutils minicom i2c-tools mesa-utils kmod \
    # --- 系统/性能监控 ---
    htop iotop strace gdb lsof \
    # 删除 apt 的索引缓存。
    && rm -rf /var/lib/apt/lists/*


ENV ZSH=/opt/oh-my-zsh
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended && \
    git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH/custom/plugins/zsh-autosuggestions && \
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH/custom/plugins/zsh-syntax-highlighting && \
    git clone https://github.com/spaceship-prompt/spaceship-prompt.git $ZSH/custom/themes/spaceship-prompt --depth=1 && \
    ln -s $ZSH/custom/themes/spaceship-prompt/spaceship.zsh-theme $ZSH/custom/themes/spaceship.zsh-theme && \
    cp $ZSH/templates/zshrc.zsh-template /root/.zshrc && \
    sed -i "s|^export ZSH=.*|export ZSH=$ZSH|g" /root/.zshrc && \
    sed -i 's/^ZSH_THEME=.*/ZSH_THEME="spaceship"/g' /root/.zshrc && \
    sed -i 's/^plugins=(.*/plugins=(git zsh-autosuggestions zsh-syntax-highlighting)/g' /root/.zshrc && \
    echo 'alias lg=lazygit' >> /root/.zshrc && \
    cp /root/.zshrc /etc/skel/.zshrc && \
    chmod -R 755 $ZSH


# ros2
LABEL description="perception_platform with ROS2 Humble environment"
ENV DEBIAN_FRONTEND=noninteractive
ENV ROS_DISTRO=humble

# ======================== 添加 ROS2 apt 源 ========================
# 使用宿主机已有密钥文件,避免访问被封锁的 raw.githubusercontent.com
COPY ros-archive-keyring.gpg /usr/share/keyrings/ros-archive-keyring.gpg

RUN apt-get update && apt-get install -y --no-install-recommends \
     lsb-release \
     && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
         https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(lsb_release -cs) main" \
         > /etc/apt/sources.list.d/ros2.list \
     && rm -rf /var/lib/apt/lists/*

# ======================== 安装 ROS2 核心包 ========================
RUN apt-get update && apt-get install -y --no-install-recommends \
    ros-${ROS_DISTRO}-ros-base \
    ros-${ROS_DISTRO}-ament-cmake \
    ros-${ROS_DISTRO}-rclcpp \
    ros-${ROS_DISTRO}-std-msgs \
    ros-${ROS_DISTRO}-sensor-msgs \
    ros-${ROS_DISTRO}-geometry-msgs \
    ros-${ROS_DISTRO}-cv-bridge \
    ros-${ROS_DISTRO}-pcl-conversions \
    ros-${ROS_DISTRO}-realsense2-camera-msgs \
    python3-colcon-common-extensions \
    python3-ament-package \
    && rm -rf /var/lib/apt/lists/*

# ======================== ROS2 环境配置 ========================
# 每次启动 bash 自动 source ROS2 环境
RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /root/.zshrc

ENV AMENT_PREFIX_PATH="/opt/ros/${ROS_DISTRO}"
ENV CMAKE_PREFIX_PATH="/opt/ros/${ROS_DISTRO}:/root/.local/lib/cmake:${CMAKE_PREFIX_PATH:-}"
ENV COLCON_PREFIX_PATH="/opt/ros/${ROS_DISTRO}"
ENV PATH="/opt/ros/${ROS_DISTRO}/bin:${PATH}"
ENV PYTHONPATH="/opt/ros/${ROS_DISTRO}/lib/python3.10/dist-packages:/opt/ros/${ROS_DISTRO}/local/lib/python3.10/dist-packages:${PYTHONPATH:-}"
ENV ROS_VERSION=2
ENV ROS_PYTHON_VERSION=3


CMD ["/bin/zsh"]

docker-compose.yaml示例

services:
  ros2_container:
    image: ros2
    container_name: ros2_communication
    network_mode: host
    ipc: host
    privileged: true
    environment:
      - ROS_DOMAIN_ID=0                      # 指定ROS2通信域编号
      - RMW_IMPLEMENTATION=rmw_fastrtps_cpp  # 指定ROS使用rmw_fastrtps_cpp这种DDS通信
      - FASTDDS_BUILTIN_TRANSPORTS=UDPv4     # 让FastDDS强制使用UDPv4网络传输,避免容器共享内存问题
    volumes:
      - /home/std/workspace/jn_workspace_lgc:/workspace/jn_workspace_lgc
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
    working_dir: /workspace/jn_workspace_lgc
    stdin_open: true
    tty: true
    command: /bin/zsh
  • docker compose up -d
  • docker exec -it ros2_communication /bin/zsh

在容器内启动指令

source /opt/ros/humble/setup.bash
export ROS_DOMAIN_ID=0
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export FASTDDS_BUILTIN_TRANSPORTS=UDPv4
ros2 run demo_nodes_cpp talker

在主机上启动

source /opt/ros/humble/setup.zsh
export ROS_DOMAIN_ID=0
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export FASTDDS_BUILTIN_TRANSPORTS=UDPv4

ros2 topic echo /chatter

更多推荐