Welcome to Bear2's Secret Garden 💬🐻💬
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

1.Docker概述与安装

1 为什么要用容器

  • 上线流程繁琐 开发->测试->申请资源->审批->部署->测试等环节

  • 资源利用率低 普遍服务器利用率低,造成过多浪费

  • 扩容/缩容不及时 业务高峰期扩容流程繁琐,上线不及时

  • 服务器环境臃肿 服务器越来越臃肿,对维护、迁移带来困难

2 Dockek核心概述

2.1 Docker是什么

  • 使用最广泛的开源容器引擎

  • 一种操作系统级的虚拟化技术

  • 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)

  • 一个简单的应用程序打包工具

2.2 Docker的形态

目前使用 Docker 基本上有两个选择:Docker DesktopDocker Engine

Docker Desktop 是专门针对个人使用而设计的,支持 Mac 和 Windows 快速安装,具有直观的图形界面,还集成了许多周边工具,方便易用,但是太推荐使用 Docker Desktop,原因有两个。第一个,它是商业产品,难免会带有 Docker 公司的“私人气息”,有一些自己的、非通用的东西,不利于我们后续的 Kubernetes 学习。第二个,它只是对个人学习免费,受条款限制不能商用,我们在日常工作中难免会“踩到雷区”

Docker Engine 则和 Docker Desktop 正好相反,完全免费,但只能在 Linux 上运行,只能使用命令行操作,缺乏辅助工具,需要我们自己动手 DIY 运行环境。不过要是较起真来,它才是 Docker 当初的真正形态,“血脉”最纯正,也是现在各个公司在生产环境中实际使用的 Docker 产品,毕竟机房里 99% 的服务器跑的都是 Linux

2.3 Docker的设计目标

  • 提供简单的应用程序打包工具
  • 开发人员和运维人员职责逻辑分
  • 多环境保持一致性

2.4 Docker应用场景

  • 应用程序打包和发布
  • 应用程序隔离
  • 持续集成
  • 部署微服务
  • 快速搭建测试环境
  • 提供PaaS产品(平台即服务)

3 Docker的架构

这张图精准地描述了 Docker Engine 的内部角色和工作流程

命令行 docker 实际上是一个客户端 client ,它会与 Docker Engine 里的后台服务 Docker daemon 通信,而镜像则存储在远端的仓库 Registry 里,客户端并不能直接访问镜像仓库

Docker client 可以通过 build、pull、run等命令向 Docker daemon 发送请求,而 Docker daemon 则是容器和镜像的“大管家”,负责从远端拉取镜像、在本地存储镜像,还有从镜像生成容器、管理容器等所有功能

所以,在 Docker Engine 里,真正干活的其实是默默运行在后台的 Docker daemon,而我们实际操作的命令行工具“docker”只是个“传声筒”的角色

4 Docker的隔离性

4.1 为什么要隔离

出于系统安全,在操作系统层面,需要做到隔离

对于 Linux 操作系统来说,一个不受任何限制的应用程序是十分危险的。这个进程能够看到系统里所有的文件、所有的进程、所有的网络流量,访问内存里的任何数据,那么恶意程序很容易就会把系统搞瘫痪,正常程序也可能会因为无意的 Bug 导致信息泄漏或者其他安全事故。虽然 Linux 提供了用户权限控制,能够限制进程只访问某些资源,但这个机制还是比较薄弱的,和真正的“隔离”需求相差得很远

使用容器技术,我们就可以让应用程序运行在一个有严密防护的“沙盒”(Sandbox)环境之内

另外,在计算机里有各种各样的资源,CPU、内存、硬盘、网卡,虽然目前的高性能服务器都是几十核 CPU、上百 GB 的内存、数 TB 的硬盘、万兆网卡,但这些资源终究是有限的,而且考虑到成本,也不允许某个应用程序无限制地占用

容器技术的另一个本领就是为应用程序加上资源隔离,在系统里切分出一部分资源,让它只能使用指定的配额

比如只能使用一个 CPU,只能使用 1GB 内存等等,就好像在隔离酒店里保证一日三餐,但想要吃山珍海味那是不行的。这样就可以避免容器内进程的过度系统消耗,充分利用计算机硬件,让有限的资源能够提供稳定可靠的服务

4.2 与虚拟机的区别

容器和虚拟机面对的都是相同的问题,使用的也都是虚拟化技术,只是所在的层次不同.可以参考 Docker 官网上的两张图

容器和虚拟机的目的都是隔离资源,保证系统安全,然后是尽量提高资源的利用率

虚拟机

使用 VirtualBox/VMware 创建虚拟机,能够在宿主机系统里完整虚拟化出一套计算机硬件,在里面还能够安装任意的操作系统,这内外两个系统也同样是完全隔离,互不干扰

