基本介绍
Docker 是一个开源的应用容器引擎,它允许开发者和系统管理员打包应用及其环境依赖,然后在任何支持Docker的平台上无缝运行。
核心概念
- 容器(Container):容器是Docker的核心概念,它是一个轻量级、可移植的计算环境,包含了运行应用所需的所有文件、库、框架和工具。容器与传统的虚拟机相比,启动快,资源占用少。
- 镜像(Image):镜像是容器的静态模板,包含了创建容器所需的文件系统。镜像是只读的,可以从仓库中获取,也可以自己创建。
- 仓库(Registry):仓库是存储镜像的地方,可以是公开的,如Docker Hub,也可以是私有的。开发者和用户可以从仓库中拉取或推送镜像。
特点
- 轻量级:容器直接运行在操作系统的内核上,不需要额外的操作系统层,因此比传统的虚拟机更轻量级。
- 可移植性:容器可以在任何支持Docker的操作系统上运行,不受底层硬件或操作系统的限制。
- 快速部署:容器可以快速创建、启动和停止,大大缩短了应用程序的部署时间。
- 环境一致性:通过容器,开发、测试和生产环境可以保持一致,避免了环境差异导致的问题。
- 资源隔离:每个容器都运行在自己的命名空间中,实现了资源的隔离,容器之间不会相互干扰。
应用场景
- 开发环境一致性:确保开发、测试和生产环境的一致性,提高开发效率。
- 自动化测试和持续集成:通过Docker可以自动化构建、测试和部署应用程序。
- 微服务架构:容器化微服务,便于管理和扩展。
- 服务编排:使用如Docker Compose等工具,可以轻松管理多个容器的协同工作。
ps:相当于你们window系统开一个虚拟机,虚拟机上可以是window系统也可以是Linux系统,但是!!!虚拟机和docker还是有一定的区别的。
虚拟机vm和docker区别
虚拟机(VM)和Docker是两种不同的技术,它们都实现了资源的隔离和应用的部署,但它们的工作方式和设计理念有所不同。
虚拟化层级
- 虚拟机:虚拟化发生在硬件层面,通过Hypervisor(如VMware、VirtualBox或KVM)模拟出完整的硬件系统,每个虚拟机都运行在自己的操作系统之上。
- Docker:虚拟化发生在操作系统层面,Docker利用宿主机的操作系统内核,通过容器技术提供隔离环境,容器直接运行在宿主机的内核上。
资源占用
- 虚拟机:因为每个虚拟机都有自己的操作系统,所以它们会占用更多的CPU、内存和磁盘资源。
- Docker:容器共享宿主机的操作系统,因此资源占用较少,它们更轻量级。
启动速度
- 虚拟机:启动一个虚拟机通常需要几分钟,因为它需要加载和启动一个完整的操作系统。
- Docker:容器可以在秒级启动,因为它们不需要启动操作系统,只需启动应用程序和必要的依赖。
隔离性
- 虚拟机:虚拟机提供了较强的隔离性,每个虚拟机都是一个完整的系统,彼此之间不会相互干扰。
- Docker:容器的隔离性相对较弱,因为它们共享宿主机的内核。尽管Docker通过命名空间和cgroups提供了隔离,但它不如虚拟机那么严格。
可移植性
- 虚拟机:虚拟机通常绑定到特定的虚拟化软件和硬件上,虽然它们可以在不同的虚拟化平台上运行,但可移植性相对较差。
- Docker:容器具有很高的可移植性,可以在任何支持Docker的环境中运行,不受底层硬件或操作系统的限制。
部署和管理
- 虚拟机:虚拟机的部署和管理通常较为复杂,需要考虑操作系统的兼容性、资源分配和虚拟化软件的配置。
- Docker:Docker容器的部署和管理相对简单,通过Dockerfile和Docker Compose可以快速定义和部署应用程序。
应用场景
- 虚拟机:适合运行多个不同的操作系统,或者需要完全隔离环境的场景。
- Docker:适合微服务架构、快速部署、持续集成和持续部署等场景。
docker架构图
组成部分
Docker 客户端(Docker Client)
用户通过 Docker 客户端发送命令,这些命令通过 RESTful API 或 Unix Socket 与 Docker 守护进程通信。
Docker 守护进程(Docker Daemon)
接收并处理来自客户端的请求。
管理容器、镜像、存储和网络等。
Docker 镜像(Docker Image)
作为容器的构建基础,提供了容器运行时所需的静态文件系统。
Docker 容器(Docker Container)
镜像的运行实例,在宿主机的内核上运行,提供隔离的运行环境。
Docker 仓库(Docker Registry)
用于存储和分发 Docker 镜像的服务。
Docker Client 与 Docker Daemon 之间的双向箭头表示命令请求和操作结果的交互。
Docker Daemon 与 Docker Images 之间的连接表示守护进程管理镜像,包括拉取、构建和删除镜像。
Docker Daemon 与 Docker Containers 之间的连接表示守护进程创建和管理容器的运行状态。
Docker Images 与 Docker Containers 之间的连接表示容器是基于镜像创建的。
Docker Daemon 与 Docker Registry 之间的连接表示守护进程可以与仓库交互,下载或推送镜像。
docker安装
更新
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
配置docker的apt源码
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.ustc.edu.cn/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-get update
下载docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
建立文件
sudo mkdir -p /etc/docker
配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.086181.xyz","https://docker.salty.eu.org"]
}
EOF
重新加载系统的守护进程配置
sudo systemctl daemon-reload
重启Docker服务
sudo systemctl restart docker
检验安装是否成功
sudo docker run hello-world
出现以上情况即运行成功
docker安装镜像
我要给我的docker安装自己需要的镜像
安装镜像
sudo docker load -i rknn-toolkit2-v2.3.0-cp38-docker.tar.gz
查看目前所完成的镜像
进入docker
sudo docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v /home/uisrc/mlknpu/rknn_model_zoo:/rknn_model_zoo rknn-toolkit2:2.3.0-cp38 /bin/bash
这个指令有点长,我大概解释一下
这个命令用于启动一个Docker容器,并运行一个交互式bash会话。以下是命令的详细解释:
- sudo: 这个命令允许以超级用户(root)权限执行后续的命令。因为Docker守护进程通常需要root权限来管理容器。
- docker run: 这是Docker的基本命令,用于创建并启动一个新的容器。
- -t: 这个选项告诉Docker为容器分配一个伪终端(pseudo-TTY),使得容器内的程序可以接收键盘输入并显示输出。
- -i: 这个选项让容器的标准输入(stdin)保持打开,即使没有附加任何输入。
- --privileged: 这个选项使容器以特权模式运行。这意味着容器可以访问宿主机的某些特权资源,比如设备驱动。这通常用于需要访问硬件设备的容器。
- -v /dev/bus/usb:/dev/bus/usb: 这个选项是用于挂载宿主机的`/dev/bus/usb`目录到容器内的相同路径。这样做通常是为了让容器内的程序可以访问宿主机的USB设备。
- -v /home/uisrc/mlknpu/rknn_model_zoo:/rknn_model_zoo: 这个选项使用了卷挂载(volume mount),它将宿主机的`/home/uisrc/mlknpu/rknn_model_zoo`目录挂载到容器内的/rknn_model_zoo目录。这允许容器内的程序访问或修改宿主机的文件系统上的这些文件。
- rknn-toolkit2:2.3.0-cp38: 这是你要运行的Docker镜像的名称和标签。这个镜像可能是用于Rockchip RKNN(Rockchip Neural Network)工具包的,版本为2.3.0,编译为Python 3.8。
- /bin/bash: 这是容器内要执行的命令。在这个例子中,它启动了一个bash shell,允许用户与容器内的系统进行交互。
综合起来,‘sudo docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v /home/uisrc/mlknpu/rknn_model_zoo:/rknn_model_zoo rknn-toolkit2:2.3.0-cp38 /bin/bash’命令的作用是:
- 使用root权限启动一个Docker容器。
- 分配一个伪终端和保持标准输入打开,以便可以与容器内的bash shell交互。
- 以特权模式运行容器,以便可以访问特定的硬件资源。
- 挂载宿主机的USB设备和特定目录到容器内。
- 使用`rknn-toolkit2:2.3.0-cp38`镜像启动容器。
- 在容器内启动bash shell,允许用户进行交互操作。
docker实验
我介绍一下刚刚安装的镜像,那个镜像是瑞芯微提供的,带rknn模型转换工具的,我们来检查一下rknn工具
python3
from rknn.api import RKNN
RKNN(verbose=True)
工具检查完毕,我们来试试模型转换
如果下面看不懂的话,建议看看我前面文章npu
打开到该路径下
cd /rknn_model_zoo/examples/yolov5/model
下载onnx模型
./download_model.sh
下在完成后,我们切换路径
cd ../python/
然后进行模型转换
python convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu.rknn
模型转换成功
切换路径看一下
cd ../model
我们看到rknn模型,我们不需要安装转换模型工具,不需要任何环境部署,直接在dockers镜像配好环境下进行模型转换。这就是docker方便之处。