Docker快速入门【极速浏览版】

news/2024/5/3 15:10:52/文章来源:https://blog.csdn.net/weixin_43495948/article/details/128119455

文章目录

  • 1
    • 1.1 Docker为什么出现
    • 1.2 Docker理念
    • 1.3 容器和虚拟机比较⭐️
    • 1.4 容器为什么比虚拟机快?⭐️
    • 1.5 Docker的基本组成⭐️
    • 1.6 Docker一个基本流程⭐️
    • 1.7 Docker架构⭐️
      • 1.7.1 入门版
      • 1.7.2 架构板
  • 2
    • 2.1 Centos Docker安装
    • 2.2 前提条件
    • 2.3 官网安装doc
    • 2.4 查看是否安装成功
    • 2.5 镜像加速
  • 3
    • 3.1 帮助启动类
    • 3.2 镜像命令⭐️
    • 3.3 容器命令⭐️
  • 4
    • 4.1 什么是镜像?
    • 4.2 分层镜像
    • 4.3 UnionFS⭐️
    • 4.4 镜像加载原理⭐️

1

1.1 Docker为什么出现

  • 假定我们现在正在开发一个项目,我所使用的是一台笔记本电脑且我的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。正在开发的应用依赖于当前的配置而且还要依赖于某些配置文件。此外,企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。希望尽可能多的在本地模拟这些环境而不产生重新创建服务器环境的开销。那么如何确保应用能够在这些环境运行和通过质量检测?并且在部署过程中不出现令人头痛的版本问题、配置问题,也无需重新编写代码和进行故障修复。
  • 答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案——系统平滑移植,容器虚拟化技术。
  • 环境配置相当麻烦,换一台机器,就要重来一次,费力费时。是否能从根本上解决呢?也就是说软件可以环境安装。安装的时候,把原始环境一摸一样的复制过来,开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题
  • 开发需要清楚的告诉运维部署团队,用的全部配置+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况,Docker的出现使得Docker得以打破过去[程序即应用]的观念。透过镜像(images)将作业系统核心除外,运作应用程序锁需要的系统环境,由下而上打包,达到应用程序跨平台间的无缝接轨运作。

1.2 Docker理念

  • 一次镜像,处处运行,从搬家到搬楼
  • Docker的主要目标是"build ,ship and run any app,anywhere",也就是通过应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到一次“一次镜像,处处运行”。
  • Linux容器技术的出现就就解决这样一个问题,而Docker就是在它的基础之上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作

