写点什么

linux(centos)中部署 docker(步骤超全,含带一些发展史和一些概念)

作者:A-刘晨阳
  • 2022-11-14
    北京
  • 本文字数:4992 字

    阅读完需:约 16 分钟

前言

  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。  Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。


容器技术发展史:

  • 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的位置,从而达到了进程隔离的目的。

  • 2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术。Jails 英译过来是监狱的意思,这个“监狱”(用沙盒更为准确)包含了文件系统、用户、网络、进程等的隔离。

  • 2001 年 Linux 也发布自己的容器技术 Linux VServer,2004 Solaris 也发布了 Solaris Containers,两者都将资源进行划分,形成一个个 zones,又叫做虚拟服务器。

  • 2005 年年推出 OpenVZ,它通过对 Linux 内核进行补丁来提供虚拟化的支持,每个 OpenVZ 容器完整支持了文件系统、用户及用户组、进程、网络、设备和 IPC 对象的隔离。

  • 2007 年 Google 实现了 Control Groups( cgroups),并加入到 Linux 内核中,这是划时代的,为后期容器的资源配额提供了技术保障。

  • 2008 年基于 cgroups 和 Linux namespace 推出了第一个最为完善的 Linux 容器 LXC。

  • 2013 年推出到现在为止最为流行和使用最广泛的容器 Docker,相比其他早期的容器技术,Docker 引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的 Rest API。

  • 2014 年 CoreOS 也推出了一个类似于 Docker 的容器 Rocket,CoreOS 一个更加轻量级的 Linux 操作系统,在安全性上比 Docker 更严格。

  • 2014 年,Kubernetes 项目正式发布,容器技术开始和编排系统起头并进。

  • 2015 年,由 Google,Redhat、Microsoft 及一些大型云厂商共同创立了 CNCF,云原生浪潮启动。

  • 2016 年 - 2017 年,容器生态开始模块化、规范化。CNCF 接受 Containerd、rkt 项目,OCI 发布 1.0,CRI/CNI 得到广泛支持。

  • 2017 年 - 2018 年,容器服务商业化。AWS ECS,Google EKS,Alibaba ACK/ASK/ECI,华为 CCI,Oracle Container Engine for Kubernetes;VMware,Redhat 和 Rancher 开始提供基于 Kubernetes 的商业服务产品。

  • 2017 年 - 2019 年,容器引擎技术飞速发展,新技术不断涌现。2017 年底 Kata Containers 社区成立,2018 年 5 月 Google 开源 gVisor 代码,2018 年 11 月 AWS 开源 firecracker,阿里云发布安全沙箱 1.0。

Docker 中两项核心技术

  Docker 本质就是宿主机的一个进程,Docker 是通过 Namespace 实现资源隔离,通过 Cgroup 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作。


  1.Namespace


  Linux Namespaces 机制提供一种资源隔离方案。PID,IPC,Network 等系统资源不再是全局性的,而是属于某个特定的 Namespace。每个 Namespace 下的资源对于其他 Namespace 下的资源都是透明,不可见的。因此在操作系统层面上看,就会出现多个相同 pid 的进程。系统中可以同时存在两个进程号为 0,1,2 的进程,由于属于不同的 Namespace,所以它们之间并不冲突。而在用户层面上只能看到属于用户自己 Namespace 下的资源,例如使用 ps 命令只能列出自己 Namespace 下的进程。这样每个 Namespace 看上去就像一个单独的 Linux 系统。



  2.Cgroup


   Cgroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等待)的机制,被 LXC、docker 等很多项目用于实现进程资源控制。Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理是通过该功能来实现的。四大功能:        


  • 资源限制:可以对任务使用的资源总额进行限制

  • 优先级分配:通过分配的 cpu 时间片数量以及磁盘 IO 带宽大小,实际上相当于控制了任务运行优先级

  • 资源统计:可以统计系统的资源使用量,如 cpu 时长,内存用量等

  • 任务控制:cgroup 可以对任务执行挂起、恢复等操作

Docker 核心概念

1. 镜像(Image)


   一个带有创建 docker 容器命令的只读模板,通常在一个基础镜像上添加附加的指令,来创建一个新镜像。


镜像的两个特征:


  • 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。

  • 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。


2. 容器(Container)


  容器与镜像的关系,就如同面向编程中对象与类之间的关系。


  因为容器是通过镜像来创建的,所以必须先有镜像才能创建容器,而生成的容器是一个独立于宿主机的隔离进程,并且有属于容器自己的网络和命名空间。  镜像由多个中间层(layer)组成,生成的镜像是只读的,但容器却是可读可写的,这是因为容器是在镜像上面添一层读写层(writer/read layer)来实现的。


3. 仓库(Repository)


仓库(Repository)是集中存储镜像的地方,仓库分为公有仓库与私有仓库。比如 Docker Hub,就是 Docker 官方提供的一个仓库服务器。

Docker 的逻辑架构

   Docker 采用的是 C/S 架构,Docker 客户端向服务端(docker-daemon)发送指令,docker-daemon 负责构建,运行以及分发 docker 容器,docker 的客户端与服务端可以运行在同一台主机上,也可以使用 docker 的客户端连接远程的服务端,客户端与服务端使用 RSET API 通信,也可以使用 Unix 套接字,或者是网络接口。另外还可以使用 docker compose 作为客户端,它可以控制一组 docker 容器的应用程序。

