尚硅谷Docker实战教程学习笔记

尚硅谷Docker实战教程学习笔记

尚硅谷Docker实战教程学习笔记

我不会设置仅粉丝可见,不需要你关注我,仅仅希望我的踩坑经验能帮到你。如果有帮助,麻烦点个 👍 吧,这会让我创作动力+1 😁

写在前面

  • 封面 | 摘要 | 关键词

    尚硅谷Docker实战教程

    docker
    李英俊
    尚硅谷
    
  • 学习链接:尚硅谷Docker实战教程(docker教程天花板)

  • 感想 | 摘抄 | 问题

    • 什么是云原生:(我的理解)一切在云端,基于容器开发的都会打包push到registry中,然后pull下来进行使用

    • 麒麟系统离线安装docker

    • 开发流程:

      编码开发微服务
      上线部署容器化
      时时刻刻要监控
      devops
    • 面试题快速跳转:

1. Docker简介

  1. 是什么

    • 为什么会有docker出现

      系统平滑移植,容器虚拟化技术

      Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

      在这里插入图片描述

    • docker的理念

      在这里插入图片描述

    • Docker是基于Go语言实现的云开源项目

    • Docker的主要目标是:Build, Ship and Run Any App, Anywhere。也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能够做到 一次镜像,处处运行

    • Docker解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术

  2. 容器与虚拟机比较

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

      • 缺点:资源占用多,冗余步骤多,启动慢
    2. 由于前面虚拟机存在缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,LXC)

      • Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性一致性

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

      在这里插入图片描述

    3. 总结

      • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程;
      • 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便;
      • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
  3. 能干嘛

    1. 技术职级的变化:coder->programmer->software engineer->DevOps engineer

    2. 开发/运维(DevOps)新一代开发工程师

      • 一次构建、随处运行

        • 更快的应用交付和部署
        • 更便捷的升级和扩缩容
        • 更简单的系统运维
        • 更高效的计算资源利用
      • Docker的应用场景

        在这里插入图片描述

  4. 去哪儿下

    • docker官网:http://www.docker.com/
    • Docker Hub仓库:http://www.hub.docker.com/,安装docker镜像的仓库

2. Docker安装

  1. 前提说明

    1. Docker 并非是一个通用的容器工具,它依于已存在并运行的 Linux 内核环境。
    2. Docker 实质上是在已经运行的 Linux 下制造了个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
    3. 因此
      Docker 必须部署在 Linux 内核的系统上,如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。
    4. 获取系统版本内核:uname -r
  2. docker的基本组成

    1. 镜像,image

      • Redis r1 = docker run 镜像类似鲸鱼背上的集装箱,就是一个容器实例
    2. 容器,container 实例

      • 上述的 r1、r2、r3…多个实例
      • 容器是用镜像创建的运行实例
      • 可以看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
    3. 仓库,repository 存放镜像的地方

      • Maven仓库:放各种jar包
      • Github仓库:放各种git项目
      • Docker Hub:放各种镜像模板
    4. 小总结:image文件可以看作是容器的模板,Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。

      在这里插入图片描述

      在这里插入图片描述

      • docker daemon:真正干活的,通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。
  3. docker平台架构

    • docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职

      在这里插入图片描述

    • Docker运行的基本流程:

      • 用户使用Docker Client与Docker Daemon建立通信,并发送请求给后者
      • Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能,使其可以接收Docker Client的请求
      • Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式存在
      • Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储
      • 当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境
      • 当需要限制docker容器运行资源或者执行用户指令等操作时,则通过Exec driver来完成
      • Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作
  4. 安装步骤

    1. 确定版本
    2. 卸载旧版本
    3. yum安装gcc相关
      1. 能上外网(CentOS7)
      2. yum -y install gcc
      3. yum -y install gcc-c++
    4. 安装需要的软件包
      1. yum install -y yum-utils
      2. 配置docker库:yum-config-manager --add-repo https://xxx
      3. 推荐使用阿里云的加速:yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      4. 更新yum软件包索引:yum makecache fast
    5. 安装docker:yum install docker-ce docker-ce-cli containerd.io
    6. 启动docker:systemctl start docker
    7. HelloWorld:docker run hello-worlddocker version
      • 本地没有hello-world,则会从远程库拉下来运行
    8. 卸载:
      • systemctl stop docker
      • yum remove docker-ce docker-ce-cli containerd.io
      • rm -rf /var/lib/docker
      • rm -rf /var/lib/containerd
  5. 阿里云镜像加速

    1. 是什么:https://promotion.aliyun.com/ntms/act/kubernetes.html

    2. 注册账户,工具台,容器镜像服务,镜像工具,镜像加速器,获取加速器地址链接:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

      # 创建目录,将镜像配置反写回文件
      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
        "registry-mirrors": ["https://[你自己的].mirror.aliyuncs.com"]
      }
      EOF
      
      # 重启docker
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
  6. 测试运行hello-world

    • docker run hello-world

    • run到底干了什么

      在这里插入图片描述

  7. 底层原理:为什么Docker会比VM虚拟机要快

    • docker有着比虚拟机更少的抽象层

      由于docker不需要Hypervisor(虚拟机)实现硬件层面的虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上,docker将会在效率上有明显优势。

    • docker利用的是宿主机的内核,而不需要加载操作系统os内核

      当新建一个容器时,docker不需要和和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。

    在这里插入图片描述

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