1.3 容器和虚拟机比较⭐️

  • 虚拟机就是带环境安装的一种解决方案。它可以在一种操作系统里面去运行另一种操作系统。比如在Windows10系统里面运行Linux系统Centos7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一摸一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。传统虚拟机技术基于安装在操作系统上的虚拟机冠词系统(如VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用【显然这种对计算机资源的消耗比较大】

  • Linux容器(Linux Containers,缩写LXC)是与系统其他部分隔离开的一些列进程,从另一个景象运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有的依赖项,因而在从开发到测试在到生产的整个过程中,它具有可移植性和一致性。Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的资源和设置。系统因此而变的高效轻量并保证了部署在任何环境中的软件都能始终如一。

    简单来说容器是一种物理隔离,每个容器都自己的文件系统,它没有进行硬件虚拟,其上所有应用共用一个系统内核;而虚拟机会虚拟出来的一套完整的系统。

    Devops新一代开发工程师

1.4 容器为什么比虚拟机快?⭐️

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

1.5 Docker的基本组成⭐️

  • 镜像(image)
    Docker镜像就是一个只读的模版。本身也是一个文件,称为镜像文件。镜像可以用来创建Docker容器,一个镜像可以创建很多容器,它也相当于是一个root文件系统【这个地方还有一个比较直观的理解就是docker镜像文件类似于Java的类模版】

  • 容器(container)
    可以把容器看成一个简易版的Linux环境,一个容器运行一种服务,当我们需要的时候,就可以通过Docker客户端创建一个对应的运行实例,也就是我们说的容器。(包括root用户权限、进程空间、用户空间和网络空间)和运行在其中的应用程序。【相当于Java中的对象】

  • 仓库(repository)
    存放镜像的地方【类似meavn的仓库,存放各种jar包】。Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模版的地方。仓库分为公开仓库(public)和私有仓库(Private)两种形式。最大的公开仓库就是Docker Hub。存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。需要使用的时候拉取下来就可以了。

  • 小总结

    • Docker本身就是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
    • image文件可以看作是一个容器模版。Docker根据image文件生成一个容器实例。同一个Image文件,可以生成多个同时运行的容器实例。

1.6 Docker一个基本流程⭐️

在这里插入图片描述

1.7 Docker架构⭐️

1.7.1 入门版

在这里插入图片描述

1.7.2 架构板

Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。Docker运行的基本流程为:

  1. 用户使用Docker Client与Docker Daemon建立通信,并发送请求给后者;

  2. Docker Daemon作为Docker架构的主题部分,首先提供Docker Server的功能使其可以接受Docker Client的请求;

  3. Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在;

  4. Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储;

  5. 当需要Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境;

  6. 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成;

  7. Libcontainer是一项独立的容器管理包,Network Driver以及Exec Driver都是通过Libcontainer来具体对容器进行的操作;

    参考

2

2.1 Centos Docker安装

Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的小李几乎等同于所部署的Linux主机。因此,Docker必须部署在Linux内核的系统上,如果其他系统想要部署Docker就必须安装一个虚拟Linux环境。

2.2 前提条件

目前Centos仅发行版本中的内核支持Docker。Docker运行在Centos7(64-bit)上,要求系统为64位,Linux系统内核版本为3.8以上,这里选用Centos7.x。可以使用以下命令查看自己的内核情况(内核版本、硬件架构、主机名称和操作系统类型等)

[xxx@VM-0-8-centos ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) 
[xxx@VM-0-8-centos ~]$ uname -r
3.10.0-1160.11.1.el7.x86_64

2.3 官网安装doc

保证自己的网速健康
官网安装地址

2.4 查看是否安装成功

# 输出client和server的相关信息
docker version
# 会显示你安装成功的信息
docker run hello-world

2.5 镜像加速

配置镜像加速器,需要修改deamon配置文件/etc/docker/daemon.json
bash vi /etc/docker/daemon.json
将registry-mirrors换成你需要的,如我换成了腾讯云镜像加速:
bash "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ]

3

3.1 帮助启动类

  • 启动/暂停/重启/状态 docker
    systemctl start/stop/restart/status docker
    
  • 开启启动
    systemctl enable docker
    
  • 查看docker概要信息
    docker info
    
  • 查看docker总体帮助文档
    docker --help
    
  • 查看docker命令帮助文档
    docker 具体命令 --help
    

3.2 镜像命令⭐️

  • 查看所有镜像

    docker images
    # 各项说明
    # REPOSITORY:表示镜像的仓库源
    # TAG:镜像标签
    # IMAGE ID:镜像ID
    # CREATED:镜像创建时间
    # SIZE:镜像大小
    

    在这里插入图片描述

  • 搜索镜像

    # 只显示点赞前5个
    docker search [--limit 5]
    
  • 拉取镜像

    # 没有TAG就是最新版本
    docker pull 镜像名字[:TAG]
    
  • 查看镜像/容器/数据卷所占的空间

    docker system df
    
  • 删除镜像

    # 删除单个
    docker rmi -f 镜像id
    # 删除多个
    docker rmi -f 镜像名1:TAG 镜像名2:TAG
    # 删除全部:支持参数续传docker images -qa返回所有的镜像ID
    docker rmi -f $(docker images -qa)
    

    面试题:谈谈docker虚悬镜像是什么?
    答:仓库名、标签都是<none>的镜像,俗称虚悬镜像“dangling image”
    在这里插入图片描述

3.3 容器命令⭐️

  • 新建+启动容器😊

    docker run [OPTIONS] IMAGE [COMMAND][ARG...]
    # 比如以下的交互式方式启动ubuntu,后面的/bin/bash为交互命令的接口
    docker run -it ubuntu /bin/bash
    

    OPTIONS说明(常用):有些是一个减号,有些是两个减号,常用有以下几组

    参数说明
    –name为容器指定一个名称
    -d后台运行容器并返回容器ID,也即守护式容器(后台启动)
    参数说明
    -i以交互模式运行容器,通常与-t同时使用
    -t为容在重新分配一个伪输入终端,通常与-i同时使用
    参数说明
    -P随机端口映射,大写P
    -p指定端口映射,小写p

在这里插入图片描述

  • 启动式守护容器😊
    # 在大部分场景下,我们希望docker的服务是在后台运行的
    # 我们可以通过-d指定容器的后台运行模式
    # 很重要的一点说明:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果是不是哪些一致挂起的命令(比如运行top、tail),就会自动退出
    docker run -d 容器名
    
  • 进入正在运行的容器😊
    # 更加推荐使用exec
    docker exec -it 容器ID /bin/bash
    docker attach 容器ID
    
    上述两个的区别:
    • attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。
    • exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器停止,推荐使用exec
  • 查看所有容器
    docker ps [OPTIONS]
    # 查看当前正在运行的容器+历史上运行过的容器
    docker ps -a
    # 显示最近创建创建的容器
    docker ps -l
    # 显示最近的n个容器
    docker ps -n
    # 静默模式
    docker ps -q
    
    在这里插入图片描述
  • 退出容器
    # run进去容器,exit退出,容器停止
    exit
    # run进去容器,ctrl+p+q退出,容器不停止
    ctrl+p+q
    
  • 启动已经停止的容器
    docker start 容器ID或者容器名
    
    在这里插入图片描述
  • 重启容器
    docker restart 容器ID或者容器名
    
  • 停止容器
    docker stop 容器ID或者容器名
    
  • 强制停止容器
    docker kill 容器ID或容器名
    
  • 删除已停止的容器
    docker rm 容器ID
    # 一次性删除多个容器案列
    docker rm -f $(docker ps -a -q)
    docker ps -a -q | xargs docker rm
    
  • 查看容器日志
    docker logs 容器ID
    
  • 查看容器内运行进程
    docker top 容器ID
    
  • 查看容器内部细节
    docker inspect 容器ID
    
  • 从容器内拷贝文件到主机
    docker cp 容器ID:容器内路径 目的主机路径
    
  • 导入容器和导出容器
    # export导出容器的内容流作为一个tar归档文件[对应import命令]
    docker export 容器ID > newName.tar
    # import从tar包中内容创建一个新的文件系统再导入为镜像[对应export]
    cat newName.tar | docker import - 镜像用户/镜像名:镜像版本号
    

4

4.1 什么是镜像?

  • 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件),这个打包好的运行环境就是image镜像文件。
  • 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)