docker 优缺点

  优点:


  1. 快速部署:短时间内可以部署成百上千个应用,更快速交付到线上。

  2. 高效虚拟化:不需要额外的 hypervisor 支持,直接基于 linux 实现应用虚拟化,相比虚拟机大幅提高性能和效率。

  3. 节省开支:提高服务器利用率,降低 IT 支出。

  4. 简化配置:将运行环境打包保存至容器,使用时直接启动即可。

  5. 快速迁移和扩展: 可夸平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从 A 宿主机迁移到 B 宿主机, 甚至是 A 平台迁移到 B 平台。


  缺点:


隔离性:各应用之间的隔离不如虚拟机彻底。

Docker VS 虚拟化

虚拟化:


  传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给他的资源将全部被占用。每一个虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。


Docker:


  容器技术是和宿主机共享硬件资源及操作系统可以实现资源的动态分配。   容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。



docker 与虚拟化区别总结:


  1. docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动。

  2. docker 需要的资源更少,docker 在操作系统级别进行虚拟化,docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化。;

  3. docker 更轻量,docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量。对系统的利用率非常高

  4. 与虚拟机相比,docker 隔离性更弱,docker 属于进程之间的隔离,虚拟机可实现系统级别隔离;

  5. 快速创建、删除:虚拟化创建是分钟级别的,Docker 容器创建是秒级别的,Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。

  6. 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署;

docker 部署与管理

docker 安装

  在服务器上准备在线镜像源,然后添加 docker 的镜像源,如果之前安装过需要先卸载。

离线安装

连接中有步骤;部署docker的离线包


在线安装

<font color="green"><font color="green"><font color="green"><code class="language-bash">#安装依赖包[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2  #添加华为云的docker镜像地址[root@docker ~]# yum-config-manager --add-repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo# 更新缓存,只处理新添加的yum源缓存[root@docker ~]# yum makecache fast#安装docker,默认安装最新版本[root@docker ~]# yum -y install docker-ce#查看安装docker版本[root@docker ~]# docker –version(或者使用docker version)Docker version 20.10.7, build f0df350
[root@docker ~]# systemctl start docker#查看docker可以安装的版本[root@docker ~]# yum list docker-ce --showduplicates | sort -r</code></font></font></font>
复制代码

添加镜像加速器

由于 docker 默认从 docker hub(https://registry.hub.docker.com/)下载镜像,所以速度非常慢,可以通过阿里云的镜像加速器提高镜像拉取的速度。



<font color="green"><font color="green"><font color="green"><code class="language-bash">[root@docker ~]# mkdir -p /etc/docker[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
> {> "registry-mirrors": ["https://mrlmpasq.mirror.aliyuncs.com"]> }> EOF{ "registry-mirrors": ["https://mrlmpasq.mirror.aliyuncs.com"]}[root@docker ~]# systemctl daemon-reload[root@docker ~]# systemctl restart docker</code></font></font></font>
复制代码

docker 镜像管理

<font color="green"><font color="green"><font color="green"><code class="language-bash">#列出所有的镜像[root@docker ~]# docker imagesREPOSITORY   TAG       IMAGE ID   CREATED   SIZEREPOSITORY:表示镜像的仓库源TAG:镜像的标签IMAGE ID:镜像IDCREATED:镜像创建时间SIZE:镜像大小</code></font></font></font>
复制代码



docker 中还提供了专门管理镜像的子命令 docker image,用法与 docker 命令类似。


docker 容器管理

docker 运行容器命令

docker container run 命令是根据指定镜像创建一个容器并启动运行。如果本地没有该镜像,则从 docker 仓库中拉去镜像。所以 docker container run = docker image pull + docker container create + docker container start 命令格式:docker container run [选项] 镜像名称|镜像 ID [command]常用选项:



<font color="green"><font color="green"><font color="green"><code class="language-bash">1.运行交互式容器 [root@docker ~]# docker container run -it --name='centos-1' centos:7 /bin/bash[root@3ad7e1a5e55f /]#直接退出,运行exit,容器会结束运行[root@docker ~]# docker container ls -aCONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                     PORTS     NAMES3ad7e1a5e55f   centos:7   "/bin/bash"   39 seconds ago   Exited (0) 6 seconds ago             centos-1可以使用docker container start命令启动容器[root@docker ~]# docker container start centos-1 centos-1[root@docker ~]# docker container ls -aCONTAINER ID   IMAGE      COMMAND       CREATED              STATUS         PORTS     NAMES3ad7e1a5e55f   centos:7   "/bin/bash"   About a minute ago   Up 2 seconds             centos-1运行容器,不结束容器退出[root@docker ~]# docker container run -it --name='centos-2' centos:7 /bin/bash[root@764b82cb892f /]#(ctrl+pq)
2.启动守护进程式容器[root@docker ~]# docker container run -d nginx:latest cef133be2d53c0d4921ceba34855e7dc250984191d10d3dfedf82195e9d85d3c[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMEScef133be2d53 nginx:latest "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 80/tcp relaxed_lichterman764b82cb892f centos:7 "/bin/bash" 3 minutes ago Up 3 minutes centos-23ad7e1a5e55f centos:7 "/bin/bash" 5 minutes ago Up 4 minutes centos-1</code></font></font></font>
复制代码


发布于: 刚刚阅读数: 3
用户头像

A-刘晨阳

关注

还未添加个人签名 2022-06-16 加入

本人公众号《小刘Linux》,优质博主,欢迎大家的关注

评论

发布
暂无评论
linux(centos)中部署docker(步骤超全,含带一些发展史和一些概念)_Docker_A-刘晨阳_InfoQ写作社区