wsl2中kali linux下的docker使用教程(教程总结)

一、前言

上一篇关于kali linux的文章是图形界面的配置,这里作者准备补充两点,一点是在使用VNC时,如果F8不能用的话,可以试试Alt+F8;然后就是VNC在初始化设置时的三个设置选项依次是密码、再输一次以及设置仅观看密码。
下面作者将讲述在wsl2中kali linux下的docker的使用,这里还是有很多坑的。

二、介绍docker

首先安装docker时你肯定会有很多疑问,docker为什么会有这么多的版本,作者一开始也是有这样的问题,下面作者将解释docker各个版本的区别:
首先是docker ce与docker io的区别:
Docker CE(Community Edition)和Docker.io在多个方面存在显著的区别。以下是对这两者的详细比较:

** 一、维护方与版本更新**

  1. Docker CE

    • 由Docker官方维护。
    • 更新频率高,包括每个月的安全更新和每季度的功能更新。
  2. Docker.io

    • 通常由Debian团队维护(也可能因系统不同而有所差异,但普遍与Debian或Ubuntu系统紧密相关)。
    • 更新频率相对较低,可能依赖于Debian或Ubuntu的发布周期。

二、依赖管理与安装方式

  1. Docker CE

    • 使用Go语言编写,并自行管理所有依赖项,不依赖于系统的包管理器。
    • 提供了完整的容器化平台,包括Docker守护程序、命令行客户端等必要组件。
  2. Docker.io

    • 依赖apt包管理系统(在基于Debian或Ubuntu的系统上)来管理其依赖项。
    • 安装方式通常通过apt包管理器进行。

三、功能与社区支持

  1. Docker CE

    • 提供了最新的功能和特性,因为官方会快速迭代并发布新版本。
    • 拥有强大的社区支持和丰富的文档资源。
  2. Docker.io

    • 在功能上可能不如Docker CE新,因为更新速度较慢。
    • 在文档和社区支持方面可能相对较少,尽管仍有Debian或Ubuntu社区的支持。

四、适用场景与推荐

  1. Docker CE

    • 适用于刚开始接触Docker以及基于Docker进行应用开发的开发者或小型团队。
    • 提供了完整的容器化平台,更容易获得官方支持和更新。
  2. Docker.io

    • 适用于已经在使用基于Debian或Ubuntu的系统,并且希望保持系统包管理一致性的用户。
    • 如果不需要最新的功能和更新速度,可以选择使用Docker.io。

