前言最近需要在一台 Ubuntu 22.04架构为amd64即电脑嵌入式arm架构等可能不适用 电脑上部署 Docker后续主要用于 ROS2、Franka FR3 机械臂、RealSense 相机等开发环境。本文中的命令均基于实际安装过程整理方便以后重装系统或者配置其他电脑时直接查阅。1. 系统环境本次安装环境可通过命令查看lsb_release -a环境如下2. 卸载可能存在的旧版本Docker如果电脑之前安装过 Docker可以先尝试卸载旧版本或者可能存在冲突的组件没有就跳过这步sudo apt-get remove docker docker-engine docker.io containerd runc我执行时出现E: 无法定位软件包 docker-engine这个问题不用过于担心。docker-engine属于较早期的软件包名称如果当前 Ubuntu 软件源中没有这个软件包就会提示“无法定位软件包”。只要后续 Docker CE 能够正常安装即可。3. 安装必要依赖首先更新APT软件源sudo apt update然后安装后续添加 Docker 软件源需要的工具sudo apt install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release其中软件包作用apt-transport-https支持通过 HTTPS 获取软件包ca-certificates系统 CA 证书curl下载文件和密钥gnupgGPG 密钥处理lsb-release获取 Ubuntu 版本信息4. 配置 Docker GPG 密钥4.1 创建 keyrings 目录从 Ubuntu 20.04 开始旧的apt-key方式已被废弃官方要求将密钥存放在/etc/apt/keyrings目录。执行sudo install -m 0755 -d /etc/apt/keyrings命令解释/etc/apt/keyringsUbuntu 官方推荐的第三方软件密钥存放目录install -d创建目录等价于mkdir -p但更规范-m 0755设置目录权限为 “所有用户可读、可进入”保证 APT 能正常读取密钥4.2 下载 Docker GPG 密钥由于本次电脑网络环境的原因这里采用阿里云 Docker CE 镜像源curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg然后修改权限sudo chmod ar /etc/apt/keyrings/docker.gpg5. 添加阿里云 Docker CE 软件源执行echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/nullUbuntu 22.04 的版本代号为jammy因此后续执行sudo apt update能够看到类似获取1httes://mircors.alixun.com/docker- ce/1inux/ubuntu jammy InRelease获取2 https://mirrors.alixun.com/docker-ce/linux/ubuntu jammy/stable amd64 Packages说明Docker 软件源已经添加成功!6. 安装 Docker安装 Docker Engine、Docker CLI、containerd、Buildx 和 Docker Composesudo apt install -y \ docker-ce \ docker-ce-cli \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin主要组件作用如下软件包作用docker-ceDocker Engine即Docker主程序官方社区版docker-ce-cliDocker 命令行工具containerd.io容器运行时docker-buildx-pluginDocker Buildx 构建工具可以不要docker-compose-pluginDocker Compose V27. 检查 Docker 是否安装成功7.1 查看 Docker 版本docker --version也可以可以查看到更加详细的内容比如构建时间等docker version7.2 查看 Docker Compose现在推荐使用 Docker Compose V2docker compose version8. 运行 hello-world 测试 Docker安装完成后执行sudo docker run hello-world一般来说这样是不行的因为需要访问docker原生官网网络很慢直接无法访问建议配置镜像源9. 配置 Docker 镜像加速由于部分网络环境下直接访问 Docker Hub 速度较慢甚至无法拉取镜像因此可以配置 Registry Mirror。这里需要特别区分两个概念阿里云 Docker CE 软件源 ↓ 用于 apt install docker-ce Docker Registry Mirror ↓ 用于 docker pull ubuntu、hello-world 等镜像二者不是一回事无关紧要啦也可忽略这个信息按照操作步骤来就行9.1 创建 daemon.json直接使用tee写入sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://docker.m.daocloud.io/, https://huecker.io/, https://dockerhub.timeweb.cloud, https://noohub.ru/, https://dockerproxy.com, https://docker.mirrors.ustc.edu.cn, https://docker.nju.edu.cn, https://xx4bwyg2.mirror.aliyuncs.com, http://f1361db2.m.daocloud.io, https://registry.docker-cn.com, http://hub-mirror.c.163.com, https://docker.mirrors.ustc.edu.cn] } EOF9.2 重新启动 Docker修改配置后执行sudo systemctl daemon-reload sudo systemctl restart docker10. 再次运行 hello-world重新启动 Docker 后执行主要是为了验证Docker镜像加速是否配置成功sudo docker run hello-world这次成功下载latest: Pulling from library/hello-world 4f55086f7dd0: Pull complete d5e71e642bf5: Download complete可以看到Docker Engine 已经安装并能够正常拉取和运行容器。11. 解决 Docker 必须使用 sudo 的问题这个地方也困扰了我好久每次执行docker相关命令比如docker images、docker ps -a等都要加上sudo很麻烦。虽然可以通过命令sudo -i临时进入root权限但是每次弄完后还需要执行 exit 退出。我尝试过什么添加用户组 sudo usermod -aG docker $USER还是没摸索投什么还要退出登录放弃了……建议直接执行以下命令进行修改bashrc文件sudo gedit ~/.bashrc可以看到在图片所示部分后面另起一行加入ctrls保存alias dockersudo docker执行以下命令让配置生效source ~/.bashrc12. Docker 常用命令整理Docker 基本信息1查看 Docker 版本docker --version2查看详细版本docker version3查看 Docker 系统信息docker info4查看 Docker Composedocker compose versionDocker 服务管理解决了sudo问题后以下命令可以不加 sudo1查看 Docker 状态sudo systemctl status docker2启动 Dockersudo systemctl start docker3停止 Dockersudo systemctl stop docker4重新启动sudo systemctl restart docker5设置开机自启动sudo systemctl enable docker镜像常用命令1查看本地镜像docker images2拉取镜像docker pull 镜像名如docker pull ubuntu:22.043搜索镜像docker search ubuntu4删除镜像根据镜像名称rmireinforce move imagedocker rmi ubuntu:22.04根据镜像 IDdocker rmi IMAGE_ID5强制删除docker rmi -f IMAGE_ID容器常用命令:1查看正在运行的容器docker ps2查看所有容器包括已经停止的docker ps -a3创建并进入 Ubuntu 容器docker run -it ubuntu:22.04 bash4给容器指定名字docker run --name ubuntu_test -it ubuntu:22.04 bash其中--name ubuntu_test表示容器名称为ubuntu_test-it 表示在终端交互而不会关闭当前终端interact terminator。5后台运行容器docker run -d 镜像名6停止容器docker stop 容器名/容器ID7启动已经存在的容器docker start 容器名8启动并进入容器对于已经存在的交互式容器docker start 容器名 docker exec -it 容器名 bash9退出容器在容器内部执行exit10删除容器docker rm 容器名11强制删除docker rm -f 容器名进入正在运行的 Docker 容器1最常使用docker exec -it 容器名 bash如果容器只有sh就替换 bash 为 sh宿主机与容器之间复制文件1宿主机 → Dockerdocker cp 本地文件 容器名:/目标目录例如docker cp test.txt fr3_dev:/root/2Docker → 宿主机docker cp 容器名:/容器文件路径 本地路径例如docker cp fr3_dev:/root/test.txt ./将容器保存为新的镜像如果已经在容器内部安装了大量软件例如ROS2Franka ROS2librealsenseRealSense ROS2MoveIt编译好的工作空间可以将当前容器保存为新的镜像docker commit 容器名 新镜像名:tag例如docker commit fr3_dev base_docker_franka:jazzy-franka-fr3Docker 镜像导出与导入这对于离线备份非常有用1导出镜像docker save -o 文件名.tar 镜像名:tag例如docker save -o fr3_image.tar base_docker_franka:jazzy-franka-fr32导入镜像docker load -i fr3_image.tarDocker 镜像标签查看镜像docker images1增加新的 tagdocker tag 原镜像:tag 新镜像:tag例如docker tag \ base_docker_franka:jazzy-franka-fr3 \ base_docker_franka:jazzy-franka-fr3-backup需要注意docker tag并不会复制一份完整镜像数据只是给同一个镜像增加一个新的名称/tag。Docker 清理命令删除所有已经停止的容器建议别执行除非你要是想跑路的话~~docker container prune删除未使用的镜像删除空白的那种镜像没有标签和镜像名的docker image prune个人最常用 Docker 命令速查表以后如果只是想快速查命令基本看这一部分即可目的命令查看镜像docker images查看运行中的容器docker ps查看所有容器docker ps -a拉取镜像docker pull image:tag创建交互式容器docker run -it image bash指定容器名字docker run --name NAME -it image bash启动容器docker start NAME停止容器docker stop NAME进入容器docker exec -it NAME bash删除容器docker rm NAME强制删除容器docker rm -f NAME删除镜像docker rmi IMAGE强制删除镜像docker rmi -f IMAGE查看日志docker logs NAME查看详细信息docker inspect NAME宿主机→容器docker cp file NAME:/path/容器→宿主机docker cp NAME:/path/file ./容器保存为镜像docker commit NAME image:tag导出镜像docker save -o image.tar image:tag导入镜像docker load -i image.tar查看磁盘占用docker system df查看 Compose 版本docker compose versionCompose 构建docker compose buildCompose 启动docker compose up -dCompose 停止docker compose down