3. Docker常用命令

  1. 帮助启动类命令

    • systemctl start docker:启动docker
    • systemctl stop docker:停止docker
    • systemctl restart docker:重启docker
    • systemctl status docker:查看docker状态
    • systemctl enable docker:开机启动docker
    • docker info:查看docker概要信息
    • docker --help:查看docker总体帮助文档
    • docker 具体命令 --help:查看docker命令帮助文档
  2. 镜像命令

    • docker images:列出本地主机上的镜像

      同一个仓库源可以有多个tag版本,代表这个仓库源的不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker将默认使用 ubuntu:latest 镜像。

      REPOSITORY:表示镜像的仓库源
      TAG:镜像的标签
      IMAGE ID:镜像ID
      CREATED:镜像创建时间
      SIZE:镜像大小
      

      OPTIONS说明:

      • -a:列出本地所有的镜像(含历史镜像层)
      • -q:;只显示镜像ID
    • docker search 镜像名:默认是从 hub.docker.com 上检索镜像列表,一般选第一个官方认证过的,比较靠谱

      OPTIONS说明:

      • --limit:只列出N个镜像,默认25个,例如docker search --limit 5 redis
    • docker pull 镜像名:下载镜像,docker pull 镜像名字[:TAG],没有tag就下载最新版

    • docker system df:查看镜像/容器/数据卷所占的空间

    • docker rmi [-f] 镜像名/镜像ID:[强制]删除镜像

      • 删除多个镜像:docker rmi -f id1 name2:tag2
      • 删除全部镜像:docker rmi -f $(docker images -qa)

    谈谈docker虚悬镜像是什么?

    • 是什么:仓库名、标签都是的镜像,俗称虚悬镜像 dangling image

    📖 参考延申

    虚悬镜像可能会在以下几种情况下产生

    1. 构建过程中出现错误,导致镜像没有被正确标记。
    2. 用户忘记为新创建的镜像添加标签。
    3. 用户试图删除一个正在被使用的镜像,但该镜像仍有其他容器在使用。

    虚悬镜像可能会带来一些问题

    • 无法找到正确的镜像版本:当用户试图运行一个虚悬镜像时,他们可能无法确定应该使用哪个版本的镜像。这可能导致应用程序运行在不同的环境中,或者在不同版本的代码上运行,从而导致兼容性问题。
    • 无法进行有效的更新:虚悬镜像意味着用户无法对其进行更新。即使镜像内部的版本进行了升级,用户也无法通过简单地添加一个新标签来获取这个新版本的镜像。
    • 占用存储空间:虽然虚悬镜像不会立即影响应用程序的运行,但是它们会一直占用存储空间,直到有人为它们添加标签。

    如何解决虚悬镜像问题,我们可以采取以下几种方案:

    • 检查并重新标记镜像:如果发现虚悬镜像,可以尝试查找出现问题的构建过程,并修复其中的错误。然后为镜像添加一个新的标签,以确保用户能够找到正确的版本。
    • 使用Dockerfile:Dockerfile可以帮助我们自动化镜像的构建过程,并确保每次构建的镜像都是正确且可重复的。通过编写详细的Dockerfile,我们可以确保每次构建的镜像都带有正确的标签。
    • 定期清理虚悬镜像:Docker提供了一些命令来帮助用户管理虚悬镜像,例如docker rmi --force可以强制删除虚悬镜像。然而,最好的方法还是定期检查并清理这些无用的虚悬镜像,以节省存储空间。
  3. 容器命令

    有镜像才能创建容器,这是根本前提

    • docker run 镜像名:新建+启动容器,启动交互式容器(前台命令行)

      • --name=名字:容器新名字,为容器指定一个名称
      • -d:后台运行容器并返回容器ID,启动守护式容器(后台运行)
      • -i:以交互模式运行容器,通常与 -t 同时使用
      • -t:为容器重新分配一个伪输入中断,通常与 -i 同时使用,也称交互式容器(前台有伪终端,等待交互)常用:docker run -it ubuntu /bin/bash(以交互模式启动一个容器,在容器内执行 /bin/bash 命令,退出:exit)
      • -P:随机端口映射,大P
      • -p:指定端口映射,小p。例:-p 6379:6379是指外面访问docker的6379服务(宿主机)被映射到容器内的6379服务(docker )
    • docker ps:列出当前所有正在运行的容器

      • -a:列出当前所有正在运行的容器+历史上运行过的
      • -l:显示最近创建的容器
      • -n:显示最近n个创建的容器
      • -q:静默模式,只显示容器编号
    • 容器的退出

      1. exit:run进去的容器,exit退出,容器停止(docker ps就没啦)
      2. ctrl+p+q:run进去的容器,ctrl+p+q,容器不停止
    • docker start 容器id/容器名:启动已经停止运行的容器

    • docker restart 容器id/容器名:重启容器

    • docker stop 容器id/容器名:停止容器

    • docker kill 容器id/容器名:强制停止容器

    • docker rm [-f] 容器id/容器名:[强制]删除容器

      一次性删除多个实例:

      • docker rm -f $(docker ps -a -q)
      • docker ps -a -q | xargs docker rm
  4. 其他

    • 启动守护式容器(后台服务器)

      • 在大部分得场景下,我们希望docker的服务是在后台运行的,,我们可以通过 -d 指定容器的后台运行模式

      • docker run -d 容器名

        问题:直接用 docker run 容器名 启动后用docker ps -a进行查看发现容器已经退出了,需要注意很重要的一点是,Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

        这是docker的机制问题,最佳的解决方案是:**将你要运行的程序以前台进程的形式运行,常见就是命令行模式 -it **,表示我还有交互操作,别中断。

      • 以redis为例,用前台交互式的启动肯定不行:docker run -it redis;所以要用后台守护式启动:docker run -d redis

    • docker log 容器id:查看容器日志

    • docker top 容器id:查看容器内运行的进程

    • docker inspect 镜像名/容器id:查看镜像配置/查看容器内部细节

    • 进入正在运行的容器,并以命令行交互

      • docker exec -it 容器id bashShell
      • 重新进入还有一个命令:docker attach 容器id

      上述两个命令的区别?工作中用哪一个?

      • attach直接进入容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李英俊小朋友

没事啦!白嫖不要紧啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值