部分文档参考博主:
保护我方胖虎 :(https://blog.csdn.net/leilei1366615/article/details/106267225)
GritYearner: (https://blog.csdn.net/GritYearner/article/details/133679403)
1. 安装Docker
可以直接参看官网,docker安装(https://docs.docker.com/engine/install/ubuntu/)
ubuntu22.04的docker安装教程
1. 设置 Docker 的apt存储库。
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
2. 安装 Docker包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. 通过运行映像来验证 Docker Engine 安装是否成功 hello-world
sudo docker run hello-world
2. 安装GPU驱动
(1)安装教程:
docker的英伟达驱动:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
(2)测试GPU是否能用
ubuntu22.04镜像,并创建一个运行一次即删除的容器,注意cuda版本
其他版本ubuntu,可以从docker hub上搜索nvidia/cuda
sudo docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
3. 构建ROS2的容器
1. 使用的鱼香博主的ROS构建 鱼香博主的网站 ,对于构建ROS2十分方便,一键安装。
sudo docker run -dit \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=all \ #设置 NVIDIA 驱动程序的能力标识,允许使用所有 GPU 驱动功能,如图形、视频编码、解码等。
--name=melodic_docker2 \ #为容器指定一个名称 melodic_docker2,以便于识别和管理。
-v /home/hw/test1:/home/hw/test1 \ #将主机目录 /home/hw/test1 挂载到容器内的相同路径 /home/hw/test1,实现主机和容器之间的文件共享。
-v /tmp/.X11-unix:/tmp/.X11-unix \ #将主机的 X11 socket 文件夹挂载到容器内,允许容器内的 GUI 应用程序与主机的 X11 服务通信,实现图形界面显示。
-v /dev/dri:/dev/dri \ #挂载主机的 Direct Rendering Infrastructure (DRI) 设备,使得容器可以直接访问主机的 GPU 渲染设备。
--device=/dev/snd \ #将主机的音频设备映射到容器内,允许容器内应用访问音频设备进行输入输出。
--device=/dev/dri/renderD128 \ #具体映射一个 GPU 渲染设备(/dev/dri/renderD128),通常用于确保容器可以访问特定的渲染设备。
-e DISPLAY=unix$DISPLAY \ #设置环境变量 DISPLAY,用于 GUI 应用程序与 X11 服务通信。这通常设置为主机的显示环境,以便在容器中运行 GUI 程序。
-w /home/hw/test1 fishros2/ros:melodic-desktop-full #设置容器启动后的工作目录为 /home/hw/test1。 指定要运行的 Docker 镜像,fishros2/ros:melodic-desktop-full 是基于 ROS Melodic 的桌面完全版镜像,包含了 ROS 的完整桌面环境及相关工具。
换其他镜像,只需要改最后一行位置即可
sudo docker run -dit \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
--name=melodic_docker2 \
-v /home/hw/test1:/home/hw/test1 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /dev/dri:/dev/dri \
--device=/dev/snd \
--device=/dev/dri/renderD128 \
-e DISPLAY=unix$DISPLAY \
-w /home/hw/test1 fishros2/ros:melodic-desktop-full
-v:是把宿主机的目录挂载到容器中,/home/用户名 需要自己需要访问的路径。最好不要访问本机的主目录
–name:是容器名称,修改为自己的,需要记住后面还要用到
2. 运行docker 写入ROS的环境变量
docker exec -it melodic_docker2 /bin/bash -c "echo -e '
source /opt/ros/melodic/setup.bash' >> ~/.bashrc"
docker exec -it melodic_docker2 /bin/bash #进入终端
- 测试rviz 能否打开
#开两个终端
roscore
rviz
4. 将现有容器保存为镜像
ros2_nightly_docker 是你想要保存为镜像的容器名称。
my_ros2_image 是你想要创建的新镜像的名称。你可以根据需要替换成其他有意义的名称。
sudo docker commit ros2_nightly_docker my_ros2_image
sudo docker images #查看已保存的镜像列表
5. 基本常识
- 镜像网站:https://hub.docker.com/search?q=&type=image
(一)docker 基础命令
systemctl start docker #启动docker
systemctl stop docker #关闭docker
systemctl restart docker #重启docker
systemctl enable docker #docker设置随服务启动而自启动
systemctl status docker #查看docker运行状态
docker version #查看docker 版本号信息
docker info #查看docker 版本号信息
(二)docker 镜像命令
docker image ls # 列出已经下载下来的镜像
docker system df #查看镜像、容器、数据卷所占用的空间
docker image ls ubuntu #根据仓库名列出镜像 ubuntu就是仓库名
docker image ls ubuntu:18.04 #列出特定的某个镜像,也就是说指定仓库名和标签
拉取镜像
docker pull ubuntu:22.04 #拉取官方的ubuntu 22.04镜像
搜索镜像
docker search 镜像名
docker search ubuntu #要搜索Ubuntu 相关的镜像,如果需要特定服务或应用程序的镜像,如 Nginx、MySQL、PostgreSQL等,可以选择对应的镜像。
删除镜像 ------当前镜像没有被任何容器使用才可以删除
#1. 删除一个
docker rmi -f 镜像名/镜像ID
#2. 删除多个 其镜像ID或镜像用#用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
#3.删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
#4.强制删除镜像
docker image rm 镜像名称/镜像ID
保存镜像 将保存为tar 压缩文件
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
docker save tomcat -o /myimg.tar
加载镜像,从一个本地的 tar 文件中加载镜像
docker load -i 镜像保存文件位置
镜像标签
#不同的标签可以用于标识同一个镜像的不同版本。
#例如,ubuntu:18.04 和 ubuntu:20.04 分别表示 Ubuntu 18.04 和 Ubuntu 20.04 版本的镜像
(三)docker 容器命令
docker ps #查看正在运行容器列表
docker ps -a #查看所有容器 -----包含正在运行 和已停止的
运行交互式的容器
# 为容器指定名称 my_ubuntu_container,ubuntu:22.04:使用的镜像
docker run -it --name my_ubuntu_container ubuntu:22.04
# -i:交互模式(interactive),保持标准输入打开。
# -t:伪终端(pseudo-TTY),分配一个伪终端。
后台运行容器
```bash
docker run -d --name my_ubuntu_container ubuntu:22.04 sleep infinity
进入运行中的容器
docker exec -it my_ubuntu_container bash #my_ubuntu_container 容器名
停止、删除和重启容器
docker stop my_ubuntu_container #停止docker stop 容器名/容器ID
docker rm 容器ID/容器名 #删除
docker restart 容器ID/容器名 #重启容器
容器文件拷贝
#从容器内 拷出
docker cp 容器ID/名称: 容器内路径 容器外路径
#容器名称是 my_container,你想将容器中的 /root/example.txt 文件拷贝到主机的当前目录:
docker cp my_container:/root/example.txt ./
#从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称: 容器内路径
#将主机上的 /tmp/myfolder 目录拷贝到容器的 /root/ 目录:
docker cp /tmp/myfolder my_container:/root/
更换容器名
docker rename 容器ID/容器名 新容器名
-p 8888:6379 解析 将容器内部的 6379端口与docker 宿主机(docker装在哪台服务器 哪台服务器就是宿主机)8888 端口进行映射 那通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口了
容器端口与服务器端口映射
-p 宿主机端口:容器端口
docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
进入容器内部,修改其配置文件
进入容器方式一
docker exec -it 容器名/容器ID /bin/bash
#进入 前面的 redis001容器
docker exec -it redis001 /bin/bash
进入容器方式二 —推荐使用 exec 方式
docker attach 容器名/容器ID
从容器内部退出到宿主服务器
exit #使用 Ctrl + D 快捷键退出容器 Ctrl + p + q
(四)数据挂载
将卷挂载到容器
docker volume create myvolume #创建卷,myvolume: 这是卷的名称。
#运行容器并指定镜像 将名为 myvolume 的卷挂载到容器内的 /data 目录。
#本地镜像没有标签 就直接redis 即可。
docker run -itd --name mycontainer -v myvolume:/data redis:5.0.5
(五)提交镜像
6. 拉取Docker镜像
docker pull osrf/ros2:nightly-rmw-nonfree #拉取镜像
docker run -it --name my_ubuntu_container 851d044d63e7 #运行镜像
docker exec -it <container_id_or_name> /bin/bash #再次进入交互式界面
source /opt/ros/humble/setup.bash