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很简单:

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

键入docker后输出类似如下即成功。

如果要安装docker ce的话:

javascript 复制代码
//添加存储库,注意存储库是会变动的,建议去官网查询
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去拉取镜像时,你可能会遇到这个报错:

javascript 复制代码
Docker: Unknown Server OS.

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

javascript 复制代码
///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)

第三个问题

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

javascript 复制代码
docker: Get https://registry-1.docker.io/v2/: net/http: request canceled 

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

javascript 复制代码
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"

然后刷新配置并重启

javascript 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

第四个问题

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

javascript 复制代码
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:

javascript 复制代码
//查看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的再更,目前就这些。

相关推荐
Peter_chq4 小时前
【计算机网络】多路转接之select
linux·c语言·开发语言·网络·c++·后端·select
太阳风暴4 小时前
Ubuntu-修改左Alt和Win键位置关系
linux·ubuntu·修改键盘·键盘映射
kaiyuanheshang5 小时前
docker 中的entrypoint和cmd指令
运维·docker·容器·cmd·entrypoint
Python私教6 小时前
除了 Docker,还有哪些类似的容器技术?
运维·docker·容器
titxixYY6 小时前
SElinux
linux·运维·服务器
Tianyanxiao7 小时前
【探商宝】大数据获客平台在销售型企业中的应用
大数据·经验分享·科技·数据分析
香吧香7 小时前
getent使用小结
linux
杨浦老苏7 小时前
开源无代码网络数据提取平台Maxun
低代码·docker·群晖
麻瓜也要学魔法8 小时前
Linux关于vim的笔记
linux·笔记·vim