4.2 分层镜像

在这里插入图片描述

镜像分层最大的一个好处就是共享资源,方便迁移,就是为了复用。比如说内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像每一层都可以被共享。

4.3 UnionFS⭐️

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

4.4 镜像加载原理⭐️

  • docker的镜像实际上由一层一层的文件系统组成,这种层级别的文件系统UnionFS。
  • bootfs(boot file system)主要包含bootloader和kernel ,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成以后整个内核都在内存当中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs(root file system),在bootfs之上。包含的就是典型Linux系统的/dev,/proc,/bin,/etc等标准目录。rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos。
  • 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发型版本可以公用bootfs。

    Docker镜像层都是只读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作"容器层",“容器层"之下的都叫"镜像层”。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_228266.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么值得一个头条?从世界杯看“头条”正确打开方式

“足球皇帝”贝肯鲍尔曾说&#xff1a;“在绿茵场上滚动的不是足球&#xff0c;而是黄金。” 卡塔尔世界杯不仅是球迷的盛宴&#xff0c;也是品牌的盛宴。绿茵场广告屏上&#xff0c;众多品牌纷纷现身。还有部分中国企业通过签约球队和球星等形式露面世界杯&#xff0c;共同挖…

python的安装及常用语法(一)

python的安装及简单使用python解释器的安装1. windows系统安装方法2. 测试安装是否成功PyCharm代码编辑器的安装python的基础语法1. “input”用法&#xff1a;用户输入信息2. “bin”用法&#xff1a;将十进制转换为二进制3. “print”用法&#xff1a;输出信息4. 练习1. 张三…

Functional Programming in Java venkat(16) Being Lazy part3

文章目录Functional Programming in Java venkat(16): Being LazyLeveraging the Laziness of StreamsIntermediate and Terminal OperationsMethod Evaluation OrderPeeking into the LazinessFunctional Programming in Java venkat(16): Being Lazy 这里是记录学习这本书 F…

JavaScript的Web api接口

JavaScript的Web api 文章目录JavaScript的Web api选中元素事件操作元素获取/元素内容获取/修改元素属性获取/修改表单元素属性实现一个显示/隐藏 密码的功能实现一个加减计算器复选框全选/全不选获取/修改样式属性点击文字放大字体实现白天模式与夜间模式的切换操作节点新增节…

02_openstack私有云部署

目录 一、环境准备 1、准备服务器 2、主机名与域名配置 3、yum仓库配置 4、配置时间同步 二、安装Openstack与Nova依赖环境 1、Nova依赖软件包安装 2、Openstack依赖软件包安装 三、搭建私有云 1、环境检查 2、配置应答文件answer.ini 一、环境准备 1、准备服务器 …

Metabase学习教程:仪表盘-8

仪表板中的Markdown很有趣 如何在仪表板中使用Markdown以获得乐趣和有益。 开发有效仪表板通常包括为人们提供上下文&#xff0c;让他们了解计算是如何存在或为什么存在的。虽然精确的标题、描述和带标签的轴可以在很大程度上澄清可视化&#xff0c;但Metabase还允许您向仪表…

Python矩阵乘法 二重循环实现 + 列表推式

