虚拟机系列:Docker介绍及其在WSL中的应用
1 什么是Docker?
Docker是一种开源的容器化平台,用于构建、交付和运行应用程序。它提供了一种轻量级的容器化技术,可以将应用程序及其依赖项打包成一个独立的可执行单元,称为Docker容器。每个容器都运行在一个隔离的环境中,共享主机操作系统的内核,从而实现了高效、可移植和可扩展的应用程序部署。
以下是一些关键概念和组件,以帮助理解Docker的工作原理:
-
Docker镜像(Image):Docker镜像是一个只读的模板,包含了运行应用程序所需的文件系统、代码、运行时环境、库和配置等。镜像可以被用来创建Docker容器。
-
Docker容器(Container):Docker容器是从Docker镜像创建的运行实例。每个容器都是独立、隔离的运行环境,可以在其中运行应用程序。容器可以被启动、停止、删除等操作。
-
Docker注册表(Registry):Docker注册表是用于存储和分发Docker镜像的中央仓库。Docker Hub是一个公共的Docker注册表,提供了大量的官方和社区维护的镜像。此外,你也可以搭建私有的Docker注册表来存储自己的镜像。
-
Dockerfile:Dockerfile是一个文本文件,用于定义Docker镜像的构建过程。它包含了一系列的指令和配置,用于从基础镜像构建、配置和定制镜像。
-
Docker Compose:Docker Compose是一个用于定义和管理多个Docker容器的工具。它使用一个YAML文件来描述应用程序的服务、网络和卷等配置,使得多个容器的编排和管理变得更加简单。
Docker的优势包括:
- 轻量性和高效性:Docker容器与传统虚拟机相比,更加轻量和高效,启动快速,资源消耗较少。
- 可移植性:Docker容器可以在各种操作系统和平台上运行,提供了一致的运行环境,减少了环境差异导致的问题。
- 可复制性和可扩展性:Docker镜像的不可变性和可复制性使得应用程序的交付和部署变得更加简单和可靠,同时容器的可扩展性也使得应对高负载需求更加方便。
通过使用Docker,开发人员可以更加轻松地构建、交付和部署应用程序,同时运维人员也可以更好地管理和扩展应用程序的部署。
2 镜像和容器之间的关系
镜像(Image)和容器(Container)是Docker中的两个重要概念,它们之间的关系可以用下面的形象例子来说明:
想象一下你有一个应用程序,比如一个网站。镜像可以看作是该应用程序的软件打包,类似于一个装有应用程序及其依赖项的盒子。镜像包含了运行应用程序所需的文件系统、代码、运行时环境、库和配置等。
使用这个镜像,你可以创建多个相互独立的容器,每个容器都是一个运行实例,就像在现实世界中从一个盒子中取出一个独立的容器。每个容器都是独立的、隔离的运行环境,具有自己的文件系统、进程空间和网络接口。
类比到网站的例子,你可以将镜像看作是网站的源代码、静态文件和配置文件的打包,而容器则是在不同的服务器上运行这个网站的实例。你可以使用同一个镜像创建多个容器,每个容器都有自己的资源和运行环境,可以独立地提供网站服务。
假设你有一个名为"my-website"的镜像,它包含了你的网站代码和所需的依赖项。你可以通过运行以下命令创建一个容器:
docker run --name my-container -d my-website
这将使用"my-website"镜像创建一个名为"my-container"的容器,并在后台运行。现在你可以使用多个类似的命令创建多个容器,每个容器都是独立运行的网站实例。
通过这个例子,你可以理解镜像是容器的基础,容器则是镜像的运行实例。镜像提供了应用程序运行所需的所有文件和设置,而容器是基于镜像创建的、独立的运行环境。这种镜像和容器的关系使得应用程序的交付和部署变得更加简单、可靠和可扩展。
3 Docker守护进程
Docker守护进程(Docker daemon)是Docker引擎的核心组件之一。它是一个在后台运行的持续进程,负责管理Docker容器和镜像的创建、运行和销毁。
Docker守护进程在启动时会监听Docker客户端的请求,并根据客户端发送的命令执行相应的操作。它与Docker客户端通过Docker API进行通信,接收来自客户端的指令,并将其转化为实际的容器和镜像操作。
Docker守护进程具有以下功能:
-
镜像管理:Docker守护进程负责从Docker Hub或其他镜像仓库下载、创建、存储和管理Docker镜像。它可以拉取、推送和删除镜像,以及构建自定义的镜像。
-
容器管理:Docker守护进程负责创建、运行、停止和删除Docker容器。它可以根据定义的容器配置启动新容器,监控容器的运行状态,并根据需要进行扩展或缩减。
-
资源管理:Docker守护进程管理宿主机的资源分配和限制,包括CPU、内存、存储等。它可以在容器之间进行资源隔离和分配,以确保容器之间的互相独立性和性能稳定性。
-
网络管理:Docker守护进程负责管理Docker容器的网络连接和通信。它可以为容器分配IP地址,创建和管理网络接口,实现容器之间和容器与外部网络的通信。
-
日志记录:Docker守护进程负责收集和管理Docker容器和守护进程本身的日志信息。它可以将容器的标准输出和错误输出重定向到日志文件,以便用户进行故障排除和监控。
总之,Docker守护进程是Docker引擎的核心组件,它在后台运行并负责管理Docker容器和镜像的创建、运行和销毁。通过与Docker客户端的通信,它提供了一组功能丰富的API,使用户能够轻松地使用和管理Docker化的应用程序。
4 在WSL中安装Docker
在WSL中安装Docker需要以下步骤:
-
打开WSL终端:在Windows 10中,可以通过在开始菜单中搜索并打开"WSL"或直接运行WSL发行版(如Ubuntu)来打开WSL终端。
-
更新系统:在WSL终端中运行以下命令,确保系统为最新版本:
sudo apt update
sudo apt upgrade
-
安装Docker的依赖项:运行以下命令以安装Docker所需的依赖项:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
apt-transport-https
是一个apt
的插件,允许apt
使用 HTTPS 协议来下载软件包和更新。HTTPS 是一种安全的通信协议,可以防止数据在传输过程中被篡改。ca-certificates
是一个用于管理和更新操作系统上的证书颁发机构(Certificate Authorities,简称CA)证书的软件包。它包含了一组信任的根证书,用于验证 HTTPS 连接和其他安全通信。curl
是一个命令行工具,用于发送 HTTP 请求并显示响应。在这个命令中,curl
主要用于下载和获取软件包。software-properties-common
是一个软件包,提供了add-apt-repository
命令,用于添加软件仓库源。通过它,可以向系统添加第三方软件源,并使用apt
来安装来自这些源的软件包。
-
添加Docker的官方GPG密钥:运行以下命令以添加Docker官方的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
curl
是一个用于发送 HTTP 请求并显示响应的命令行工具。在这个命令中,curl
被用来从指定的 URL 下载文件。-fsSL
: 这是curl
命令的一些选项标志。具体解释如下:-f
: 如果服务器返回的 HTTP 状态码表示请求失败,curl
不会显示错误信息。-s
: 静默模式,不显示进度或错误信息。-S
: 如果发生错误,则显示错误信息。
https://download.docker.com/linux/ubuntu/gpg
: 这是要下载的文件的 URL,它指向 Docker 在 Ubuntu 上的官方 GPG 密钥文件。GPG 密钥用于验证下载的 Docker 软件包的完整性和真实性。|
: 这是管道操作符,将curl
的输出通过管道传递给后面的命令。sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
: 这是通过管道接收来自curl
的数据,并使用gpg
工具进行处理的命令。具体解释如下:gpg
是一个用于加密、解密和签名文件的命令行工具。在这个命令中,gpg
用于解析通过管道传递的 GPG 密钥文件,并将其解密成可读的二进制格式。--dearmor
: 这是gpg
命令的选项,用于将 GPG 密钥文件解析为二进制格式。-o /usr/share/keyrings/docker-archive-keyring.gpg
: 这是gpg
命令的选项,用于将解析后的密钥输出到指定的文件路径。在这个命令中,密钥将被输出到/usr/share/keyrings/docker-archive-keyring.gpg
文件中。
综上所述,该命令的作用是通过 curl
下载 Docker 的官方 GPG 密钥文件,并使用 gpg
解析和解密该密钥,并将其输出到 /usr/share/keyrings/docker-archive-keyring.gpg
文件中。这是为了后续在 Ubuntu 系统上安装 Docker 软件包时使用该密钥进行验证。由于操作涉及到系统文件,因此需要使用 sudo
命令以管理员权限执行。
- 添加Docker的APT存储库:运行以下命令以添加Docker的APT存储库:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
这个命令的目的是将 Docker 软件源添加到系统的 APT 软件源列表中。下面是对该命令的逐个解析:echo
是一个命令行工具,用于打印(输出)指定的文本或字符串。在这个命令中,echo
用于输出 Docker 软件源的信息。"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
: 这是要输出的文本或字符串。它是一个包含 Docker 软件源信息的字符串,具体解释如下:deb
: 这是 APT 软件源的条目类型之一,表示二进制软件包。[arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
: 这是对 Docker 软件源条目的描述,指定了要使用的体系结构(amd64)和签名文件的位置。https://download.docker.com/linux/ubuntu
: 这是 Docker 软件源的 URL,指向 Docker 在 Ubuntu 上的软件包仓库。$(lsb_release -cs)
: 这是一个命令替换,用于获取当前 Ubuntu 系统的发行版代号。lsb_release -cs
命令将返回当前系统的代号(如 “bionic”、“focal” 等),用于构建正确的软件源 URL。stable
: 这是 Docker 软件源的分支或版本,指定了要使用的稳定版本的软件包。|
: 这是管道操作符,将echo
的输出通过管道传递给后面的命令。
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
: 这是通过管道接收来自echo
的数据,并使用tee
命令将数据写入文件的命令。具体解释如下:tee
是一个命令行工具,用于从标准输入接收数据,并将其写入一个或多个文件,同时也将数据输出到标准输出。在这个命令中,tee
用于将来自管道的数据写入文件。/etc/apt/sources.list.d/docker.list
: 这是要写入的文件路径,它位于/etc/apt/sources.list.d/
目录下,用于存储用户自定义的软件源列表。在这个命令中,Docker 软件源的条目将被写入到该文件中。> /dev/null
: 这是重定向符号,将tee
命令的标准输出重定向到/dev/null
,表示将输出丢弃,不显示在终端上。
综上所述,该命令的作用是将 Docker 软件源的条目信息写入到 /etc/apt/sources.list.d/docker.list
文件中,以便在后续使用 apt
命令时能够使用该软件源。由于操作涉及到系统文件,因此需要使用 sudo
命令以管理员权限执行。/dev/null
部分表示不显示 tee
命令的输出。
- 安装Docker:运行以下命令以安装Docker:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io`
这是两个命令,用于更新软件包列表并安装 Docker 容器引擎。让我们逐个解析这些命令:sudo apt update
: 这个命令用于更新系统的软件包列表。sudo apt install docker-ce docker-ce-cli containerd.io
: 这个命令用于安装 Docker 容器引擎及其相关组件。具体解析如下:docker-ce
是 Docker Community Edition(社区版)的缩写,是 Docker 容器引擎的核心软件包。docker-ce-cli
是 Docker Community Edition Command Line Interface(命令行界面)的缩写,是 Docker 容器引擎的命令行工具软件包。containerd.io
是一个用于管理容器运行时的开源项目,它是 Docker 容器引擎的一部分,负责管理容器的生命周期。
综上所述,该命令的作用是使用 apt
安装 Docker 容器引擎及其相关组件。这将安装 Docker Community Edition(社区版)的核心软件包 docker-ce
、命令行工具软件包 docker-ce-cli
,以及容器运行时管理工具 containerd.io
。
执行这两个命令将使系统更新软件包列表,并安装 Docker 容器引擎,从而使用户能够在系统上运行和管理 Docker 容器。
- 验证安装:运行以下命令以验证Docker是否正确安装并正在运行:
sudo docker run hello-world
这个命令是在安装了 Docker 容器引擎后运行的一个示例命令 :docker
是 Docker 容器引擎的命令行工具。在这个命令中,docker
用于与 Docker 容器引擎进行交互。run
是docker
命令的一个参数,用于运行一个容器。hello-world
是一个示例容器镜像的名称。Docker 容器镜像是一个包含完整的运行时环境的独立软件包。在这个命令中,hello-world
是一个简单的示例容器镜像,用于测试 Docker 安装和配置是否正确。
综上所述,该命令的作用是在 Docker 容器引擎中运行一个名为 hello-world
的示例容器镜像。执行该命令后,Docker 将下载 hello-world
容器镜像(如果本地不存在),并在容器中运行该镜像。镜像运行后将输出一些信息,表示 Docker 已经正确安装并正常工作。
注意:由于该命令需要与 Docker 容器引擎进行交互,因此需要使用 sudo
命令以管理员权限执行。
如果一切顺利,你将看到一个简单的Docker容器运行并输出"Hello from Docker!"的消息。如果输出docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.See 'docker run --help'
说明未启动docker守护进程,先运行sudo service docker start
,然后再运行 一次sudo docker run hello-world
,就成功了。
现在你已经成功在WSL中安装了Docker。你可以使用Docker命令行工具来管理和运行容器,构建和发布镜像等。请注意,WSL中运行的Docker实际上是在Windows系统上运行的Docker守护进程,因此你可以使用Windows上的Docker工具和GUI进行交互。
5 WSL中用命令行管理docker
在WSL中安装Docker后,你可以使用命令行工具来管理Docker容器和镜像。下面是一些常用的Docker命令:
-
启动Docker服务:在WSL终端中,运行以下命令来启动Docker守护进程:
sudo service docker start
或者使用以下命令来启动Docker服务并设置开机自启动:
sudo systemctl enable --now docker
-
验证Docker安装:运行以下命令来验证Docker是否正确安装并正在运行:
sudo docker run hello-world
如果一切顺利,你将看到一个简单的Docker容器运行并输出"Hello from Docker!"的消息。
-
Docker镜像操作:
-
拉取镜像:运行以下命令来拉取一个Docker镜像:
sudo docker pull image_name:tag
-
列出镜像:运行以下命令来列出已下载的Docker镜像:
sudo docker images
-
删除镜像:运行以下命令来删除一个Docker镜像:
sudo docker rmi image_name:tag
-
-
Docker容器操作:
-
创建容器:运行以下命令来创建一个Docker容器:
sudo docker create --name container_name image_name:tag
-
启动容器:运行以下命令来启动一个Docker容器:
sudo docker start container_name
-
停止容器:运行以下命令来停止一个运行中的Docker容器:
sudo docker stop container_name
-
列出容器:运行以下命令来列出正在运行的Docker容器:
sudo docker ps
-
删除容器:运行以下命令来删除一个Docker容器:
sudo docker rm container_name
-
这只是Docker命令的一小部分,你可以通过运行sudo docker --help
或查阅Docker文档来了解更多命令和选项。使用这些命令,你可以管理Docker容器和镜像,构建自定义镜像,设置容器网络等。
6 删除镜像的注意事项
在 Docker 中删除镜像的前提是该镜像不在使用中,没有基于该镜像运行的容器实例。
Docker 镜像是容器的基础,如果有容器正在使用该镜像,那么镜像将被视为被使用中,不可直接删除。因此,在删除镜像之前,需要确保没有正在运行的容器使用该镜像。
要删除镜像,可以按照以下步骤进行操作:
-
使用
docker ps -a
命令查看所有容器的列表,包括运行中和已停止的容器。确认没有基于要删除的镜像运行的容器。 -
如果存在正在运行的容器使用了要删除的镜像,需要停止这些容器。可以使用
docker stop <容器ID>
命令停止容器。多个容器可以通过逐个指定容器ID来停止,或者使用通配符等方式进行批量停止。 -
确认所有使用要删除镜像的容器都已停止后,可以使用
docker rmi <镜像ID>
命令删除镜像。可以通过docker images
命令查看当前系统中的镜像列表,获取要删除的镜像的ID。
请注意,删除镜像是一个不可逆的操作,删除后无法恢复。确保在删除之前进行了必要的备份和确认操作。
本文简单介绍了Docker以及在WSL中安装使用docker,通过网上查阅资料和自己的笔记整理并成功实践于PC,最终上传分享给大家,供大家参考,希望能够帮到勤奋学习的诸位,有不合理的地方,欢迎各位大佬指正评论,创作不易,不喜勿喷,谢谢!