Docker 安装

Docker 安装

前提条件

目前,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镜像、容器等资源。
  • 工作流程
    1. 用户通过Docker客户端发送构建镜像的指令(如使用Dockerfile)。
    2. Docker守护进程接收指令,并根据Dockerfile中的指令构建新的镜像。
    3. 用户发送运行容器的指令,指定要使用的镜像。
    4. Docker守护进程从本地或Docker仓库中拉取镜像,并创建新的容器实例。
    5. 容器启动后,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 imagesdocker 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 运行基本流程

  1. 用户是使用 Docker Client与 Docker Daemon建立通信,并发送请求给后者。
  2. Docker Daemon 作为 Docker 架构中的主体部分,曾先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
  3. Docker Engine 执行 Docker内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
  4. Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动 Graph driver将下载镜像以Graph的形式存储。
  5. 当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境。
  6. 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成。
  7. Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。

Docker 安装步骤

在CentOS 7.9上安装Docker的步骤主要包括准备安装环境、安装Docker服务、验证安装结果以及配置镜像加速等。以下是详细的安装步骤:

准备安装环境

  1. 检查内核版本

    Docker 要求 CentOS 的内核版本在 3.10 以上。可以使用命令 uname -r 来检查当前的内核版本。

  2. 检查网络连接

    确保 CentOS 系统能够访问互联网,以便下载 Docker 安装包及其依赖。

  3. 关闭防火墙(可选,但谨慎操作)

    如果是在测试环境中,可以考虑关闭防火墙以简化安装过程。使用命令 sudo systemctl stop firewalld 停止防火墙服务,并使用 sudo systemctl disable firewalld 禁止防火墙开机自启。但在生产环境中,应根据实际需求设置防火墙规则。

  4. 卸载旧版本Docker(如果存在)

    如果系统中已安装了旧版本的 Docker,建议先卸载。可以使用以下命令卸载旧版本及其依赖:

    bash 复制代码
    sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装Docker服务

  1. 安装yum-utils工具

    这个工具包含了yum-config-manager,可以用来管理yum仓库。使用命令 sudo yum install -y yum-utils 进行安装。

  2. 设置Docker仓库

    通过添加Docker的官方仓库,可以使用yum直接安装Docker。可以使用阿里云等国内镜像源来提高下载速度。添加仓库的命令如下:

    bash 复制代码
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3. 更新yum缓存

    在添加仓库后,使用命令 sudo yum makecache fast 更新yum的缓存。

  4. 安装Docker CE

    使用yum命令安装Docker CE(Community Edition,社区版),包括Docker守护进程、Docker客户端和Docker CLI插件。命令如下:

    bash 复制代码
    sudo yum install -y docker-ce docker-ce-cli containerd.io

启动Docker服务并验证安装

  1. 启动Docker服务

    使用命令 sudo systemctl start docker 启动Docker服务。

  2. 设置Docker开机自启

    为了在系统启动时自动启动Docker服务,可以使用命令 sudo systemctl enable docker

  3. 验证Docker安装

    使用命令 sudo docker version 查看Docker的版本信息,以验证Docker是否成功安装。

配置镜像加速(可选)

由于Docker官方镜像仓库的访问速度可能较慢,可以配置国内镜像加速器来提高下载速度。

  1. 创建或编辑daemon.json文件

    /etc/docker/ 目录下创建或编辑 daemon.json 文件,添加或修改如下内容:

    json 复制代码
    {
      "registry-mirrors": ["https://<your-mirror-url>.mirror.aliyuncs.com"]
    }

    其中 <your-mirror-url> 是你选择的镜像加速器的URL。

  2. 重新加载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做了以下几件事:

  1. 查找hello-world镜像 :Docker首先检查本地是否有hello-world镜像。如果没有,Docker会从Docker Hub下载它。

  2. 创建容器:一旦镜像被加载到本地,Docker会基于这个镜像创建一个新的容器。

  3. 分配资源:Docker为容器分配必要的资源,比如网络堆栈和存储。

  4. 运行容器中的应用 :在这个例子中,容器会运行hello-world镜像中定义的应用,这通常是一个简单的脚本,打印出欢迎信息和Docker的版本信息。

  5. 显示输出 :最后,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成为现代应用程序开发和部署中不可或缺的工具。

相关推荐
全能全知者27 分钟前
docker快速安装与配置mongoDB
mongodb·docker·容器
阿尔帕兹2 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口4 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
景天科技苑7 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge7 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇7 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试9 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!15 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林16 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis18 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab