docker 核心技术原理及其应用(上)

一、docker 概览

docker 是开发,运行和部署应用程序的开放管理平台。开发人员能利用 docker 开发和运行应用程序,运维人员能利用 docker 部署和管理应用程序。
在这里插入图片描述
docker 提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。由于容器的隔离性和安全性,因此可以在一个主机 (宿主机) 上同时运行多个相互隔离的容器,互不干预。docker 已经提供工具和组件(Docker Client、Docker Daemon等)来管理容器的生命周期:

  1. 使用容器来开发应用程序及其支持组件。
  2. 容器成为分发和测试你的应用程序的单元。
  3. 准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。

为什么要使用 docker?

docker 使您能够将应用程序与基础架构分开,以便您可以快速交付软件。

  1. 借助 docker,您可以像管理应用程序一样管理基础架构。
  2. 通过利用 docker 的方法快速进行运输,测试和部署代码,您可以显着缩短编写代码和在生产环境中运行代码之间的延迟。如:
    • 开发人员在本地编写代码,可以使用 docker 同事进行共享,实现协同工作。
    • 使用 docker 开发完成程序,可以直接对应用程序执行自动和手动测试。
    • 当开发人员发现错误或 BUG 时,可以直接在开发环境中修复后,并迅速将它们重新部署到测试环境进行测试和验证。
    • 利用 docker 开发完成后,交付时,直接交付 docker,也就意味着交付完成。后续如果有提供修补程序或更新,需要推送到生成环境运行起来,也是一样的简单。
  3. docker 主要解决的问题:
    • 保证程序运行环境的一致性;
    • 降低配置开发环境、生产环境的复杂度和成本;
    • 实现程序的快速部署和分发。

docker 整体结构了解

Docker Engine 是一个包含以下组件的客户端 — 服务端(C/S)应用程序。服务端 — 一个长时间运行的守护进程(Docker Daemon)。REST API — 一套用于与 Docker Daemon 通信并指示其执行操作的接口。客户端 — 命令行接口 CLI( Command Line Interface)。
在这里插入图片描述
CLI 利用 docker 命令通过 REST API 直接操控 Docker Daemon 执行操作。Docker Daemon 负责创建并管理 Docker 的对象(镜像、容器、网络、数据卷)
在这里插入图片描述
Docker 客户端 (Docker Client) :是用户与 docker 进行交互的最主要方式。当在终端输入docker 命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client 除了连接本地服务端,通过更改或指定 DOCKER_HOST 连接远程服务端。
Docker 服务端 (Docker Server) :Docker Daemon 其实就是Docker 的服务端。它负责监听 Docker API 请求(如 Docker Client) 并管理 docker 对象(Docker Objects),如镜像、容器、网络、数据卷等。
Docker Registries:俗称 docker 仓库,专门用于存储镜像的云服务环境。Docker Hub 就是一个公有的存放镜像的地方,类似 Github 存储代码文件。同样的也可以类似 Github 那样搭建私有的仓库。
Docker 对象(Docker Objects)

  1. 镜像:一个 docker 的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
  2. 容器:镜像被运行起来后的实例。
  3. 网络:外部或者容器间如何互相访问的网络方式,如 host 模式、bridge 模式。
  4. 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。

