【neusoft】 Docker 的学习与使用

一.Docker的学习大纲

二.什么是Docker

可以看这个:https://www.zhihu.com/question/28300645/answer/560129869

Docker 是一个开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像,然后发布到任何流行的 Linux 或 Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的Docker有以下几个部分组成:

  1. DockerClient客户端

  2. Docker Daemon守护进程

  3. Docker Image镜像

  4. DockerContainer容器

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类

其中,仓库(公共仓库和私有仓库)中存放镜像,运行镜像可以创造容器。

三.Docker有什么用

当开发人员代码编写完成后,需要将项目打包程 jar包,然后将jar包发布到服务器上,但是现在需要一个新的环境(新的主机电脑),就需要在这个新的环境上搭建Mysql数据库,Tomcat服务器,Redis数据库等等。而且还需要相关的配置,例如Mysql的隔离策略,Tomcat的端口号的配置、项目的访问路径,Redis的缓存策略等等都需要从头来配置,而且还有可能配置失败。

而Docker就是在这样的一个应用场景下出来的一个技术,它可以将Mysql数据库等软件打包成i一个镜像,让运行这个镜像的时候,就会为我们生成一个容器,容器中包含Mysql数据库运行的环境和Mysql软件(包含一些配置)等。这样当需要在新环境上搭建Mysql数据库时,就不需要重头开始安装:下载安装包—>点击安装—>运行创建表的文件—>运行创建索引的文件—>配置端口号等。只需要运行镜像获得Mysql容器就可以了,这样就获得了一个Mysql的实例,而不需要重新安装。

其实,我觉得,Docker技术有一种软件的  " 绿色安装包 "的感觉,可以随意复制,解压即用。

四.Docker 和 VMWare虚拟机的区别

容器与虚拟机拥有着类似的使命:对应用程序及其关联性进行隔离,从而构建起一套能够随处运行的自容纳单元。

此外,容器与虚拟机还摆脱了对物理硬件的需求,允许我们更为高效地使用计算资源,从而提升能源效率与成本效益。

       虚拟机:
       我们传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给他的资源将全部被占用(这句话非常重要)。每一个虚拟机包括应用,必要的二进  制和库,以及一个完整的用户操作系统。
       Docker:
       容器技术是和我们的宿主机共享硬件资源及操作系统可以实现资源的动态分配。
       容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。

 

       虚拟机和容器都是在硬件和操作系统以上的,虚拟机有Hypervisor层,Hypervisor(虚拟机管理系统)是整个虚拟机的核心所在。他为虚拟机提供了虚拟的运行平台,管理虚拟机的操作系统运行。每个虚拟机都有自己的系统和系统库以及应用。

       容器没有Hypervisor这一层,并且每个容器是和宿主机共享硬件资源及操作系统,那么由Hypervisor带来性能的损耗,在linux容器这边是不存在的。
       但是虚拟机技术也有其优势,能为应用提供一个更加隔离的环境,不会因为应用程序的漏洞给宿主机造成任何威胁同时还支持跨操作系统的虚拟化,例如你可以在linux操作系统下运行windows虚拟机。

       从虚拟化层面来看,传统虚拟化技术是对硬件资源的虚拟,容器技术则是对进程的虚拟,从而可提供更轻量 级的虚拟化,实现进程和资源的隔离。
       从架构来看,Docker比虚拟化少了两层,取消了hypervisor层和GuestOS层,使用 Docker Engine 进行调度和隔离,所有应用共用主机操作系统,因此在体量上,Docker较虚拟机更轻量级,在性能上优于虚拟化,接近裸机性能。从应用场景来 看,Docker和虚拟化则有各自擅长的领域,在软件开发、测试场景和生产运维场景中各有优劣。

       具体对比:

  • 1. docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。
  • 2. docker需要的资源更少,docker在操作系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化
  • 3. docker更轻量,docker的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量。对系统的利用率非常高;
  • 4. 与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离;
  • 5. 安全性: docker的安全性也更弱。Docker的租户root和宿主机root等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机利用如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击;
  • 6. 可管理性:docker的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如VMware vCenter提供完备的虚拟机管理能力;
  • 7. 高可用和可恢复性:docker对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制,VMware可承诺虚拟机99.999%高可用,保证业务连续性;
  • 8. 快速创建、删除:虚拟化创建是分钟级别的,Docker容器创建是秒级别的,Docker的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间;
  • 9. 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署;

五.Docker 的安装