而在数据中心的服务器上,虚拟机软件(即图中的 Hypervisor)同样可以把一台物理服务器虚拟成多台逻辑服务器,这些逻辑服务器彼此独立,可以按需分隔物理服务器的资源,为不同的用户所使用

从实现的角度来看,虚拟机虚拟化出来的是硬件,需要在上面再安装一个操作系统后才能够运行应用程序,而硬件虚拟化和操作系统都比较“重”,会消耗大量的 CPU、内存、硬盘等系统资源,但这些消耗其实并没有带来什么价值,属于“重复劳动”和“无用功”,不过好处就是隔离程度非常高,每个虚拟机之间可以做到完全无干扰

容器

它直接利用了下层的计算机硬件和操作系统,因为比虚拟机少了一层,所以自然就会节约 CPU 和内存,显得非常轻量级,能够更高效地利用硬件资源。不过,因为多个容器共用操作系统内核,应用程序的隔离程度就没有虚拟机那么高了

容器相比于虚拟机最大的优势体现在运行效率,同样的系统资源,虚拟机只能跑 3 个应用,其他的资源都用来支持虚拟机运行了,而容器则能够把这部分资源释放出来,同时运行 6 个应用

不过,虚拟机和容器这两种技术也不是互相排斥的,它们完全可以结合起来使用,用虚拟机实现与宿主机的强隔离,然后在虚拟机里使用 Docker 容器来快速运行应用程序

image-20220812152225345

4.3 隔离原理

容器的基本实现技术是 Linux 系统里的 namespace、cgroup、chroot

namespace 是 2002 年从 Linux 2.4.19 开始出现的,和编程语言里的 namespace 有点类似,它可以创建出独立的文件系统、主机名、进程号、网络等资源空间,相当于给进程盖了一间小板房,这样就实现了系统全局资源和进程局部资源的隔离

cgroup 是 2008 年从 Linux 2.6.24 开始出现的,它的全称是 Linux Control Group,用来实现对进程的 CPU、内存等资源的优先级和配额限制,相当于给进程的小板房加了一个天花板

chroot 的历史则要比前面的 namespace、cgroup 要古老得多,早在 1979 年的 UNIX V7 就已经出现了,它可以更改进程的根目录,也就是限制访问文件系统,相当于给进程的小板房铺上了地砖

5 Docker安装

  • Docker的版本

    • 社区版(Community Edition,CE)

    • 企业版(Enterprise Edition,EE)

  • 支持平台

    • Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)
    • Mac
    • Windows

5.1 手动安装

更多安装参考:Docker官方文档安装说明

较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,需要卸载它们以及相关的依赖项

$ yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装 Docker Engine-Community,使用 Docker 仓库进行安装,在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker

1.设置仓库

安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

$ yum install -y yum-utils device-mapper-persistent-data lvm2

使用以下命令来设置稳定的仓库

官方源地址

$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

国内源地址,阿里云

$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.安装Docker Engine-Community

安装最新版本的 Docker Engine-Community 和 containerd

$ yum install docker-ce docker-ce-cli containerd.io

要安装特定版本的 Docker Engine-Community,要在存储库中列出可用版本,然后选择并安装

$ yum list docker-ce --showduplicates | sort -r

docker-ce.x86_64  3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64  3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64  18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64  18.06.0.ce-3.el7                    docker-ce-stable

该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1

$ yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

3.启动docker设置开机启动

$ systemctl start docker		#启动
$ systemctl enable docker		#开机自启

4.验证安装是否成功

使用的命令是 docker versiondocker info来验证安装是否成功

docker version 会输出 Docker 客户端和服务器各自的版本信息

$ docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:05:12 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:03:33 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        v1.1.2-0-ga916309
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker info 会显示当前 Docker 系统相关的信息,例如 CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等等

docker info 显示的这些信息,对于我们了解 Docker 的内部运行状态非常有用,比如在这里,你就能够看到当前有一个容器处于停止状态,有 8 个镜像,存储用的文件系统是 overlay2,Linux 内核是 5.13,操作系统是 Ubuntu 22.04 Jammy Jellyfish,硬件是 aarch64,两个 CPU,内存 4G

$ docker info
Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 8
 Server Version: 20.10.12
 Storage Driver: overlay2
  Backing Filesystem: extfs
 Cgroup Driver: systemd
 Default Runtime: runc
 Kernel Version: 5.13.0-19-generic
 Operating System: Ubuntu Jammy Jellyfish (development branch)
 OSType: linux
 Architecture: aarch64
 CPUs: 2
 Total Memory: 3.822GiB
 Docker Root Dir: /var/lib/docker

5.2 自动安装

使用官方安装脚本自动安装

$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

也可以使用国内 daocloud 一键安装命令

$ curl -sSL https://get.daocloud.io/docker | sh

5.3 卸载

删除安装包

$ yum remove docker-ce

删除镜像、容器、配置文件等内容

$ rm -rf /var/lib/docker