docker 底层技术了解

  1. docker 使用 Go 语言实现。
  2. docker 利用 linux 内核的几个特性来实现功能:
    利用 linux 的命名空间(Namespaces)、利用 linux 控制组(Control Groups)、利用 linux 的联合文件系统(Union File Systems)。这也就意味着 docker 只能在 linux 上运行。在Windows、MacOS上运行 docker,其实本质上是借助了虚拟化技术,然后在 linux 虚拟机上运行的 docker 程序。
  3. 容器格式 (Container Format) Docker Engine 将namespace、cgroups、UnionFS 进行组合后的一个package,就是一个容器格式(Container Format)。docker 通过对这个 package 中的 namespace、cgroups、UnionFS 进行管理控制实现容器的创建和生命周期管理。容器格式(Container Format)有多种,其中 docker 目前使用的容器格式被称为 libcontainer。
  4. Namespaces(命名空间):为 docker 容器提供操作系统层面的隔离。进程号隔离:每一个容器内运行的第一个进程,进程号总是从1开始起算。网络隔离:容器的网络与宿主机或其他容器的网络是隔离的、分开的,也就是相当于两个网络。进程间通隔离:容器中的进程与宿主机或其他容器中的进程是互相不可见的,通信需要借助网络。文件系统挂载隔离:容器拥有自己单独的工作目录。内核以及系统版本号隔离:容器查看内核版本号或者系统版本号时,查看的是容器的,而非宿主机的。
  5. Control Groups (控制组-cgroups):为 docker 容器提供硬件层面的隔离,控制组能控制应用程序所使用的硬件资源。基于该性质,控制组帮助 docker 引擎将硬件资源共享给容器使用,并且加以约束和限制。如控制容器所使用的内存大小。
  6. Union File Systems (联合文件系统—UnionFS):利用分层(layer)思想管理镜像和容器。

二、docker 版本与安装介绍

Docker-CE 和 Docker-EE

Docker-CE 指 docker 社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。Docker-EE 指 docker 企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和 IT 团队而设计。相比 Docker-CE,增加一些额外功能,更重要的是提供了更安全的保障。此外,docker 的发布版本分为 Stable 版和 Edge 版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)。通常情况下,Docker-CE 足以满足我们的需求。后面学习主要针对 Docker-CE 进行学习。

Linux Centos7 环境下安装 docker

安装环境:Centos 7
安装条件:docker 官方要求至少 3.8 以上,建议 3.10 以上
在这里插入图片描述
docker 版本:docker EE 企业版本、docker CE 社区版本
关闭防火墙:systemctl stop firewalld.service 和 设置 vi /etc/selinux/config
在这里插入图片描述
安装 Docker Ce 社区版本:

  1. 安装 wget 命令: yum install -y wget
  2. 下载阿里云 docker 社区版 yum 源
     cd /etc/yum.repos.d/
     wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  3. 查看 docker 安装包:yum list | grep docker
  4. 安装 Docker Ce 社区版本:yum install -y docker-ce.x86_64
  5. 设置开机启动:systemctl enable docker
  6. 更新 xfsprogs:yum -y update xfsprogs
  7. 启动 docker:systemctl start docker
  8. 查看版本:docker version
  9. 查看详细信息:docker info

docker 核心基础之配置阿里云镜像加速

  1. 点击 此处 登录阿里云,复制当前页面中的加速器地址。
  2. 选择操作文档中的 CentOS 配置镜像加速器,操作步骤如下:
    sudo mkdir -p /etc/docker
    vi /etc/docker/daemon.json ⇒ {
          
          
    	"registry-mirrors": ["自己的加速器地址"]}
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

三、docker 核心技术之镜像

镜像是一个 docker 的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。通过镜像可以创建一个或多个容器。

镜像管理

  1. 可以通过命令 docker command --help 更深入的了解指定的 docker 命令使用方法,例如:查看镜像搜索命令的具体用法:docker search --help
  2. 搜索镜像: docker search mysql
  3. 搜索镜像并过滤是官方的:docker search --filter “is-official=true” centos
  4. 搜索镜像并过滤大于多少颗星星的:docker search --filter stars=10 centos
  5. 搜索镜像结果只显示前 5 条: docker search --filter stars=10 centos --limit 5
  6. 查看本地镜像:docker images/docker image ls 例如:docker images ubuntu:latest
  7. 下载 centos7 镜像:docker pull centos:7
  8. 镜像删除:docker rmi/docker image rm,-f/--force 强制删除。删除本地的 centos7 镜像:docker rmi centos:7。多个镜像同时删除:docker rmi f643 8652
  9. 镜像保存备份 docker save,作用:将本地的一个或多个镜像打包保存成本地 tar 文件(输出到STDOUT)。-o, --output string 指定写入的文件名和路径,docker save -o linux_images.tar centos
  10. 镜像备份导入 docker load,作用: 将 save 命令打包的镜像导入本地镜像库中。 docker load -i linux_images.tar
  11. 镜像重命名 docker tag,作用:对本地镜像的 NAME、TAG 进行重命名,并新产生一个命名后镜像。docker tag centos:7 mycentos:1
  12. 镜像详细信息 docker image inspect/docker inspect。例如:docker image inspect centos:7、docker image inspect -f “{ {json .Id}}” centos:7、docker image inspect -f “{ {json .Created}}” centos:7。-f, --format string 利用特定 Go 语言的 format 格式输出结果
  13. 镜像历史信息 docker history,作用:查看本地一个镜像的历史(历史分层)信息。例如:docker history centos:7、 docker history centos:7 -H=False