此次Docker的安装是安装在Linux centOS7.7 操作系统(阿里云)上的。通过 查看 os-release 这个文件,就可以看到当前Linux系统的发行版和版本。

在安装之前,我们需要去Docker官网找到安装Docker的流程文档。

然后根据这个文档一步一步的在CentOs上安装 Docker(如果是其他发行版的Linux,那么只需要看对应的文档就可以了,例如那个TAB页 --install on Ubuntu)。

1、安装步骤。

官网的Installation methods(安装方法)介绍了3种,这里使用Install using the repository(使用仓库的方式)这种方式来进行安装。

(1). 运行 yum install -y yum-utils 命令。 安装yum-utils软件包(提供yum-config-manager 实用程序)。

(2). 运行 yum -config -manager --add -repo 命令设置稳定的仓库,但是这里的地址要使用阿里云镜像地址(http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo),否则下载速度会很慢(由于服务器在国外)。 

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

   

      (3). 现在安装DOCKER引擎。

先更新索引: yum makecache fast  命令。

运行:yum install docker-ce docker-ce-cli containerd.io  命令安装最新版本的Docker,如果想安装指定版本的,则看图片第二步骤。

安装的流程很简单,如果出现:

则说明安装成功了。

整个安装步骤,我总结就3步:

1.安装yum-utils包(因为它提供yum-config-manager 实用程序)。

2.通过yum-config-manager 来设置稳定的仓库,以后镜像的下载都是从仓库中pull。

3.运行:yum install docker-ce docker-ce-cli containerd.io  命令安装最新版本的Docker。

六.Docker 的启动并测试

1.通过 systemctl start docker 启动docker (可以看到docker已经是服务了)。

systemctl start docker

2.运行docker version 查看当前docker的版本为20.10.6 ,是社区版本的Community(官方也推荐使用这个版本,免费开源的)。

3.通过运行 docker run hello-world 命令来运行 hello-world镜像。

docker run hello-world

4.通过docker images 命令查看下载的 hello-world 镜像。

七.Linux的yum命令

上面安装Docker的过程中,一直在使用yum命令,yum命令是干什么的?

yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器

基于 RPM (redhat package manager)包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

yum 语法:

yum [options] [command] [package ...]

  • options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为 "yes"),-q(不显示安装的过程)等等。

  • command:要进行的操作。

  • package:安装的包名。

远程下载软件并安装的一个命令。

八.配置阿里云镜像加速

使用加速器可以提升获取Docker官方镜像的速度。可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。

购买阿里云服务器之后,我们可以使用阿里云的镜像加速器(每个阿里云账户的加速器都不一样)。

1、创建/etc/docker文件夹。

sudo mkdir -p /etc/docker

2、给daemon.json文件配置仓库镜像地址(阿里云的镜像地址)。

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://25lixhxm.mirror.aliyuncs.com"]
}
EOF

3、重新加载deamon(守护进程)服务。

sudo systemctl daemon-reload

4、重启docker服务。

sudo systemctl restart docker

配置阿里云镜像加速总共分为上面4步,命令运行演示: 

      

九.Linux sudo命令,tee命令和systemctl命令

上面配置阿里云镜像加速的时候,涉及到了这3个命令。

1、sudo命令

Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。

使用权限:在 /etc/sudoers 中有出现的使用者。

2、tee命令

Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

也就是可以将内容写到文件当中。

其中 tee命令后面还使用了EOF:
        EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF。
        其用法如下:
        <<EOF        //开始
        ....
        EOF            //结束

        还可以自定义,比如自定义:
        <<BBB        //开始
        ....
        BBB              //结束

        EOF一般会配合cat能够多行文本输出,表示要输出的文本是标签内的内容。

3、systemctl命令

systemctlSystemd 的主命令,用于管理系统

十.Run的流程和Docker是怎么工作的

1、Run的运行流程。

当用 docker run 命令去运行镜像时的流程:

在这里插入图片描述

2、docker是怎么工作的。

docker是一个c/s结构的系统,docker(服务端)的守护进程运行在主机上,通过socket从客户端访问。dockerServer 接收到 docker 客户端的指令后,就会执行命令。

 

在这里插入图片描述

至于上图中说的 docker容器是一个小的Linux虚拟机我是不太认同的,我觉得就是一个容器,Linux系统还是主机的,不能混淆。

十一.镜像的基本命令(查,增,删)

1、docker images 命令

docker images : 列出本地镜像

       语法:docker images [OPTIONS] [REPOSITORY[:TAG]]

       OPTIONS说明:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);

  • --digests :显示镜像的摘要信息;

  • -f :显示满足条件的镜像

  • --format :指定返回值的模板文件;

  • --no-trunc :显示完整的镜像信息;

  • -q :只显示镜像ID