这是python 矩阵乘法的简单例子 col 2 row 2 a [[1, 2], [3, 4]] b [[5, 6], [7, 8]] c [[0, 0], [0, 0]] “”" a b c 二维矩阵初始化 c [[0 for col in range(col)] for row in range(row)] a [[0 for col in range(col)] for row in range(row)] b [[0 for c…

2022最新鸽哒IM即时通讯系统源码 带安卓、苹果、PC端(全开源)+部署教程

提示&#xff1a;即时通讯&#xff0c;纯原生开发&#xff0c;各种功能应有尽有 内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 提示&#xff1a;即时通讯&#xff0c;纯原生开发&#xff0c;各种功能应有尽有 鸽哒是一款类似于v的即时…

有序数组转换为二叉查找树

问题描述 给定一个整数数组&#xff0c;其元素为先序排列&#xff0c;将其转换为高度平衡的二叉查找树。 示例 示例1 Input: nums [-10,-3,0,5,9] Output: [0,-3,9,-10,null,5] Explanation: [0,-10,5,null,-3,null,9] is also accepted: 示例2 Input: nums [1,3] Output: …

Web3.0带来天翻地覆的变化?全面科普!所谓的Web3.0到底是什么?

Web3.0在2021年尾声突然蹿红&#xff0c;在美国国会的听证会里&#xff0c;一句“我们如何确保web3革命发生在美国”引发了大家对于Web3.0的关注&#xff0c;而后马斯克一篇内容为“有人看过web3.0吗? 我没有找到”的推文&#xff0c;将关于Web3.0的讨论推向了高潮。 甚至于这…

Scala集合习题001

熟话说的好&#xff1a;”纸上得来终觉浅&#xff0c;绝知此事要躬行“&#xff0c;所以现在我就以下的习题&#xff0c;来巩固 之前我学习的几个常见集合函数&#xff0c;加深理解。 目录 练习题 1&#xff1a;计算分组后的list 分别对应的长度&#xff0c;和累加值 练习题…

eMagin:当月产百万片时,4K MicroOLED成本将不是问题

在今年2022 SID显示周期间&#xff0c;Micro OLED微显示模组厂商eMagin曾展示一款专为超短焦VR头显开发的4K Micro OLED微显示屏&#xff0c;有趣的是&#xff0c;该显示屏连接的主板上印有STEAMBOAT字样&#xff0c;让人不禁怀疑它与Valve之间是否存在某种联系。甚至有猜测认为…

Vue 3的高颜值UI组件库

Vue 3.0 已经发布两年多的时间&#xff0c;今年 2 月 Vue 3.0 也正式成为新的默认版本。今天就来分享 7 个适用于 Vue 3 的高颜值 UI 组件库&#xff01; Element Plus Element Plus 是一套由饿了么开源出品的为开发者、设计师和产品经理准备的基于 Vue 3.0 的组件库。Elemen…

xcode swift 单元测试 test

XCTest是苹果官方的测试框架&#xff0c;是基于OCUnit的传统测试框架&#xff0c;测试编写起来非常简单。 测试案例一 创建一个单元测试 func testExample() throws {let personID:String "0123456789"let count personID.countXCTAssert(count < 10, "I…

分布式文件系统

0.0 分布式文件系统 一般做法&#xff1a; 传统的模式是我们通过tomcat或者nginx&#xff0c;存放静态资源文件。 存在的问题&#xff1a; 单个节点会出现存不下的情况&#xff0c;需要多个节点。 分布式文件系统 需要一个系统来管理多个计算机节点上的文件数据&#xff…

[附源码]计算机毕业设计springboot基于web的建设科技项目申报管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

word 中添加图片目录、内部链接

目录1. 图片、表格添加目录1.1 插入题注1.2 添加目录2. 添加内部链接1. 图片、表格添加目录 1.1 插入题注 只有正确地插入题注&#xff0c;图表目录才能快速生成。 &#xff08;1&#xff09;两个方法调用“题注”功能&#xff08;任选1个&#xff09; 方法一&#xff1a;在菜…

[附源码]SSM计算机毕业设计医院挂号系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Oracle表空间详细介绍

表空间概述 Oracle的表空间属于Oracle中的存储结构&#xff0c;是一种用于存储数据库对象(如&#xff1a;数据文件)的逻辑空间&#xff0c;是Oracle中信息存储的最大逻辑单元&#xff0c;其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间&#xf…

Cpp知识点系列-字符串

前言 记录一些对字符串的理解。 接下来我所说的都是依赖于头文件<string>的。 理论 什么是字符串 字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此&#xff0c;一个以 null 结尾的字符串&#xff0c;包含了组成字符串的字符。 string与cstring有什么区别…