在这里插入图片描述

四、docker 核心技术之容器

什么是容器? 容器 (Container):容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在几乎任何地方以相同的方式运行。docker 将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。容器具备一定的生命周期。另外,可以借助 docker ps 命令查看运行的容器,如同在 linux 上利用 ps 命令查看运行着的进程那样。

容器与虚拟机相同点:

  1. 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
  2. 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
  3. 容器中或虚拟机中都可以安装各种应用,如 redis、mysql、nginx 等。也就是说,在容器中的操作,如同在一个虚拟机(操作系统) 中操作一样。
  4. 同虚拟机一样,容器创建后,会存储在宿主机上:linux 上位于 /var/lib/docker/containers 下

容器与虚拟机不同点:

  1. 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合。
  2. 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要 Hypervisor、Guest OS),虚拟机额外更多的性能消耗;其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把 docker 运行在虚拟机上。
    在这里插入图片描述
    注意:容器并不是虚拟机,但它们有很多相似的地方

虚拟机的生命周期:
在这里插入图片描述
容器的生命周期:
在这里插入图片描述

容器的生命周期管理

(1) 查看本地所有的容器:docker ps -a
(2) 查看本地正在运行的容器:docker ps
(3) 容器创建 docker create:作用:利用镜像创建出一个 Created 状态的待启动容器,命令格式:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
命令参数(OPTIONS):查看更多
-t, --tty  分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
--name  为容器起名,如果没有指定将会随机产生一个名称
命令参数 (COMMAND\ARG):COMMAND 表示容器启动后,需要在容器中执行的命令,如 ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如 ps 命令的 aux、ls 命令的 -a 等等。

命令演示:
在这里插入图片描述
(4) 容器删除 docker rm CONTAINER_ID/ CONTAINER_NAME,删除一个或多个容器

-f, --force  强行删除容器(会使用 SIGKILL信号) 
-v, --volumes  同时删除绑定在容器上的数据卷	

命令演示:
在这里插入图片描述
(5) 容器启动 docker start,作用:将一个或多个处于创建状态或关闭状态的容器启动起来。命令格式:

docker start [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-a, --attach		将当前 shell 的 STDOUT/STDERR 连接到容器上
-i, --interactive	将当前 shell 的 STDIN 连接到容器上	

命令演示1:
在这里插入图片描述
命令演示2:
在这里插入图片描述
(6) 容器创建并启动 docker run,作用:利用镜像创建并启动一个容器,命令格式:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令参数(OPTIONS):查看更多
-t, --tty:分配一个伪TTY,也就是分配虚拟终端
-i, --interactive:即使没有连接,也要保持 STDIN 打开
--name:为容器起名,如果没有指定将会随机产生一个名称
-d, --detach:在后台运行容器并打印出容器 ID
--rm:当容器退出运行后,自动删除容器
命令参数 (COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如 ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如 ps 命令的 aux、ls 命令的 -a 等等

命令演示:
在这里插入图片描述
docker run 相当于 docker create + docker start -a 前台模式
docker run -d 相当于 docker create + docker start 后台模式
(7) 容器关闭 docker stop,作用:关闭一个或多个处于暂停状态或者运行状态的容器,命令格式:

docker stop [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-t, --time int 关闭前,等待的时间,单位秒(默认10s)	

命令演示:
在这里插入图片描述
一次性停止所有容器:docker stop $(docker ps -a -q)
(8) 容器终止 docker kill,作用:强制并立即关闭一个或多个处于暂停状态或者运行状态的容器,命令格式:

docker kill [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-s, --signal string   	指定发送给容器的关闭信号 (默认 KILL 信号)

命令演示:
在这里插入图片描述
前提知识点:Linux 其中两种终止进程的信号是:SIGTERM 和 SIGKILL。SIGKILL信号:无条件终止进程信号。进程接收到该信号会立即终止,不进行清理和暂存工作。该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。SIGTERM信号:程序终结信号,可以由 kill 命令产生。与 SIGKILL 不同的是,SIGTERM 信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。docker stop 和 docker kill 的区别:

  1. docker stop 会先发出 SIGTERM 信号给进程,告诉进程即将会被关闭。在 -t 指定的等待时间过了之后,将会立即发出 SIGKILL 信号,直接关闭容器。
  2. docker kill 直接发出 SIGKILL 信号关闭容器。但也可以通过 -s 参数修改发出的信号。

因此会发现在 docker stop 的等待过程中,如果终止 docker stop 的执行,容器最终没有被关闭。而 docker kill 几乎是立刻发生,无法撤销。此外还有些异常原因也会导致容器被关闭,比如 docker daemon 重启、容器内部进程运行发生错误等等异常原因。

(9) 容器暂停 docker pause,作用:暂停一个或多个处于运行状态的容器;容器取消暂停 docker unpause,作用:取消一个或多个处于暂停状态的容器,恢复运行。命令演示如下:
在这里插入图片描述
(10) 容器重启 docker restart,作用:重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器,该命令相当于 stop 和 start 命令的结合。
(11) 查看容器详细信息:docker inspect CONTAINER_ID / CONTAINER_NAME
(12) 查看容器的日志信息:docker logs,容器日志中记录的是容器主进程的输出 STDOUT\STDERR
(13) 修改容器的名称:docker rename CONTAINER NEW_NAME
(14) 容器连接 docker attach,作用:将当前终端的 STDIN、STDOUT、STDERR 绑定到正在运行的容器的主进程上实现连接。
在这里插入图片描述
(15) 容器中执行新命令 docker exec 进入容器:docker exec -it 0ad5d7b2c3a4 /bin/bash

在这里插入图片描述

容器的文件复制与挂载

  1. 从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径 docker cp /root/123.txt kind_cerf:/home/
  2. 从容器复制到宿主机:docker cp 容器名字/ID:容器路径 宿主机本地路径 docker cp kind_cerf:/home/456.txt /root
  3. 宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 镜像ID docker run -itd -v /root/xdclass/:/home centos:7

五、docker 核心技术之容器与镜像

docker 容器与镜像的关系:
在这里插入图片描述
(1) 容器提交 docker commit,作用:根据容器生成一个新的镜像,命令格式:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令参数(OPTIONS):
-a, --author string  作者
-c, --change list  为创建的镜像加入 Dockerfile 命令
-m, --message string   提交信息,类似 git commit -m
-p, --pause 提交时暂停容器 (default true)	

命令演示如下:

docker ps -a
docker run -dti centos:7 bash
docker exec 629b yum install -y net-tools
docker exec 629b ifconfig
docker ps -a
docker commit -m "install net-tools" 629b centos-net:v1.0
docker images
docker run -dti 6ea0 bash
docker exec be8b ifconfig

(2) 容器导出 docker export,作用:将容器当前的文件系统导出成一个 tar 文件,docker export [OPTIONS] CONTAINER
在这里插入图片描述
-o, --output string 指定写入的文件,默认是 STDOUT
(3) 容器打包的导入 docker import,从一个 tar 文件中导入内容创建一个镜像,docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]],命令演示:
在这里插入图片描述
-c, --change list 为创建的镜像加入 Dockerfile 命令
-m, --message string 导入时,添加提交信息
(4) 镜像的 Layer
在这里插入图片描述
镜像的视角:
在这里插入图片描述
(5) 容器的 Layer
在这里插入图片描述
在这里插入图片描述
容器的视角:
在这里插入图片描述
容器与镜像的底层关系:
在这里插入图片描述
容器的运行:
在这里插入图片描述
在这里插入图片描述
总结:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/113360133