docker还有个版本是docker EE,和CE区别是CE是社区版,而EE是企业版。
上面的docker ce、ee、io都是docker引擎的非桌面版,而桌面版就是更为熟知的docker desktop,下面是docker的一些组件:

  • docker containerd.io
    是Docker容器运行时的核心组件之一,它负责管理和运行容器。它提供了容器的生命周期管理、镜像管理、网络管理等功能。

  • docker-ce
    是Docker Community Edition的缩写,是Docker的社区版本。它是一个开源的容器化平台,提供了构建、发布和运行容器的工具和服务。广义来说,docker-ce包含了dockerd(Docker守护进程)、docker命令行工具、docker-compose等组件;狭义上来讲,docker-ce 是与 docker containerd.io、docker-ce-cli 并列的服务组件。

  • docker-ce-cli(cli即Client的缩写)
    是Docker Community Edition的命令行工具(command line)。它提供了与Docker守护进程进行交互的命令行接口,可以用于管理和操作Docker容器、镜像、网络等。

  • docker-buildx-plugin
    是Docker的一个插件,用于构建多平台的容器镜像。它可以在一个构建过程中同时构建多个不同平台的镜像,例如x86、ARM等。这样可以方便地为不同平台的设备提供适配的容器镜像。

  • docker-compose-plugin
    是Docker的一个插件,用于管理和编排多个容器的运行。它可以通过一个单独的配置文件定义多个容器之间的关系和依赖,然后通过简单的命令就可以启动、停止、删除这些容器。

  • docker-ce-rootless
    是Docker Community Edition的无根用户版本。它允许非特权用户在没有root权限的情况下运行Docker容器。这样可以提高容器的安全性,减少潜在的安全风险。

  • docker-scan-plugin
    是Docker的一个插件,用于容器镜像的安全扫描。它可以对容器镜像进行静态和动态的安全分析,检测其中的漏洞和风险。这样可以帮助用户及时发现和修复容器镜像中的安全问题。

  • docker-machine-plugin
    Docker Machine是一种工具,可让您在虚拟主机上安装Docker Engine,并使用docker-machine命令管理主机。简单来说就是给你快速创建一个docker容器环境的,如果你要给100台物理机安装上docker,传统方式就是你一台一台ssh上去安装,但是有了docker-machine你可以快速给100台ecs安装上docker。

  • Docker Daemon(守护进程):
    是Docker架构中的核心组件,负责在后台运行并管理Docker容器的生命周期。
    它还负责管理Docker镜像、网络和存储等。
    有时也被称为Docker引擎(Docker Engine)的一部分。

  • Docker 镜像(Image):
    是Docker容器的基础,是一个只读的模板。
    镜像包含了运行应用程序所需的一切,包括代码、运行时、库、配置文件等。
    用户可以从Docker Hub或其他镜像仓库中拉取镜像,也可以根据自己的需求创建自定义镜像。

  • Docker 容器(Container):
    是基于Docker镜像创建的运行时实例。
    每个Docker容器都是相互隔离的,可以在其自己的命名空间中运行。
    容器内包含了应用程序、运行时环境和所有依赖项。

  • Docker Registry(镜像仓库):
    是一个存储和分发Docker镜像的中央存储库。
    可以是公共的,如Docker Hub,也可以是私有的,如企业内部的镜像仓库。
    用户可以在Docker Registry中搜索、下载和上传镜像。

  • Docker Swarm:
    是Docker的内置集群管理器,可以将多个Docker主机组合在一起,形成一个单一的虚拟主机。
    Docker Swarm可以自动化容器的部署、伸缩和故障转移,并支持负载均衡和自动扩展等功能。

  • Dockerfile:
    是用于构建Docker镜像的文本文件,包含了一系列指令,用于描述镜像的构建过程。
    开发者可以通过Dockerfile定义所需的软件环境和配置,然后使用Docker CLI的build命令将其构建成Docker镜像。

  • Docker Network:
    是Docker提供的网络管理工具,用于管理容器之间的通信。
    支持多种网络驱动,包括bridge、overlay、macvlan等,可以满足不同的网络需求。

  • Docker Volume:
    是Docker提供的存储管理工具,用于管理容器的数据卷。
    数据卷可以将容器的数据存储到宿主机或其他容器中,以实现数据共享和持久化。

  • Docker API:
    提供了一套编程接口,允许其他工具或系统与Docker进行集成。

这里再额外介绍一个docker的终端UI管理工具,lazydocker:
LazyDocker 是适用于 Docker 和 Docker Compose 的新的免费开源的终端 UI ,用于显示 Docker 或 Docker-compose 容器的状态,日志以及重新启动/删除/重建容器等,采用 Go 语言编写,使用了 gocui 库。在 Linux 服务器上管理 Docker 容器时,通常有两种选择:安装或部署基于 Web 的 GUI 或从命令行管理容器,而 LazyDocker 介于两者之间,采用了基于 terminal 的 简单 UI。

三、windows上的docker和linux下的docker的区别

docker实际上是Namespace、Cgroups、以及 rootfs 三大技术构建出来的隔离环境,在linux环境上,docker其实是起到了一个启动代理,通过设置一大堆启动参数,给应用进程配置好运行环境;其实docker本身并没有一个独立的运行环境。
Namespace、Cgroups以及rootfs是与容器技术紧密相关的三个核心概念,它们在容器的实现和运行中扮演着重要的角色。以下是对这三个概念的详细解释:

