• 【Docker】学习笔记(一)


    一、Docker简介

    1.1、Docker是什么

    环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。

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

    1.2、Docker的理念

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

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

    只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

    1.3、容器与虚拟机比较

    虚拟机的缺点:

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

    Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

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

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

    二、Docker安装

    2.1、Docker的安装前的知识

    2.1.1、 Docker的基本组成

    1. 镜像(image)
      Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器
      相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
    2. 容器(container)
      Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例
    3. 仓库(repository)
      集中存放镜像文件的场所。

    2.1.2、Docker运行的基本流程为

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

    2.2 安装

    【Linux】Docker安装

    2.3 阿里云镜像加速

    官网
    注册一个属于自己的阿里云账户(可复用淘宝账号)获得镜像加速器地址连接
    在这里插入图片描述

    2.4 底层原理

    2.4.1、run 干了什么

    在这里插入图片描述

    2.4.2、为什么Docker会比VM虚拟机

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

    三、Docker常用命令

    3.1、帮助启动类命令

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

    3.2、镜像命令

    命令代码
    列出本地主机上的镜像docker images
    查找xxx镜像名字docker search xxx
    拉取XXX镜像名字docker pull xxx
    查看镜像/容器/数据卷所占的空间docker system df
    删除某个镜像名字IDdocker rmi ID
    删除所有docker rmi -f $(docker images -qa)

    docker虚悬镜像是什么?
    仓库名、标签都是的镜像,俗称虚悬镜像dangling image
    在这里插入图片描述

    3.3、容器命令

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

    命令代码指令
    docker run [OPTIONS] IMAGE [COMMAND] [ARG…]新建+启动容器
    - -name=“容器新名字”为容器指定一个名称;
    -d: 后台运行容器并返回容器ID即启动守护式容器(后台运行);
    -i:以交互模式运行容器通常与 -t 同时使用;
    -t:为容器重新分配一个伪输入终端通常与 -i 同时使用;
    -P:随机端口映射,大写P
    -p:指定端口映射,小写p
    docker ps [OPTIONS]·列出当前所有正在运行的容器
    -a列出当前所有正在运行的容器+历史上运行过的
    -l显示最近创建的容器。
    -n显示最近n个创建的容器。
    -q静默模式,只显示容器编号。
    exitrun进去容器,exit退出,容器停止
    ctrl+p+qrun进去容器,ctrl+p+q退出,容器不停止
    docker start 容器ID或者容器名启动已停止运行的容器
    docker restart 容器ID或者容器名重启容器
    docker stop 容器ID或者容器名停止容器
    docker kill 容器ID或容器名强制停止容器
    docker rm 容器ID删除已停止的容器

    在这里插入图片描述

    3.4、其他命令

    命令代码
    docker logs 容器ID查看容器日志
    docker top 容器ID查看容器内运行的进程
    docker inspect 容器ID查看容器内部细节
    docker exec -it 容器ID bashShell进入正在运行的容器并以命令行交互
    docker cp 容器ID:容器内路径 目的主机路径从容器内拷贝文件到主机上
    docker export 容器ID > 文件名.tar导出容器
    cat 文件名.tardocker import - 镜像用户/镜像名:镜像版本号

    四、Docker 镜像

    4.1、镜像

    是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件

    4.2、UnionFS(联合文件系统)

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

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

    4.3、Docker镜像加载原理

    docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
    bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。

    Docker镜像层都是只读的,容器层是可写的

    4.4、Docker commit

    Docker commit将容器生成镜像
    docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

    4.4.1、镜像推送到阿里云

    阿里云的仓库官网地址
    docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
    docker tag b89fcafd573a registry.cn-hangzhou.aliyuncs.com/mrnacl/nacl:1.0
    docker pull registry.cn-hangzhou.aliyuncs.com/mrnacl/nacl:1.0

    4.4.2、阿里云拉取镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/mrnacl/nacl:1.0

    4.4.3、镜像推送到私有云

    Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

    Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

    安装教程

    五、Docker 容器卷

    Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
    解决办法:在挂载目录后多加一个--privileged=true参数即可
    使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

    卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

    5.1、挂载容器卷

    docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
    eg:
    docker run -it --privileged=true -v /www/wwwroot/dockerData:/tmp/docker_data --name=u1 ubuntu

    5.2、读写规则映射添加说明

    5.2.1、读写(默认)

    docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

    5.2.2、只读

    docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    ro = read only

    5.3、卷的继承和共享

    docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
    eg:
    docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

  • 相关阅读:
    ONLYOFFICE 8.1版本桌面编辑器测评
    2023复旦大学计算机科学技术(网络空间安全)保研记录
    Taurus.MVC 微服务框架 入门开发教程:项目集成:7、微服务间的调用方式(调整):引用程序集及代码下载(新增)
    数字经济时代 企业的数据安全需要多维考虑
    自动泊车的路径动态规划问题研究附Matlab代码
    stm32——hal库学习笔记(IIC)
    leetcode-518. 零钱兑换 II
    Leetcode 198. 打家劫舍 动态规划
    Gloss优化
    逻辑回归-为什么模型会更加侧重于学习那些数值比较大的列
  • 原文地址:https://blog.csdn.net/lushixuan12345/article/details/127687325