为什么需要DOCKER
- 环境一致性保障
- 开发与生产环境统一:在软件开发过程中,开发环境和生产环境的差异常常导致应用程序出现问题。例如,开发人员在自己的机器上开发了一个 Web 应用,使用了特定版本的操作系统、数据库和编程语言运行时环境。当把这个应用部署到生产服务器上时,如果生产环境的配置稍有不同,可能会出现兼容性问题,如库版本不一致、系统设置差异等。而 Docker 可以将应用及其所有依赖打包成一个容器。这个容器在任何安装了 Docker 的环境中都能以相同的方式运行,确保了从开发到测试再到生产环境的一致性。
- 跨团队协作便利:对于大型项目,不同的团队可能负责不同的部分。例如,一个团队负责后端开发,另一个团队负责前端开发。每个团队的开发环境设置可能会很复杂,并且相互之间需要协同工作。使用 Docker,各个团队可以将自己的应用部分封装在容器中,其他团队可以很容易地拉取并运行这些容器,从而在相同的环境下进行集成测试,避免了因环境差异导致的集成问题。
- 资源高效利用
- 轻量级特性:与传统的虚拟机相比,Docker 容器更加轻量级。虚拟机需要为每个实例安装完整的操作系统,这会占用大量的磁盘空间和内存资源。而 Docker 容器共享主机操作系统的内核,多个容器可以在同一主机上运行,只需要为每个容器分配应用程序运行所需的资源。例如,一个简单的 Node.js 应用容器可能只需要几十 MB 的内存和少量的 CPU 资源就可以正常运行,而虚拟机可能需要几百 MB 甚至更多的内存。
- 快速启动和停止:由于容器不需要像虚拟机那样进行完整的操作系统启动过程,其启动和停止速度非常快。一个 Docker 容器可以在几秒钟内启动,这对于需要快速扩展或收缩应用服务的场景非常有利。例如,在应对突发的流量高峰时,可以快速启动多个容器来处理请求,流量下降后又可以迅速停止这些容器,节省资源。
- 应用隔离与安全性
- 进程隔离:Docker 容器为应用提供了良好的隔离性。每个容器都有自己独立的文件系统、进程空间和网络配置。这意味着即使一个容器中的应用出现故障或被攻击,也不会轻易影响到其他容器中的应用。例如,在一个运行多个微服务的系统中,一个微服务所在的容器由于代码漏洞被黑客攻击,攻击者很难通过这个容器访问到其他微服务所在的容器,因为容器之间的进程和文件系统是隔离的。
- 安全机制增强:Docker 本身也提供了一些安全机制,如容器间的访问控制、安全策略配置等。可以通过配置网络策略,限制容器之间的通信方式和权限,从而提高整个系统的安全性。例如,可以设置只有特定的容器可以访问数据库容器,防止未经授权的容器对数据库进行操作。
- 易于部署和迁移
- 部署简单:将应用打包成 Docker 容器后,部署变得非常简单。无论是在本地服务器、云服务器还是混合云环境中,只要安装了 Docker,就可以通过简单的命令将容器部署到目标环境中。例如,要将一个 Web 应用容器部署到云端的服务器上,只需要将容器镜像推送到云端的镜像仓库,然后在云端服务器上拉取并运行这个镜像即可。
- 迁移方便:当需要将应用从一个环境迁移到另一个环境时,使用 Docker 容器也很方便。因为容器包含了应用及其所有依赖,只要目标环境支持 Docker,就可以轻松地将容器迁移过去,而不需要重新配置复杂的环境和依赖关系。例如,从企业内部的数据中心迁移到公有云环境,只需要确保公有云环境中有 Docker 运行环境,然后将容器镜像迁移过去并运行即可。
在 Kali 中安装 Docker 可以按照以下步骤进行操作:
- 更新软件包列表:打开终端,运行以下命令更新软件包列表:
sudo apt update
- 安装依赖包:运行以下命令安装 Docker 所需的依赖包:
sudo apt install -y curl gnupg2 apt-transport-https software-properties-common ca-certificates
- 导入 Docker GPG 秘钥:运行以下命令导入 Docker GPG 秘钥:
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
- 添加 Docker 存储库:运行以下命令将 Docker 存储库添加到 Kali 系统中:
echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" | sudo tee /etc/apt/sources.list.d/docker.list
- 更新 apt 包索引:运行以下命令更新 apt 包索引:
sudo apt update
- 安装 Docker:运行以下命令安装 Docker:
sudo apt install docker-ce docker-ce-cli containerd.io
- 查看 Docker 版本:运行以下命令查看 Docker 版本:
docker version
- 启动 Docker 服务:运行以下命令启动 Docker 服务:
sudo systemctl start docker
- 设置开机自启:运行以下命令设置 Docker 服务开机自启:
sudo systemctl enable docker
安装完成后,你就可以在 Kali 中使用 Docker 了。
Docker和虚拟机的区别
- 架构层面
- Docker:
- Docker 是基于容器技术的。容器共享宿主机的操作系统内核,在操作系统层面进行隔离。例如,在一个 Linux 主机上运行多个 Docker 容器,这些容器共享主机的 Linux 内核,容器内的应用程序通过内核提供的隔离机制(如 cgroups 和 namespaces)来实现资源隔离和独立运行环境。这使得容器非常轻量级,启动速度快,因为不需要像虚拟机那样加载完整的操作系统。
- 虚拟机(VM):
- 虚拟机是通过 Hypervisor(如 KVM、VMware 等)来模拟完整的硬件环境,在这个模拟的硬件环境上安装独立的操作系统。例如,在一台物理主机上可以通过虚拟机软件安装 Windows、Linux 等不同操作系统的虚拟机。每个虚拟机都有自己独立的操作系统内核、虚拟的 CPU、内存、硬盘等硬件资源,虚拟机之间是完全隔离的,就像多台独立的物理机器一样。这种架构使得虚拟机相对比较笨重,启动时间较长。
- Docker:
- 资源利用
- Docker:
- 由于容器共享内核,其资源占用非常少。例如,一个简单的 Node.js 应用的 Docker 容器可能只需要几十 MB 的内存就可以启动并运行,而且容器的大小也相对较小,因为不需要包含完整的操作系统文件。在资源利用上,Docker 可以在同一台主机上密集地部署多个容器,能够更高效地利用主机的 CPU、内存和磁盘资源。
- 虚拟机(VM):
- 虚拟机因为每个实例都有自己完整的操作系统,所以资源占用量较大。一个普通的 Linux 虚拟机可能需要几百 MB 甚至数 GB 的内存来运行,而且虚拟机的镜像文件通常也比较大,包含了完整的操作系统和应用程序。这就导致在一台主机上能够同时运行的虚拟机数量相对较少,资源利用效率不如 Docker 容器。
- Docker:
- 性能表现
- Docker:
- 容器的性能损耗相对较小。因为容器直接使用主机的内核,在进程调度、文件系统访问等方面的开销较低。例如,在进行网络通信时,容器和主机之间的网络性能损耗较小,容器之间的通信速度也比较快,能够更快地响应应用请求,提供更高的性能。
- 虚拟机(VM):
- 虚拟机由于需要经过 Hypervisor 层进行硬件模拟和指令转换,会有一定的性能损耗。例如,在进行 I/O 操作或者 CPU 密集型任务时,虚拟机的性能可能会受到较大影响,因为数据需要在虚拟机的操作系统、Hypervisor 和物理硬件之间进行多次转换和传输,导致响应时间延长和性能下降。
- Docker:
- 隔离程度与安全性
- Docker:
- 虽然容器之间有一定的隔离性,通过 namespaces 可以隔离进程、网络、文件系统等,但这种隔离是基于操作系统层面的。如果主机操作系统内核出现安全漏洞,可能会影响到所有容器。不过,Docker 也提供了一些安全机制,如 AppArmor、SELinux 等来增强容器的安全性。
- 虚拟机(VM):
- 虚拟机的隔离性很强,因为每个虚拟机都有自己独立的操作系统和硬件环境。即使一个虚拟机被攻击或者出现故障,通常不会影响到其他虚拟机。这种隔离程度使得虚拟机在安全性方面具有一定的优势,尤其是在处理多租户环境或者对安全要求较高的应用场景中。
- Docker:
- 部署和迁移便利性
- Docker:
- Docker 容器的部署非常便捷。可以通过简单的
docker pull
(拉取镜像)和docker run
(运行容器)命令来快速部署一个应用容器。容器镜像可以很方便地在不同的 Docker 环境中迁移,只要目标环境有 Docker 运行支持,就可以轻松地将容器从开发环境迁移到测试环境、生产环境等。
- Docker 容器的部署非常便捷。可以通过简单的
- 虚拟机(VM):
- 虚拟机的部署相对复杂。需要先创建虚拟机实例,安装操作系统,配置各种硬件资源和网络设置,然后才能在虚拟机内安装应用程序。在迁移时,由于虚拟机包含完整的操作系统和硬件配置,需要考虑不同硬件平台的兼容性等问题,迁移过程相对复杂,可能需要使用专门的迁移工具来确保虚拟机在新环境中能够正常运行。
- Docker:
docker常用命令
- 镜像相关命令
- docker pull
- 功能:从镜像仓库(如 Docker Hub)拉取镜像。
- 示例:
docker pull ubuntu:latest
,这条命令会从仓库中拉取最新版本的 Ubuntu 镜像。如果要拉取特定版本,例如 MySQL 8.0.30,可以使用docker pull mysql:8.0.30
。
- docker images
- 功能:列出本地已下载的镜像。
- 示例:
docker images
会显示本地镜像的列表,包括镜像名称、标签、镜像 ID、创建时间和大小等信息。
- docker build
- 功能:根据
Dockerfile
构建镜像。 - 示例:假设在当前目录下有一个
Dockerfile
,要构建一个名为my - app
,标签为v1
的镜像,可以使用docker build -t my - app:v1.
命令。其中,-t
用于指定镜像的标签(名称和版本)。
- 功能:根据
- docker rmi
- 功能:删除本地镜像。
- 示例:
docker rmi image - id
,其中image - id
是要删除镜像的 ID(可以通过docker images
命令获取)。如果要删除一个名为my - old - app:v1
的镜像,且该镜像没有被容器使用,可以使用docker rmi my - old - app:v1
。
- docker pull
- 容器相关命令
- docker create
- 功能:创建一个容器,但不启动它。
- 示例:
docker create --name my - container - ubuntu:latest
,此命令创建一个基于ubuntu:latest
镜像的名为my - container
的容器。
- docker start
- 功能:启动已经创建的容器。
- 示例:
docker start my - container
,用于启动名为my - container
的容器。
- docker run
- 功能:创建并启动一个容器。
- 示例:
docker run -it --name my - new - container ubuntu:latest bash
,这个命令会创建并启动一个基于ubuntu:latest
镜像的名为my - new - container
的容器,并且通过-it
参数以交互模式进入容器的 bash 终端。
- docker ps
- 功能:查看正在运行的容器。
- 示例:
docker ps
会显示正在运行的容器的信息,包括容器 ID、名称、使用的镜像、状态、端口等信息。如果要查看所有容器(包括已停止的),可以使用docker ps -a
。
- docker stop
- 功能:停止正在运行的容器。
- 示例:
docker stop my - container
,用于停止名为my - container
的容器。
- docker rm
- 功能:删除一个或多个容器。
- 示例:
docker rm my - container
,用于删除名为my - container
的容器。不过,容器必须是已经停止的状态才能被删除。如果要删除所有已停止的容器,可以使用docker rm $(docker ps -a -q)
,其中$(docker ps -a -q)
会获取所有容器的 ID。
- docker exec
- 功能:在运行的容器中执行命令。
- 示例:
docker exec -it my - container bash
,此命令用于进入名为my - container
的运行容器的 bash 终端,-it
参数表示以交互模式和伪终端的方式进入。
- docker attach
- 功能:连接到正在运行的容器的终端。
- 示例:
docker attach my - container
,不过与docker exec
不同的是,docker attach
主要用于重新连接到容器的启动命令终端,可能会受到容器启动命令的限制。
- docker create
- 其他常用命令
- docker version
- 功能:显示 Docker 的版本信息,包括客户端和服务器端的版本。
- 示例:
docker version
会分别显示客户端和服务器端的版本号、Go 版本、Git 提交哈希等信息。
- docker info
- 功能:显示 Docker 系统信息,如容器和镜像的数量、存储驱动、内核版本等。
- 示例:
docker info
可以帮助你了解 Docker 系统的整体状态,如查看当前使用的存储驱动是overlay2
还是aufs
等。
- docker version