1. 安装

安装依赖

sudo apt update
sudo apt install -y ca-certificates curl

下载 GPG 密钥

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc 

安装 Docker

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] http://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2. 更改权限

省去普通用户执行Docker命令需要添加sudo的步骤,将用户添加到Docker用户组

查看用户组

grep docker /etc/group

添加当前用户

sudo usermod -aG docker $USER

让新的组权限生效

  1. 注销后重新登录
  2. 打开一个新的终端窗口
  3. 执行newgrp docker

3. 获取镜像、容器用于开发

3.1 从docker hub拉取镜像

执行

docker pull osrf/ros:noetic-desktop-full-focal

:前为镜像名称,:后为相应的标签

查看镜像

docker images

3.2 根据镜像创建容器

创建并启动一个新的容器

docker run [OPTIONS] IMAGE

参数说明

  • -d: 后台运行容器并返回容器 ID。
  • -it: 交互式运行容器,分配一个伪终端
  • --name: 给容器指定一个名称
  • -p: 端口映射,格式为 host_port:container_port
  • -v: 挂载卷,格式为 host_dir:container_dir
  • --rm: 容器停止后自动删除容器
  • --env-e: 设置环境变量
  • --network: 指定容器的网络模式
  • --restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)
  • -u: 指定用户
  • --gpus 指定使用的GPU

参考指令

docker run -it 
--name ros1_noetic 
--gpus all 
--net=host 
-e DISPLAY=$DISPLAY 
-v /tmp/.X11-unix:/tmp/.X11-unix 
ros1_noetic_img

查看容器

docker ps -a

3.3 进入容器

docker exec -it ros1_noetic /bin/bash

3.4 删除

# 删除镜像
docker rmi ID

# 删除容器
docker rm ID

4. 获取镜像、容器用于部署

此操作需要借助Dockerfiledocker-compose.yml,即将配置写入文件中,文件目录推荐为

├── docker-compose.yml
├── Dockerfile
└── code

Dockerfile中定义镜像构建的操作

参考内容

FROM osrf/ros:noetic-desktop-full-focal

SHELL ["/bin/bash", "-c"]

RUN apt-get update && apt-get install -y \
    libglfw3-dev \
    libglew-dev

WORKDIR /root/code

COPY doce /root/code

RUN echo "source /opt/ros/noetic/setup.bash" >> /root/.bashrc

RUN cd /root/code/Livox-SDK2 && \
    mkdir build && cd build &&\
    cmake .. && \
    make -j && \
    make install

RUN source /opt/ros/noetic/setup.bash && \
    cd /root/exploration/C2-Explorer && \
    catkin_make -DCATKIN_WHITELIST_PACKAGES="livox_ros_driver2"  -DROS_EDITION=ROS1 && \
    catkin_make -DCATKIN_WHITELIST_PACKAGES="fast_lio"  && \
    catkin_make -DCATKIN_WHITELIST_PACKAGES=""

docker-compose.yml中定义镜像的命名和容器的属性

参考内容


services:
  ros1_noetic:
    build: .
    image: c2_explorer:latest
    container_name: c2_explorer
    network_mode: host

    environment:
      - DISPLAY=${DISPLAY}

    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix

    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

    stdin_open: true
    tty: true

构建镜像

docker compose build

创建容器

docker compose up -d

5. 启动显卡支持

需要在宿主机安装NVIDIA显卡驱动,然后安装NVIDIA Container Toolkit

添加 NVIDIA Container Toolkit 的仓库密钥和源列表

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

更新系统包列表,然后安装 NVIDIA Container Toolkit

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

重启 Docker 服务

sudo systemctl restart docker

创建容器时使用--gpus all参数

6. X11转发

创建容器时使用-e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix

宿主机可能还需要执行xhost +local:docker

7. cpu架构

docker镜像会区分cpu架构的,可以执行

docker image inspect IMAGE --format '{{.Os}}/{{.Architecture}}'

IMAGE用相关的镜像名替换,输出的结果即为支持的cpu架构

想要拉取对应架构的镜像可以在docker pull后增加--platform linux/arm64参数

8. 通过镜像文件构建镜像

在能联网的机器上下载镜像文件

docker pull --platform linux/arm64 arm64v8/ros:noetic-perception-focal
docker save arm64v8/ros:noetic-perception-focal -o ros_noetic_perception_arm64.tar

然后传到对应主机上,在目标主机上构筑镜像

docker load -i ros_noetic_perception_arm64.tar

9. 换源

DockerfileSHELL后面添加相关内容

9.1 apt换源

对于arm架构

# Ubuntu ARM64 清华源
RUN cat > /etc/apt/sources.list <<'EOF'
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
EOF

对于amd架构

# Ubuntu AMD64 清华源
RUN cat > /etc/apt/sources.list <<'EOF'
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
EOF

9.2 ros换源

# ROS 清华源
RUN if [ -f /etc/apt/sources.list.d/ros1-latest.list ]; then \
        sed -i \
        's|http://packages.ros.org/ros/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu|g' \
        /etc/apt/sources.list.d/ros1-latest.list; \
    fi