docker

发布于:2025-02-22 ⋅ 阅读:(14) ⋅ 点赞:(0)

基本介绍

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’命令的作用是:

  1. 使用root权限启动一个Docker容器。
  2. 分配一个伪终端和保持标准输入打开,以便可以与容器内的bash shell交互。
  3. 以特权模式运行容器,以便可以访问特定的硬件资源。
  4. 挂载宿主机的USB设备和特定目录到容器内。
  5. 使用`rknn-toolkit2:2.3.0-cp38`镜像启动容器。
  6. 在容器内启动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方便之处。