Namespace

  1. 定义:Namespace即“命名空间”,也称“名称空间”,是Linux内核提供的一种资源隔离机制。
  2. 作用:通过将某个特定的资源隔离出来,使得容器内的进程拥有独立的命名空间,从而避免与宿主机或其他容器内的进程产生命名冲突。例如,在容器内,PID(进程ID)为1的进程通常是容器的初始进程,而在宿主机上,PID为1的进程通常是系统的init进程。通过Namespace的隔离,容器内的进程无法看到宿主机或其他容器的进程。(并不是所有资源都能隔离,例如时间,在容器中修改时间会对整个宿主机起作用)
  3. 类型:Linux内核提供了多种类型的Namespace,包括PID Namespace、UTS Namespace(用于隔离主机名和域名)、IPC Namespace(用于隔离进程间通信资源)、Network Namespace(用于隔离网络资源)等。

Cgroups

  1. 定义:Cgroups(Control Groups)是Linux内核提供的一种机制,用于限制、记录和隔离进程组所使用的物理资源。
  2. 作用:通过Cgroups,系统管理员可以将一系列任务及其子任务整合到不同的组内,并为这些组分配特定的资源限制。例如,可以限制某个容器使用的CPU时间、内存大小等。
  3. 实现方式:Cgroups通过内核附加在程序上的一系列钩子(hook)来实现资源追踪和限制。当程序运行时,这些钩子会根据资源调度的需求触发相应的操作,以确保资源的使用不超过预设的限制。

Rootfs

  1. 定义:Rootfs(Root File System)是Linux系统启动时挂载的初始根文件系统。
  2. 作用:Rootfs包含了Linux系统在启动过程中需要使用的所有文件和目录,包括必要的运行库、初始化脚本以及用户空间和内核空间所需的程序和配置文件等。它是系统启动时的第一个文件系统,也是容器内进程运行的基础环境。
  3. 特性:在Linux系统中,rootfs通常是一个只读的文件系统。容器技术通过修改rootfs来创建不同的容器环境,每个容器都有自己独立的根文件系统,从而实现了容器间的文件隔离。

这也解释了为什么docker在windows上需要通过虚拟化层(如Hyper-V或WSL2),而在linux上就可以直接使用linux内核没有额外的开销,也就是说其实docker启动的应用,是直接运行在宿主机的,就像普通的程序一样直接调用宿主机的内核。(docker只启动一个进程的原因)

四、docker的安装

安装docker io很简单:

sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker --now//这条命令在wsl2中没用,后面会解释原因

键入docker后输出类似如下即成功。
在这里插入图片描述
如果要安装docker ce的话:

//添加存储库,注意存储库是会变动的,建议去官网查询
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable" | \ sudo tee /etc/apt/sources.list.d/docker.list 
 //导入gpg密钥
 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 
//安装
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

五、问题

第一个问题

当你尝试sudo systemctl enable docker --now这个命令企图将docker设置为开机运行时,你会发现,systemd这个命令根本用不了,于是我们键入ps -p 1 -o comm=这个命令去查看系统运行的第一个进程,你会发现输出了init,这说明你的系统没有使用systemd,应该使用init命令,也就是说,我们需要用sysvinit命令代替systemctl命令:
在这里插入图片描述
然后你会试图使用chkconfig这个命令再次让docker设置为开机自启,你会发现这个命令在现在的版本中被淘汰了,现在只能用sysv-rc-conf这个命令,但是,作者并没有安装成功这个命令,所以作者除了使用一些间接方法外,目前没有找到能直接让docker变成开机自启的方法。

第二个问题

当你尝试使用docker去拉取镜像时,你可能会遇到这个报错:

Docker: Unknown Server OS.

这个报错可能有多种原因,但往往当你去检查docker的运行状态时你会发现,它根本没运行,也就是sudo service docker start没有报错,但是查状态就是Docker is not running,然后查看日志cat /var/log/docker.log,输出了一堆千奇百怪的东西,作者目前找到的解法是:

///etc/fstab文件是Linux系统中用于存储静态文件系统信息的文件,系统在启动时会自动读取这个文件,以自动挂载磁盘分区等。通常情况下,手动创建或修改这个文件需要谨慎,因为错误的配置可能导致系统无法正常启动。
touch /etc/fstab
//update-alternatives是Debian及其衍生版(如Ubuntu)中的一个工具,用于管理系统中命令的多个版本。这个命令的作用是将iptables命令的默认版本设置为/usr/sbin/iptables-legacy。在某些Linux发行版中,为了兼容旧版本的配置和脚本,可能会提供iptables-legacy版本。这个操作通常在系统升级后,新的iptables版本与旧脚本不兼容时进行。
update-alternatives --set iptables /usr/sbin/iptables-legacy
//这个命令的作用与上一个类似,只不过它是针对ip6tables命令,将其默认版本设置为/usr/sbin/ip6tables-legacy。ip6tables是用于配置IPv6防火墙规则的工具。
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
//再次尝试
sudo service docker start
sudo service docker status

如果你的日志报错和下面的比较像,你可以试试这个:
在这里插入图片描述
来源:thepoy(https://www.cnblogs.com/thepoy/p/16004037.html)

第三个问题

于是你再次尝试拉取镜像,你可能会发现这个报错:

docker: Get https://registry-1.docker.io/v2/: net/http: request canceled 

这个就是网络的问题,最简单的方法就是给docker配置一个代理:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
//添加下面的东西
[Service]
Environment="HTTP_PROXY=你虚拟机网卡的地址:你代理的端口/"
Environment="HTTPS_PROXY=你虚拟机网卡的地址:你代理的端口/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

然后刷新配置并重启

sudo systemctl daemon-reload
sudo systemctl restart docker

第四个问题

再次尝试拉取镜像,你可能又会碰到下面的错误:

Error response from daemon: Get “https://registry-1.docker.io/v2/: dial tcp

这里可能是dns的问题,cat /etc/resolv.conf查看dns客户机的配置文件,如果是8.8.8.8谷歌的dns的话,可以换成114.114.114.114国内的dns。

第五个问题

第五个问题是关于kvm的问题,你可以通过以下命令检查是否支持kvm:

//查看cpu是否支持硬件虚拟化,如果是大于0的数就是可以的
egrep -c '(vmx|svm)' /proc/cpuinfo
//如果是kvm acceleration can be used就是可以的
kvm-ok
//如果返回Y就是可以的
cat /sys/module/kvm_intel/parameters/nested

如果不支持可以去网上搜一搜如何解决,作者这里是支持的,但是在拉取某些镜像时仍然会报错无法加载之类的,暂时没有好的解决方案。这里有篇比较不错的可以参考:https://blog.csdn.net/m0_46161993/article/details/114946221

五、总结

想到更多关于docker的再更,目前就这些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920952.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。 我们可以…

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节:ELBO的类比与核心概念【尽可能通俗】 ELBO,即证据下界,在…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架,旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答: 初级 Java 开发面临的最大瓶颈在于,脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug,久而久之就会发现,自己的技术水平跟刚工作时相比没什么进步。 所以我们…

后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用

目录 后端数据增删改查Springboot 实体(entity)类引进添加UserMapper接口 创建对用的UserController注意数据库查询不一致新增数据更新删除postman测试 后端数据增删改查 基于之前构建系统,实现用户数据的CRUD。 打开navicat16,…

堆外内存泄露排查经历

优质博文:IT-BLOG-CN 一、问题描述 淘宝后台应用从今年某个时间开始docker oom的量突然变多,确定为堆外内存泄露。 后面继续按照上一篇对外内存分析方法的进行排查(jemalloc、pmap、mallocpmap/mapsNMTjstackgdb),但都没有定位到问题。至于…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议: webSocket协议: 1.2WebSocket协议: 1.3客户端(浏览器)实现 1.3.2 WebSocket对象的相关事宜: 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

Vue3 源码解析(三):静态提升

什么是静态提升 Vue3 尚未发布正式版本前,尤大在一次关于 Vue3 的分享中提及了静态提升,当时笔者就对这个亮点产生了好奇,所以在源码阅读时,静态提升也是笔者的一个重点阅读点。 那么什么是静态提升呢?当 Vue 的编译器…

C++优选算法十四 优先级队列(堆)

C 中的优先级队列(Priority Queue)是一种容器适配器,它提供队列的功能,但元素不是按照插入的顺序被访问,而是根据它们的优先级被访问。默认情况下,优先级队列是一个最大堆(Max-Heap)…

综合练习--轮播图

本篇博客将教大家实现一个基础的轮播图。 源代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体

作者&#xff5c;郭源 前言 在后LLM时代&#xff0c;随着大语言模型和多模态大模型技术的日益成熟&#xff0c;AI技术的实际应用及其社会价值愈发受到重视。AI智能体&#xff08;AI Agent&#xff09;技术通过集成行为规划、记忆存储、工具调用等机制&#xff0c;为大模型装上…

光伏电站的智慧施工详解

光伏电站的智慧施工是利用先进的技术和管理方法&#xff0c;提高施工效率、质量和安全性&#xff0c;降低成本&#xff0c;实现光伏电站建设的智能化、数字化和绿色化。 下面从鹧鸪云智慧施工软件详细施工管理的步骤说起。 项目总览 包含我负责的项目、我参与的项目、我创建…

django——创建 Django 项目和 APP

2.创建 Django 项目和 APP 命令&#xff1a; 创建Django项目 django-admin startproject name 创建子应用 python manager.py startapp name 2.1 创建工程 在使用Flask框架时&#xff0c;项目工程目录的组织与创建是需要我们自己手动创建完成的。 在django中&#xff0c;…

李春葆《数据结构》-课后习题代码题

一&#xff1a;假设不带权有向图采用邻接矩阵 g 存储&#xff0c;设计实现以下功能的算法&#xff1a; &#xff08;1&#xff09;求出图中每个顶点的入度。 代码&#xff1a; void indegree(MatGraph g){int i,j,n;printf("各个顶点的入度&#xff1a;\n");for(i…

wsl安装

一. wsl简介 1. wsl和wsl2的区别 wsl需要把linux命令翻译为windows命令&#xff0c;性能差一些。 wsl2直接使用linux内核&#xff0c;不需要翻译&#xff0c;性能好&#xff0c;但开销相对大一点&#xff0c;因为需要多运行一个hyper-v虚拟机 (并非完整的虚拟机&#xff0c;是…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

GPT中转站技术架构

本文介绍阿波罗AI中转站&#xff08;https://api.ablai.top/&#xff09;的技术架构&#xff0c;该中转API的技术架构采用了分布式架构、智能调度和API中转等技术&#xff0c;确保了全球范围内的高效访问和稳定运行。以下是对该技术架构的详细分析&#xff1a; 分布式架构 分…

远程服务器Docker使用本地代理加速访问外部资源

Docker在pull镜像的时候非常缓慢&#xff0c;但是远程主机没有安装代理&#xff0c;就很为难&#xff0c;现在分享一个可以让远程服务器使用本地代理加速的方法 配置Docker代理 新建文件夹 mkdir -p /etc/systemd/system/docker.service.d 切换到这个文件夹里 cd /etc/system…

【详解】树链剖分之重链剖分

终于搞懂了树链剖分的一些皮毛了…… 树链剖分 “树链剖分”&#xff0c;顾名思义&#xff0c;就是把一棵树剖分成一条条的链…… 重链剖分 重链剖分的基本概念 重链剖分是树链剖分的一种&#xff0c;它会把树剖分成一条条重链…… 什么是重链呢&#xff1f; 重链就是连接…