docker
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
让新的组权限生效
- 注销后重新登录
- 打开一个新的终端窗口
- 执行
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. 获取镜像、容器用于部署
此操作需要借助Dockerfile和docker-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. 换源
在Dockerfile 中SHELL后面添加相关内容
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本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雯欂の修仙笔记!