docker学习笔记

      最后更新:2022-07-31 09:01:35 手机定位技术交流文章

      什么?我能做什么?我能去哪里?我能怎么玩?

      是什么?

      Docker 之所以发展如此迅速,也 是因为它对此给出了一个标准化的解决方案-----系统平 滑移植,容器虚拟化技术。

      环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,你能从根本上解决这个问题吗?该软件可以与环境一起安装 吗?也就是说,安装的时候,用同样的方式复制原始环境。开发人员使用Docker来消除在协同编码时“正常运行在机器上”的问题。

      image-20220726100809560

      在服务器上运行应用程序环境的预配置,要安装各种软件,不管安装和配置这些东西有多困难,它还不能跨平台。如果我们在Windows上安装这些环境,Linux必须重新安装。即使它不穿过操作系统,切换到同一个操作系统的另一个服务器,移植应用也是非常麻烦的。 传统上认为,软件编码开发/测试后,结果是可编译和执行的程序或二进制代码(例如Java)。为了使这些程序顺利运行,开发团队还必须编写完整的部署文件,使Vim团队部署应用程序,开发需要明确告诉业务部署团队,使用所有配置文件+所有软件环境。不过,即便如此,部署失败仍经常发生。Docker 的出现使得 Docker 得以打破过去「程序即应用」的观念。通过图像排除操作系统的核心,运行应用程序所需的系统环境,由下而上打包,实现跨平台的应用程序之间的无缝接口。

      Docker理念

      Docker是一个基于Go语言的云开放源代码项目。多克的主要目标是“建设,Ship and Run Any App,Anywhere”,也就是说,通过管理包装、分配、部署和操作等应用程序组件的寿命周期,使用户应用程序(可以是网页应用程序或数据库应用程序等)及其操作环境“一个镜子”,处处运行”。

      image-20220726101726669

      Linux容器技术的出现解决了这个问题, 而 Docker 就是在它的基础上发展过来的。将应 用打成镜像,通过镜子成为一个运行在多克容器上的例子,而且多克容器在任何操作系统上都是一致的,这允许跨平台、跨服务器的实现。你只需要一次配置环境,换取其他机器,可以用单个键部署,大大简化了操作。

      软件容器解决了操作环境和配置问题,促进了连续的集成,并为整个印刷提供容器的虚拟化。

      容器与虚拟机比较

      容器发展简史

      image-20220726101840881

      image-20220726101848732

      传统虚拟机技术

      虚拟机(virtual machine)就是带环境安装的一 种解决方案。

      传统的虚拟机技术是基于在主操作系统上安装的虚拟机管理系统(如VirtualBox和VMWare),创建虚拟机(虚拟化各种硬件),从操作系统上安装到虚拟机,从操作系统上安装和部署各种应用程序。

      image-20220726102053511

      虚拟机的缺点:

      1. 资源占用多
      2. 冗余步骤 多
      3. 启动慢

      容器虚拟化技术

      由于以前的虚拟机的一些缺陷,Linux开发了另一个虚拟化技术

      image-20220726104114030

      Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。

      对比

      • 传统的虚拟机技术是虚拟化一套硬件,运行一个完整的操作系统,再运行该系统所需的应用程序过程;
      • 容器中的应用程序进程直接运行在主机的内核上,容器没有自己的内核和虚拟运行硬件,因此容器比传统的虚拟机更轻。
      • 每个容器是相互隔离的,每个容器都有自己的组件系统,容器之间的进程不会相互影响,并且可以区分计算资源。

      能干嘛

      • 技术职级变化

        • coder 码农
        • programmer 程序员
        • software engineer 软件开发工程师
        • DevOps engineer 开发运维工程师
      • DevOps新一代开发工程师

        • 一次构建、随处运行
        • 更快的应用程序交付和部署
        • 更易升级和扩展
        • 更简单的系统运维
        • 更有效地利用计算资源
        • 多克应用程序场景

        image-20220726105904601

        Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。

      下载

      • 官网

      docker 官网

      • 仓库

      多克中心网站

      安装

      CentOS端口安装

      • Docker不是通用的容器工具,它取决于一个现有和运行的Linux内核环境。
      • Docker基本上创建在已经运行的Linux下一个孤立的文件环境,因此,它的实现效率几乎与部署的Linux主机一样。因此,Docker必须在Linux内核系统上部署。如果其他系统想要部署Docker,它们必须安装一个虚拟Linux环境。

      前提条件

      目前, CentOS只支持发行版本的Docker内核。

      Docker运行在CentOS 7(64-bit)上,需要64-bit系统和Linux内核版本3.Eight或以上。

      查看自己的内核

      单元命令用于打印当前系统信息(内核版本号码、硬件架构、主机名称和操作系统类型等)。

      image-20220726112956938

      Docker组成

      镜像(image)

      容器与镜子之间的关系类似于面向对象编程中对象与类之间的关系。

      Docker 面向对象
      容器 对象
      镜像

      容器(container)

      从面向对象角度

      从镜像容器角度

      仓库(repository)

      总结

      镜像文件

      容器实例

      仓库

      多克平台架构

      image-20220726114535279

      工作原理

      Docker是一个Client-Server结构的系统,在主机上运行的Dockeremon进程,然后通过客户端访问的接口连接,デーモン进程接受客户端的命令,并管理在主机上运行的容器。 容器,是一个运行时环境,那是我们以前所说的容器。

      image-20220726114618000

      Docker是一个C/S模型的架构,而后端是一个自由耦合的架构,有许多模块分组。

      多克操作的基本过程是:

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

      image-20220726115245235

      安装

      centos安装

      卸载旧版本

      yum安装gcc相关

      CentOS 7可以连接到互联网

      安装需要的软件包

      建立一个稳定的镜子仓库

      报错

      用阿里云的

      Updateyum软件包目录

      多克CE安装

      启动多克并设置启动自启动

      docker version(查看版本)

      docker run hello-world

      image-20220726134029532

      停止

      卸载

      阿里云镜像加速

      地址

      用了老师的=v=

      重启

      你好世界永远

      run 干了什么

      image-20220726135048898

      底层原理

      为什么 Docker 会比 VM 虚拟机快

      1. docker 有着比虚拟机更少的抽象层 由于 docker 不需要 Hypervisor(虚拟机)实现 硬件资源虚拟化,运行在 docker 容器上的程序直 接使用的都是实际物理机的硬件资源。因此, 多克在 CPU 和 内存 利用 方面具有明显的效率优势.
      2. docker 利用的是宿主机的内核,而不需要加载操作系统 OS 内核 当新建一个容器时,docker 不需要和虚拟机一 样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源 的过程,当新建一个虚拟机时,虚拟机软件需要加 载 OS,返回新建过程是分钟级别的。而 docker 由于直接利用宿主机的操作系统,则省略了返回 过程,因此新建一个 docker 容器只需要几秒钟。

      image-20220726140956288

      Docker容器 虚拟机(VM)
      操作系统 与宿主机共享OS 在主机OS上运行虚拟机OS
      存储大小 小型镜子,易于储存和传输 大镜子(vmdk, vdi等)
      运行性能 几乎无额外性能损失 操作系统的额外 CPU 和 内存消耗
      移植性 轻量、灵活、适合Linux 重负,高耦合与虚拟化技术
      硬件亲和性 面向软件开发者 面向硬件运维者
      部署速度 快速,秒级 较慢,10s以上

      常用命令

      帮助启动类命令

      镜像命令

      docker images列出本地主机上的镜子

      image-20220726141732733

      解释

      备注:

      • -a:列出所有本地镜子(包括历史视频层)
      • -q:只显示镜子ID。
      • docker search 某个 XXX 镜像名字
      • 网站
      • https://hub.docker.com

      docker search [OPTIONS] 镜像名字

      参数 说明
      NAME 镜像名称
      DESCRIPTION 镜像说明
      STARS 点赞数量
      OFFICIAL 是否是官方的
      AUTOMATED 是否是自动构建的

      备注:

      • –limit : 只列出 N 个镜像,默认 25 个
      • docker search --limit 5 redis

      多克拉出一个 XX 镜子名称。

      下载镜像

      • docker pull mirror name [:TAG]
      • 多克拉出镜子名称
      • 没有タグ是最新版本
        • 等价于 多克拉出镜子名称:latest

      docker images -qa查看安装镜像ID

      docker system df 查看镜子/容器/数据卷占用的空间

      Docker rmi Some XX mirror name ID (删除镜子)

      删除单个

      删除多个

      删除全部

      谈论多克 悬挂镜像什么?

      是什么

      长什么样

      image-20220726150053595

      容器命令

      有一个镜子来创造一个容器,这是基本前提

      新建+启动容器

      选项说明

      参数 说明
      -p hostPort:containerPort 港口映射-p 8080:80
      -p ip:hostPost:containerPort 配置监听地址 -p 10.0.0.100:8080:80
      -p ip::containerPort 随机分配端口 -p 10.0.0.100::80
      -p hostPort:containerPort:udp 指定协议-p 8080:80:tcp
      -p 81:80 -p 443:443 指定多个

      启动交互式容器(前端命令行)

      列出所有当前运行的容器

      选项说明

      退出容器

      两种退出方式

      停止运行的容器启动

      重启容器

      停止容器

      强制停止容器

      删除已停止的容器

      一次删除多个容器实例

      启动监护器(后端服务器)

      多克运行-d容器名称

      问题:然后 docker ps -a 进行查看, 会发现容 器已经退出

      重要的是指出:为多克容器在后端运行,必须有一个前端进程

      雷迪斯前部和后部靴子展示

      前台交互式启动docker run -it redis:6.0.8

      后台守护式启动docker run -d redis:6.0.8

      查看容器日志

      查看在容器中运行的进程

      查看容器内部细节

      输入当前运行的容器并与命令行交互

      重新进入

      docker attach 容器 ID

      添付和exec之间的区别

      附带是一个直接输入容器启动命令的终端,并不会以退出退出启动新的进程,从而导致容器停止。

      Exec将打开容器中的一个新的终端,并可以通过退出而启动新的进程,而不致容器停止。

      建议使用dockerexec命令,因为退出容器端口不会使容器停止。

      尝试使用以前的Redis容器实例

      通常用-d后端启动程序,并用exec输入相应的容器实例

      从容器复制文件到主机

      容器→主机

      Docker cp容器ID:内容器路径目标主机路径

      导入和导出容器

      export 导出容器的内容留作为一个 tar 归档文件[对应 import 命令]

      import 从 tar 包中的内容创建一个新的文件系统再导入为镜像[对应 export]

      总结(命令)–容器

      image-20220726161446941

      Docker 镜像

      是什么

      分层的镜像

      以我们的 pull 为例,在下载的过程中我们可以 看到 docker 的镜像好像是在一层一层的在下载

      image-20220726182655619

      UnionFS(联合文件系统)

      花卷QAQ

      image-20220726182755679

      特点: 一个文件系统同时载入多个文件系统,但从外部看来只能看到一个文件系统。联合载入重叠层级文件系统,最终的文件系统将包含所有文件和目录

      多克的镜子装载原理

      rootfs (root file system) ,上面的Bootfs。它包含典型的Linux系统中的标准目录和文件,例如/dev、/proc、/bin、/etc。rootfs是多种操作系统版本,例如,Ubuntu,Centos 等

      image-20220726183010305

      对于一个简单的操作系统,rootfs可以很小,你只需要包含最基本的命令、工具和库,因为下层直接使用了主机的内核,你只需要提供rootfs。由此可见对于不同的 linux 发 行版, bootfs 基本是一致的, rootfs 会有差别, 因此不同的发行版可以公用 bootfs。

      为什么多克镜有这种层状结构?

      镜层的最大的优点之一是共享资源和复制和迁移方便

      例如,多个镜子是由同一基镜子构造的。那么 Docker Host 只需在磁盘上保存一份 base 镜像; 同时内存中也只需加载一份 base 镜像,可以供应所有容器。每一层镜子都可以共享。

      重点理解

      image-20220726190240610

      Docker 镜像 commit 操作案例

      docker commit提交容器的副本,使其成为新的镜子

      docker commit -m="提交描述信息" -a="作者"容器ID创建对象图像名称:[标签名称]

      ubuntu安装vim的案例演示

      • 从Hub本地下载ubuntu镜子并成功运行

      • 原来的默认Ubuntu镜子似乎没有Vim命令

      • 在外部网络连接的情况下安装vim

      image-20220726190906768

      安装后, 提交我们自己的新镜子

      启动新的镜子,与旧镜子比较

      小总结

      多克的镜片层,通过扩展现有的镜子支持,创建 新的镜像。类似于从Base基础类继承的Java,自己 再按需扩展。新的镜子看起来像基础镜子的层层.每安装一 个软件,在现有镜子顶部添加一层

      本地镜子向阿里云发布

      image-20220727164729939

      基于当前容器创建一个新的镜像,新功能增强 docker commit [OPTIONS] 容 器 ID [REPOSITORY[:TAG]]

      image-20220727164820292

      用了老师的=v=,我服务器买的腾讯云的,腾讯云的镜像仓库要收费就不尝试了

      image-20220727165507418

      从阿里云到本地下载镜子

      image-20220727165541883

      本地镜子向私人图书馆开放

      image-20220727165645869

      Docker Registry

      下载镜像 Docker Registry速度慢

      docker pull registry

      我已经拖了一年了,我还没拖下来,我拿到了。

      image-20220727174726957

      解决方法

      改镜像仓库地址

      image-20220727174411884

      重新启动载荷配置文件,重新启动多克服务

      再次拉取,秒拉

      image-20220727174640053

      看看镜子,把它拉下来

      image-20220727174746890

      运行私有库 Registry,相当于本地有个私有 Docker hub

      image-20220727182452564

      例示创建新的镜子,ubuntu安装 ifconfig命令

      image-20220727191157802

      Curl确认私人收藏中是否有镜子

      image-20220727191338421

      将新的镜子带到newipyubuntu:1.2修改符合私人服装标准的标签

      修改配置文件以支持http

      注意有个,

      上述理由:docker 默认不允许 http 方式推送镜像,通 过配置选项来取消这个限制。====> 修改完后如果不 生效,建议重启 docke

      image-20220727191609281

      重启docker

      重启私有仓库

      将本地镜子转移到本地私人图书馆

      image-20220727191705825

      Curl确认私人收藏中是否有镜子

      image-20220727191738264

      向本地拉动并运行

      image-20220727191938403

      image-20220727192143677

      多克容器数据量

      --privileged=true

      一句话:有点类似我们 Redis 里面的 rdb 和 aof 文件 将 docker 容器内的数据保存进宿主机的磁盘中

      用容器滚动存储函数运行容器实例

      image-20220727210819562

      能干嘛

      将运用与运行的环境打包镜像,run 后形成容器实例运行 ,但是我们对数据的要求希望是持久化的

      特点

      1. 数据量可以在容器之间共享或重用
      2. 音量的变化可以直接在实时生效实时的
      3. 数据量的变化将不包括在镜像更新中
      4. 数据卷的寿命持续到容器使用为止

      数据卷案例

      主机与容器之间映射添加容器体积

      直接命令添加

      image-20220727211526678

      没有这个目录的主机将自动创建它,只要权限有限

      查看主机目录

      image-20220727211646172

      在docker container.txt中创建a

      image-20220727211826435

      查看主机目录里内容

      image-20220727211931807

      主机建一个

      image-20220727212015517

      查看 Docker容器内

      image-20220727212035673

      检查数据量是否成功上传

      image-20220727212607198

      可以挂载多个目录

      容器和主机之间的数据共享

      容器停掉,主机修改

      image-20220727213110509

      进入容器视图目录

      image-20220727213237562

      数据同步了

      读写规则映射添加指令

      读写(默认)

      rw = read + write

      image-20220727213425743

      只读

      容器实例是内部限制的,只读和不写

      image-20220727213802366

      image-20220727214201370

      卷的继承和共享

      容器1完成和主机映射

      在容器u1.txt中创建u1数据

      image-20220728081743508

      U1创建的U1数据可以在 host.txt上查看

      image-20220728081932122

      主机创建 host.txt

      image-20220728082052027

      继承命令

      成功继承

      image-20220728082548062

      u1悬挂, u2创建c.txt

      image-20220728082707469

      主机还能看到新增的

      image-20220728082745977

      常规软件的安装

      • 搜索镜像
      • 拉取镜像
      • 查看镜像
      • 启动镜像
        • 服务端口映射
      • 停止容器
      • 移除容器

      tomcat安装

      在多克中心找到一个汤姆卡特镜子.

      image-20220728083321700从 docker hub 上拉取 tomcat 镜像到本地

      image-20220728083412196

      docker images 查看是否有拉取到的 tomcat

      image-20220728083800335

      使用 tomcat镜子创建容器实例(也称为运行镜子)

      image-20220728083612336

      image-20220728083714735

      查看一下

      image-20220728083831012

      访问猫首页

      image-20220728085050035

      解决

      可能没有映射端口或关闭防火墙

      进入容器

      image-20220728085155601

      删除webapps

      将 webapps.dist 改名为 webapps

      image-20220728085422997

      再次访问,成功

      image-20220728085446958

      免修改版说明

      Tomcat8需要修改, Tomcat10需要修改

      mysql安装

      docker hub 上面查找 mysql 镜像

      image-20220728091603102

      从 docker hub 上(阿里云加速器)拉取 mysql 镜像到本地标签为 5.7

      image-20220728091701032

      使用 mysql5.7镜子创建一个容器(也称为运行镜子)

      image-20220728091900942

      简单版

      使用 mysql镜子

      检查是否占有3306码头

      image-20220728092943210

      启动成功

      image-20220728093013205

      进入容器

      image-20220728093119914

      image-20220728093216316

      image-20220728093424928

      在doccer上运行MySQL容器实例服务的外部Win10连接

      image-20220728093651706

      插入中文数据试试

      image-20220728093845746

      image-20220728093851594

      image-20220728094044082

      如何从容器中删除MySQL数据?

      容器数据卷

      新的MySQL容器例子

      image-20220728094651729

      停止之前的容器

      image-20220728094711807

      依旧报错

      image-20220728094829688

      换个名字

      mysql->mysql5.7

      image-20220728094851332

      进入新目录.cnf

      image-20220728095115742

      同步容器体积到Mysql容器实例

      重新启动mysql容器实例重新输入并查看字符编码

      image-20220728095511709

      image-20220728095522104

      再次建库建表

      image-20220728095949563

      插入中文数据,成功

      image-20220728100054766

      image-20220728100059013

      image-20220728100103110

      删除 containermysql5.7

      image-20220728100237653

      再次启动

      image-20220728100253752

      image-20220728100411249

      image-20220728100417081

      数据恢复了

      Redis安装

      入门命令

      image-20220728154432407

      创建目录

      image-20220728154639761

      复制 redis.conf到/app/redis目录

      在/app/redis directory.conf文件下修改 redis

      使用 redis6.0.8镜子创建容器(也称为运行镜子)

      image-20220728155723083

      进入容器

      image-20220728155755059

      image-20220728155906518

      重新设置主机的配置 file.conf

      image-20220728160103390

      image-20220728163157233

      重启服务

      image-20220728163229816

      数据库15的选择失败,表明主机修改将与多克容器内部的配置同步。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/31003.html

          热门文章

          文章分类