Docker 安装
- 前提条件
- [Docker 三件套](#Docker 三件套)
- [Docker 工作原理](#Docker 工作原理)
- [Docker 平台架构图解](#Docker 平台架构图解)
-
- [Docker 架构概述](#Docker 架构概述)
- [Docker 架构图解](#Docker 架构图解)
-
- [Docker Client(客户端)](#Docker Client(客户端))
- [Docker Daemon(守护进程)](#Docker Daemon(守护进程))
- [Docker Engine(引擎)](#Docker Engine(引擎))
- [Docker Registry(镜像仓库)](#Docker Registry(镜像仓库))
- Graph(内部数据库)
- 驱动模块
- 总结
- [Docker 运行基本流程](#Docker 运行基本流程)
- [Docker 安装步骤](#Docker 安装步骤)
- [永远的 HelloWorld](#永远的 HelloWorld)
- [为什么 Docker 会比 VM 虚拟机快](#为什么 Docker 会比 VM 虚拟机快)
前提条件
目前,CentOs 仅发行版中的内核支持 Docker,Docker 运行在 CentOs 7上,要求系统为64位,Linux 系统内核版本为 3.8 以上
查看内核
uname
命令用于打印当前系统相关信息
bash
cat /etc/redhat-release
uname -r
Docker 三件套
Docker 的"三件套"主要指的是 Docker 的三大核心组件,即镜像(Images)、容器(Containers)和仓库(Repositories)。这三者共同构成了 Docker 的基础架构,使得 Docker 能够实现高效、轻量级的容器化应用部署和管理。
镜像(Images)
- 定义:镜像是 Docker 的构建基石,是轻量级的、可执行的独立软件包,它包含了运行某个软件所需要的所有内容,包括代码、运行时、库、环境变量和配置文件等。
- 作用:镜像是静态的,可以被看作是容器的模板或"蓝图"。通过镜像,用户可以快速地创建多个相同的容器实例,而无需在每个实例上重复安装和配置软件。
- 获取方式:用户可以从 Docker Hub 或其他镜像仓库中下载镜像,也可以自己构建镜像并将其推送到仓库中供他人使用。
容器(Containers)
- 定义:容器是镜像的运行实例,是 Docker 利用容器技术所创建的一个虚拟环境。容器与宿主机共享内核,但拥有自己的文件系统、进程空间和网络接口等资源,因此能够实现轻量级的隔离。
- 作用:容器是动态的,可以被启动、停止、删除等。每个容器都是相互隔离的,保证了应用的安全性和稳定性。同时,容器也支持网络通信和数据共享等功能,使得容器化应用能够更加灵活地部署和管理。
- 操作:用户可以通过 Docker 命令来创建、启动、停止和删除容器,以及进入容器内部进行操作。
仓库(Repositories)
- 定义:仓库是集中存放 Docker 镜像的场所,类似于代码仓库或软件包仓库。它允许用户上传、下载和管理自己的镜像。
- 作用:仓库为用户提供了一个共享和分发镜像的平台。用户可以将自己构建的镜像推送到仓库中,供其他用户下载和使用。同时,用户也可以从仓库中下载其他人共享的镜像,以快速部署自己的应用。
- 类型:仓库分为公开仓库和私有仓库两种。公开仓库允许任何人访问和下载镜像,而私有仓库则需要对访问权限进行限制。Docker Hub 是 Docker 官方提供的公开仓库,但用户也可以选择使用其他第三方仓库或自己搭建私有仓库。
综上所述,Docker 的"三件套"------镜像、容器和仓库------共同构成了 Docker 的核心功能,使得 Docker 能够实现高效、轻量级的容器化应用部署和管理。
Docker 工作原理
Docker的工作原理主要基于轻量级的容器化技术,通过虚拟化系统资源来隔离并运行应用程序。
容器化技术基础
Docker利用Linux操作系统的cgroups、namespaces和AUFS(或其他联合文件系统如OverlayFS)等特性来虚拟化系统资源。这些技术使得Docker能够创建一个或多个隔离的容器环境,每个容器都拥有自己独立的文件系统、网络栈和进程空间等。
- cgroups:用于限制、记录和隔离进程组所使用的物理资源(如CPU、内存、磁盘I/O等)。
- namespaces:为容器提供系统资源的隔离,包括进程ID、网络、用户ID、主机名等。这使得容器内的进程只能看到和操作自己的命名空间内的资源。
- AUFS/OverlayFS:用于实现文件系统的隔离和共享。Docker镜像可以看作是多个层叠的只读文件系统,而容器则在这些镜像之上添加了一个可写层,用于存储运行时的数据更改。
Docker镜像与容器
- Docker镜像:是一个只读的模板,包含了运行应用程序所需要的所有文件、配置和依赖项。镜像可以被看作是容器的原型,通过Dockerfile文件可以构建新的镜像。
- Docker容器:是从Docker镜像生成的运行时环境。容器具有自己的根文件系统和资源隔离机制,可以看作是一个可运行的应用程序实例。容器之间通过端口映射等方式进行通信。
Docker组件与工作流程
Docker平台主要由Docker客户端(Client)、Docker守护进程(Daemon)、Docker镜像(Image)、Docker容器(Container)和Docker仓库(Registry)等组件组成。
- Docker客户端:用户通过Docker客户端与Docker守护进程进行交互,发送构建、运行和管理容器的指令。
- Docker守护进程:是Docker的核心组件,负责接收客户端的请求,并管理Docker镜像、容器等资源。
- 工作流程 :
- 用户通过Docker客户端发送构建镜像的指令(如使用Dockerfile)。
- Docker守护进程接收指令,并根据Dockerfile中的指令构建新的镜像。
- 用户发送运行容器的指令,指定要使用的镜像。
- Docker守护进程从本地或Docker仓库中拉取镜像,并创建新的容器实例。
- 容器启动后,Docker守护进程会监控容器的运行状态,并根据需要进行管理(如重启、停止等)。
Docker网络与数据持久化
- 网络:Docker提供了多种网络模式来实现容器之间的通信,包括桥接网络、主机网络、覆盖网络等。用户可以根据需要为容器指定不同的网络配置。
- 数据持久化:Docker容器中的数据默认是临时的,随着容器的删除而丢失。为了实现数据的持久化,Docker提供了数据卷(Volumes)和挂载主机目录(Bind mounts)等方式来存储和共享数据。
Docker容器编排
Docker还提供了容器编排工具(如Docker Compose和Docker Swarm)来管理多容器应用程序。这些工具可以帮助用户定义容器之间的依赖关系、网络设置、环境变量等,并自动化地部署、扩展和管理容器。
综上所述,Docker通过虚拟化技术将代码、依赖项和运行环境打包成一个容器,并利用隔离机制来使得容器之间互相独立、互不影响。这种容器化技术极大地简化了应用程序的部署和管理过程,提高了资源利用率和系统的可维护性。
Docker 平台架构图解
Docker 平台架构是一个 C/S(客户端/服务器)模式的架构,后端是一个松耦合架构,模块各司其职。
Docker 架构概述
Docker 平台主要由 Docker Client(客户端)、Docker Daemon(守护进程)、Docker Engine(引擎)、Docker Registry(镜像仓库)、Graph(内部数据库)以及多个驱动模块(如 Graphdriver、Networkdriver、Execdriver 等)组成。这些组件共同协作,实现了 Docker 容器的创建、运行、管理等功能。
Docker 架构图解
Docker Client(客户端)
- 作用:Docker Client 是和 Docker Daemon 建立通信的客户端。用户通过 Docker Client 发送容器管理请求给 Docker Daemon。
- 通信方式:Docker Client 可以通过 tcp://host:port、unix://path_to_socket 和 fd://socketfd 三种方式和 Docker Daemon 建立通信。
- 示例 :用户执行的
docker images
、docker run
等命令都是通过 Docker Client 发送的。
Docker Daemon(守护进程)
- 作用:Docker Daemon 是 Docker 架构中的主体部分,它首先提供 Docker Server 的功能,使其可以接受 Docker Client 的请求。
- 内部组件 :Docker Daemon 内部包含 Docker Server、Docker Engine 等组件。
- Docker Server:相当于 C/S 架构的服务端,负责接受并调度分发 Docker Client 发送的请求。
- Docker Engine:Docker 架构中的运行引擎,也是 Docker 运行的核心模块。它扮演 Docker Container 存储仓库的角色,并通过执行 Job 的方式来操纵管理这些容器。
Docker Engine(引擎)
- 作用:Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在。
- 示例:在容器内部运行一个进程、创建一个新的容器等都是 Job 的具体实例。
Docker Registry(镜像仓库)
- 作用:Docker Registry 是一个存储容器镜像的仓库(注册中心),可理解为云端镜像仓库。
- 分类:Docker Registry 可分为公有仓库(如 Docker Hub)和私有仓库。
- 功能:在 Docker 的运行过程中,Docker Daemon 会与 Docker Registry 通信,实现搜索镜像、下载镜像、上传镜像等功能。
Graph(内部数据库)
- 作用:Graph 是 Docker 内部的一个小型图数据库,用于存储已下载的镜像及其关系。
- 存储类型:镜像的存储类型有 Aufs、Devicemapper、Btrfs、Vfs 等。
驱动模块
- Graphdriver:主要用于完成容器镜像的管理,包括存储与获取。
- Networkdriver:用于完成 Docker 容器网络环境的配置,如创建网桥、分配 IP、端口映射等。
- Execdriver:用于限制 Docker 容器运行资源或执行用户指令等操作。
- Libcontainer:是一项独立的容器管理包,Networkdriver 和 Execdriver 都是通过 Libcontainer 来实现具体对容器进行的操作。
总结
Docker 平台架构通过 C/S 模式,将复杂的容器管理任务分解为多个模块,每个模块各司其职,共同协作实现了 Docker 容器的创建、运行、管理等功能。这种松耦合的架构使得 Docker 平台具有高度的可扩展性和灵活性,能够满足不同场景下的容器化需求。
Docker 运行基本流程
- 用户是使用 Docker Client与 Docker Daemon建立通信,并发送请求给后者。
- Docker Daemon 作为 Docker 架构中的主体部分,曾先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
- Docker Engine 执行 Docker内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
- Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动 Graph driver将下载镜像以Graph的形式存储。
- 当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境。
- 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成。
- Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
Docker 安装步骤
在CentOS 7.9上安装Docker的步骤主要包括准备安装环境、安装Docker服务、验证安装结果以及配置镜像加速等。以下是详细的安装步骤:
准备安装环境
-
检查内核版本 :
Docker 要求 CentOS 的内核版本在 3.10 以上。可以使用命令
uname -r
来检查当前的内核版本。 -
检查网络连接 :
确保 CentOS 系统能够访问互联网,以便下载 Docker 安装包及其依赖。
-
关闭防火墙(可选,但谨慎操作) :
如果是在测试环境中,可以考虑关闭防火墙以简化安装过程。使用命令
sudo systemctl stop firewalld
停止防火墙服务,并使用sudo systemctl disable firewalld
禁止防火墙开机自启。但在生产环境中,应根据实际需求设置防火墙规则。 -
卸载旧版本Docker(如果存在) :
如果系统中已安装了旧版本的 Docker,建议先卸载。可以使用以下命令卸载旧版本及其依赖:
bashsudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装Docker服务
-
安装yum-utils工具 :
这个工具包含了
yum-config-manager
,可以用来管理yum仓库。使用命令sudo yum install -y yum-utils
进行安装。 -
设置Docker仓库 :
通过添加Docker的官方仓库,可以使用yum直接安装Docker。可以使用阿里云等国内镜像源来提高下载速度。添加仓库的命令如下:
bashsudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum缓存 :
在添加仓库后,使用命令
sudo yum makecache fast
更新yum的缓存。 -
安装Docker CE :
使用yum命令安装Docker CE(Community Edition,社区版),包括Docker守护进程、Docker客户端和Docker CLI插件。命令如下:
bashsudo yum install -y docker-ce docker-ce-cli containerd.io
启动Docker服务并验证安装
-
启动Docker服务 :
使用命令
sudo systemctl start docker
启动Docker服务。 -
设置Docker开机自启 :
为了在系统启动时自动启动Docker服务,可以使用命令
sudo systemctl enable docker
。 -
验证Docker安装 :
使用命令
sudo docker version
查看Docker的版本信息,以验证Docker是否成功安装。
配置镜像加速(可选)
由于Docker官方镜像仓库的访问速度可能较慢,可以配置国内镜像加速器来提高下载速度。
-
创建或编辑daemon.json文件 :
在
/etc/docker/
目录下创建或编辑daemon.json
文件,添加或修改如下内容:json{ "registry-mirrors": ["https://<your-mirror-url>.mirror.aliyuncs.com"] }
其中
<your-mirror-url>
是你选择的镜像加速器的URL。 -
重新加载Docker配置并重启Docker服务 :
使用命令
sudo systemctl daemon-reload
重新加载Docker配置,并使用sudo systemctl restart docker
重启Docker服务以使配置生效。
但是近期docker被墙的太厉害了,如果配置了阿里镜像加速,不能解决问题的话,可以试试下面这个配置,我配置的阿里的,拉取不了镜像,就是使用的下面的配置,成功能拉取到镜像了
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
拉取并运行Docker镜像
作为安装和配置的验证,你可以尝试拉取一个Docker镜像并运行它。例如,拉取并运行Nginx镜像:
bash
sudo docker pull nginx
sudo docker run --name my-nginx -d nginx
这将从Docker Hub拉取Nginx镜像,并运行一个名为my-nginx
的容器。你可以通过浏览器访问容器的IP地址和默认端口(通常是80)来查看Nginx的欢迎页面。
通过以上步骤,你应该能够在CentOS 7.9上成功安装并配置Docker。
永远的 HelloWorld
在Docker中,创建一个简单的"Hello World"示例是理解Docker如何工作的好方法。Docker允许你封装应用程序及其依赖项到一个可移植的容器中,然后你可以在任何安装了Docker的环境中运行这个容器。
以下是如何使用Docker来运行一个简单的"Hello World"示例的步骤:
运行Docker Hello World
安装Docker之后,你可以通过打开命令行或终端来运行你的第一个Docker容器。
打开你的终端,然后输入以下命令:
bash
docker run hello-world
这个命令会从Docker Hub(一个Docker镜像的公共仓库)下载hello-world
镜像(如果本地没有的话),并在容器中运行它。运行完成后,你会看到一条消息,表明Docker已经安装并正在运行,以及hello-world
镜像提供的一些基本信息。
理解发生了什么
当你运行docker run hello-world
命令时,Docker做了以下几件事:
-
查找
hello-world
镜像 :Docker首先检查本地是否有hello-world
镜像。如果没有,Docker会从Docker Hub下载它。 -
创建容器:一旦镜像被加载到本地,Docker会基于这个镜像创建一个新的容器。
-
分配资源:Docker为容器分配必要的资源,比如网络堆栈和存储。
-
运行容器中的应用 :在这个例子中,容器会运行
hello-world
镜像中定义的应用,这通常是一个简单的脚本,打印出欢迎信息和Docker的版本信息。 -
显示输出 :最后,Docker会显示容器的输出,然后容器会停止运行(因为
hello-world
镜像的应用设计为运行一次就退出)。
结论
通过运行hello-world
示例,你已经体验到了Docker的一些核心功能,包括镜像的下载、容器的创建和运行,以及输出的查看。这是开始使用Docker进行更复杂应用部署和容器化工作的良好起点。
为什么 Docker 会比 VM 虚拟机快
抽象层与资源使用
- 更轻量级的抽象:Docker拥有比虚拟机更轻量级的抽象层。Docker直接在宿主机的操作系统上运行,使用宿主机的内核,而不需要像虚拟机那样通过Hypervisor(虚拟机监视器)进行硬件虚拟化。这种直接的资源使用方式减少了中间层的开销。
- 资源共享:Docker容器与宿主机共享同一个操作系统内核,因此容器可以直接利用宿主机的资源,如文件系统、网络接口等,而无需为每个容器分配独立的资源。相比之下,虚拟机需要模拟整个操作系统,包括内核、设备驱动等,这增加了资源消耗和启动时间。
启动和运行速度
- 快速启动:由于Docker容器不需要启动完整的操作系统,只需加载应用程序所需的文件和依赖项,因此启动速度非常快。通常,Docker容器的启动时间只需要几秒钟,而虚拟机需要几分钟甚至更长时间来启动完整的操作系统。
- 高效的资源利用:Docker容器可以更有效地利用系统资源,因为它们不需要额外的操作系统开销。这意味着在相同的硬件条件下,Docker可以运行更多的容器,从而提高整体性能和资源利用率。
镜像管理
- 镜像层次结构:Docker使用镜像层次结构来管理容器。镜像是一个只读的模板,可以用来创建容器。当创建容器时,Docker只需加载所需的镜像层,而不是整个操作系统。这种分层结构减少了加载时间和磁盘空间的使用。
- 缓存机制:Docker会根据镜像的分层信息进行缓存,以提高后续加载相同镜像时的速度。如果多个镜像共享相同的分层,只需要下载一次,并在本地缓存中进行复用。
管理与部署
- 轻量级管理系统:Docker提供基于命令行和API的轻量级管理系统,可以自动化容器的创建、部署和维护。相比之下,虚拟机的管理工具通常更为复杂,需要额外的管理开销。
- 可移植性:Docker容器可以轻松地在不同主机和云平台之间移植。Docker镜像包含所有依赖项,确保应用程序在任何地方都能以相同的方式运行。
综上所述,Docker之所以比虚拟机快,主要得益于其更轻量级的抽象层、高效的资源共享、快速的启动和运行速度、镜像管理的优化以及轻量级的管理系统。这些特点使得Docker成为现代应用程序开发和部署中不可或缺的工具。