通过下面这个例子,可以看到,如果images后面有值,则说明此次查找镜像是按照REPOSITORY的名称来找的。

其中列表头的含义为:

REPOSITORY:代表仓库名称。

TAG:标签,可以理解为版本。

IMAGE ID:镜像唯一标识ID。

CREATED:镜像创建的时间。

SIZE:镜像的大小。

2、docker search命令

docker search : 从Docker Hub查找镜像

语法:docker search [OPTIONS] TERM

OPTIONS说明:

  • --automated :只列出 automated build类型的镜像;

  • --no-trunc :显示完整的镜像描述;

  • -f <过滤条件>:列出收藏数不小于指定值的镜像

 通过命令就可以在Hocker Hub(公共仓库)上查找镜像:

也可以通过 -f 参数来过滤指定收藏数的镜像,其中名称在前过滤条件在前都可以,但还是要和语法接近:

从上面我们可以看出,当查询docker search mysql时,出现的NAME值多种多样,所以这里的mysql指定的应该是仓库名称,而不是镜像名称

3、docker pull命令

docker pull : 从镜像仓库中拉取或者更新指定镜像。

       语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]

       OPTIONS说明:

  • -a :拉取所有 tagged 镜像

  • --disable-content-trust :忽略镜像的校验,默认开启

          如果只指定名称,则会从仓库中下载最后一个版本镜像:

[root@iZ2ze5lyn0i9qmlq6nynqtZ /]# docker pull mysql
Using default tag: latest                   --如果不指定,则默认最后一个版本
latest: Pulling from library/mysql
f7ec5a41d630: Pull complete                 --分层下载,docker images的核心,联合文件系统
9444bb562699: Pull complete 
6a4207b96940: Pull complete 
181cefd361ce: Pull complete 
8a2090759d8a: Pull complete 
15f235e0d7ee: Pull complete 
d870539cd9db: Pull complete 
493aaa84617a: Pull complete 
bfc0e534fc78: Pull complete 
fae20d253f9d: Pull complete 
9350664305b3: Pull complete 
e47da95a5aab: Pull complete 
Digest: sha256:04ee7141256e83797ea4a84a4d31b1f1bc10111c8d1bc1879d52729ccd19e20a   --签名  
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest    --镜像的真实地址


        什么叫做镜像的真实的地址,就是 docker pull mysqldocker pull docker.io/library/mysql:latest 两个命令是等价的。

如果想指定版本下载,则可以使用 docker pull mysql:5.7 命令来下载mysql的执行版本。

由于两个版本的 Mysql镜像有相同的文件,所以在下载的时候就不下载相同的文件,这样做的好处是节省磁盘空间,这就是分层下载的好处:

 

3、docker rmi命令

docker rmi : 删除本地一个或多少镜像。

语法:docker rmi [OPTIONS] IMAGE [IMAGE...]

       OPTIONS说明:

  • -f :强制删除;

  • --no-prune :不移除该镜像的过程镜像,默认移除;

可以通过镜像ID来删除镜像:

        这里有一个猜测,mysql的两个版本镜像有共用的文件,那么删除一个镜像之后,另一个镜像不就不能使用了?我猜删除一个镜像之前,肯定会校验这个镜像中的某些文件被不被共用,如果有共用的文件,那么只删除不共用的文件,共用的不删除留给其他的镜像使用。有交集的文件不删除。

十二.容器的基本命令

1、Docker run 命令

docker run :创建一个新的容器并运行一个命令。

参数:

  • --name="nginx-lb": 为容器指定一个名称;

  • -d: 后台运行容器,并返回容器ID;

  • -P: 随机端口映射,容器内部端口随机映射到主机的端口

  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

  • -i: 以交互模式运行容器,通常与 -t 同时使用;

  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

使用镜像tomcat:latest以交互模式启动一个容器,在容器内执行/bin/bash命令(参数为以命令行模式进入该容器):

2、Docker ps 命令

docker ps : 列出容器

OPTIONS说明:

  • -a :显示所有的容器,包括未运行的

  • -f :根据条件过滤显示的内容。

  • --format :指定返回值的模板文件。

  • -l :显示最近创建的容器。

  • -n :列出最近创建的n个容器。

  • --no-trunc :不截断输出。

  • -q :静默模式,只显示容器编号。

  • -s :显示总的文件大小。

这个命令很好理解,注意NAME值是我们给容器起的别名(例如mytomc):

 3、exit 命令

停止当前容器并退出。

4、Ctrl + P + Q命令

不停止容器并退出。

5、Docker rm命令

docker rm :删除一个多个容器。

语法:docker rm [OPTIONS] CONTAINER [CONTAINER...]         --其中CONTAINER代表的是容器id。

 

OPTIONS说明:

  • -f :通过 SIGKILL 信号强制删除一个运行中的容器(没有这个参数,是不能删除运行中的容器的)。

  • -l :移除容器间的网络连接,而非容器本身。

  • -v :删除与容器关联的卷。

删除一个运行中的tomcat容器:

删除多个容器(用表达式的方法): 

6、启动和停止容器

用docker start  容器ID,来启动对应的容器。

用docker stop 容器ID,来停止对应的容器。

用docker restart 容器ID,来重启对应的容器。

用docker kill 容器ID,强制杀死一个运行中的容器。

那么docker stop 和 docker kill 两个命令宏观上都是停止当前进程,那么有什么区别呢?

kill是不管容器同不同意,我直接执行kill -9,强行终止;stop的话,首先给容器发送一个TERM信号,让容器做一些退出前必须的保护性、安全性操作,然后让容器自动停止运行,如果在一段时间内,容器还是没有停止,再进行kill -9,强行终止

十三.日志,容器进程,元素据的查看

1、Docker logs命令

docker logs : 获取容器的日志。

语法:docker logs [OPTIONS] CONTAINER

OPTIONS说明:

  • -f : 跟踪日志输出

  • --since :显示某个开始时间的所有日志

  • -t : 显示时间戳

  • --tail :仅列出最新N条容器日志

2、Docker top命令

docker top :查看容器中运行的进程信息,支持 ps 命令参数。

查看tomcat容器的进程信息,只能查看运行中的容器进程:

3、Docker inspect命令

docker inspect : 获取容器/镜像的元数据。

十四.进入容器的命令和拷贝命令

1、Docker exec命令

docker exec :在运行的容器中执行命令(以交互的方式进入运行中的容器,进入之后可以修改配置文件等)。

后面的参数都没有改变,只是把docker run 命令换成了 docker exec命令。

2、Docker attach命令

docker attach :连接到正在运行中的容器。

和Docker exec命令不同的是,进入容器后,并不会创建一个命令行来让我们在容器中写命令。

3、Docker cp命令

docker cp :用于容器与主机之间的数据拷贝(包含文件和文件夹)。

将容器中的文件拷贝到主机上和从主机上拷贝文件到容器中:

十五.Docker-可视化容器管理工具Portainer

Portainer是一个可视化容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 而且完全免费,基于容器化的安装方式,方便高效部署。

十六.镜像原理之联合文件系统

1、什么是docker 镜像

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件的所有内容,包括代码,运行时系统,库,环境变量和配置文件。

2、什么是联合文件系统

Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础镜像可以通过分层来进行集成,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录

简单来说,镜像可以通过分层来进行集成,最下层的文件是镜像的基础文件(公共文件),上面的文件是各个镜像自己与其他镜像不同的文件。

3、 Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是联合文件系统(UnionFS)。

bootfs(boot file system—>boot文件系统) 主要包含bootloader(boot加载器)和kernel(内核),其中boot加载器主要是用来引导加载内核Linux刚启动时会加载bootfs(boot文件系统),在Docker镜像的最底层是bootfs(boot文件系统)。这一层与典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs(boot文件系统)转交给内核,此时系统就会卸载bootfs(boot文件系统)。

roorfs (root file system—>root文件系统),在bootfs(boot文件系统)之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etc 等标准的目录和文件rootfs(root文件系统)就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

对于一个精简的OS(操作系统),rootfs(root文件系统)可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel(内核),自己只需要提供rootfs(root文件系统)就行了,由此可见对于不同的Linux发行版,bootfs(boot文件系统)基本是一致的,rootfs(root文件系统)会有差别,因此不同的发行版(如Ubuntu,Centos等)可以公用bootfs(boot文件系统)。

4、Docker 镜像联合文件系统分层,Tomcat镜像示例


        采用这种分层结构最大的一个好处就是共享资源,比如有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。 比如,多个java程序镜像都可以共享同一个jdk镜像(base镜像),而不用每个java程序镜像都自己包含一个jdk镜像,这样虽然jdk镜像有百兆左右,比较大,但是可以共享,因此不会占用很大空间。
 

十七.镜像原理之分层理解

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值