docker

1、理念

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

2、docker和传统虚拟机的不同

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

3、DevOps 开发/运维(开发自运维,一次开发,随处运行)

好处:

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

4、三要素

  • 镜像: docker镜像就是一个只读模板。镜像可以用来创建docker容器,一个镜像可以创建很多容器。
  • 容器:docker运用容器Container独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一对层的统一视角,唯一的区别在于容器的最上面那一层是可读可写的。
  • 仓库Repository:是集中存放镜像文件的场所。

5、Docker底层原理

  • docker是一个Client-Server结构的系统,docker守护进程运行在主机上,然后通过Socket链接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器是一个运行时环境。
  • docker 为什么比vm快?
    1. docker 有着比vm更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此CPU、内存利用率上docker效率会更高。
    2. docker利用的是宿主机的内核,而不需要Guest OS。因此当新建一个容器时,docker不需要像vm一样重新加载一个操作系统内核。
      | 指标* | DOCKER容器 | 虚拟机VM |
      | — | — | — |
      | 操作系统 | 与宿主机共享OS | 宿主机OS上运行虚拟机OS |
      | 存储大小 | 镜像小,便于存储运输|镜像大 |
      | 运行性能 | 几乎无额外性能损耗|操作形同额外的CPU、内存损耗 |
      | 移植性 | 轻便、灵活、适应于Linux | 笨重,与虚拟技术耦合度高 |
      | 硬件亲和性 | 面向软件开发者 | 面向硬件运维 |
      | 部署速度 | 快速、秒级 | 较慢,10S以上 |

6、Docker帮助命令

  • docker vision
  • docker info
  • docker --help

7、镜像命令

  • docker images *列出主机上的镜像
  • docker search 镜像名称 *在dockerhub上查找镜像
  • docker pull 镜像名称 *下载镜像,等价于docker pull 镜像名称:latest
  • docker rmi 镜像名称 *删除镜像

8、容器命令

  • docker run *新建并启动容器
    • –name=“容器新名字”:为容器指定一个名称
    • -d:后台运行容器,并返回容器ID,也即启动守护式容器;
    • -i:已交互模式运行容器,通常与-t同时使用
    • -t:为容器重新分配一个伪输入终端,通常与-i同时使用
    • -P:随机端口映射
    • -p:指定端口映射,有一下四种方式 ip:hostPort:containerport/ip::containerport/hostPort:containerport/containerport
  • docker ps *列出当前所有正在运行的容器
  • 退出容器
    • exit *容器停止退出
    • ctrl+P+Q *容器不停止退出
  • 启动容器
    • docker start 容器ID
  • 重启容器
    • docker restart 容器ID
  • 停止容器
    • docker stop 容器ID
  • 强制停止容器
    • docker kill 容器ID
  • 删除已停止的容器
    • docker rm 容器ID
  • docker logs -f -t --tail 容器ID *查看容器日志
  • docker top 容器ID *查看容器内运行的进程
  • docker inspect 容器ID *查看容器内部的细节
  • *进入正在运行的容器并以命令行交互
    • docker attach 容器ID *直接进入容器启动命令终端,不会启动新的进程
    • docker exce -it 容器ID *在容器中打开新的终端,并且可以启动新的进程
  • docker cp 容器ID:容器内路径 目的主机路径 *从容器中拷贝文件

9、镜像原理

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

  • UnionFS 联合文件系统:Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。union文件系统是docker镜像的基础。镜像可以通过封层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
    • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有的底层的文件和目录。
  • Docker 镜像的加载原理:docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
  • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们经典的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时的内存的使用权已有bootfs转交给内核,此时系统也会卸载bootfs.
  • 镜像特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称之为容器层,容器层之下都被称之为镜像层。
  • docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名] *提交容器副本使之成为一个新的镜像

10.docker容器数据卷

  • 作用:容器的持久化、容器间继承和数据共享。
  • docker run -it -v /myDataVolume:/dataVolumeContainer 镜像名 * /myDataVolume 是宿主机目录, /dataVolumeContainer 是容器内的目录,两个目录内的数据双向绑定。
    • 给目录设定访问权限,例如:
      • docker run -it -v /myDataVolume:/dataVolumeContainer:ro 镜像名 *容器内的目录只有只读权限
    • 也可以通过dockerfile来实现,例如:
    FROM centos
    VOLUME ["/dataVolumeContaimer1", "/dataVolumeContaimer2"]
    CMD echo "finished , ....succ"
    CMD /bin/bash
  • –volume-from 容器间通讯
    • docker run -it --name dc02 --volume-from dc01 zzyy/centos *有继承关系的容器间,数据卷均会双向绑定

11、dockerfile

11.1、what

dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。构建docker镜像三步骤:编写dockerfile文件-》build-》run

  • 每条保留字指令都必须为大写字母,且后面至少跟随一个参数
  • 指令按照从上到下顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

11.2、docker执行dockerfile的流程

  1. docker从基础镜像运行一个容器;
  2. 执行一条指令并对容器进行修改;
  3. 执行类似docker commit的操作提交一个新的镜像层;
  4. docker在基于刚提交的镜像运行一个新的容器;
  5. 执行dockerfile中的下一条指令直到所有指令执行完。

11.3、保留字指令

  • FROM: 基础镜像,当前新镜像是基于哪个镜像的。Base镜像scratch,dockerhub中大多数镜像都是通过base镜像中安装和配置主要的软件构建出来的
  • MAINTAINER: 作者以及作者邮箱
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露的端口
  • WORKDIR: 指定在创建容器后,终端默认登录进来的工作目录
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD: 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY: 类似ADD,拷贝目录和文件到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目的路径>位置
  • VOLUME: 容器数据卷,用于数据保存持久化工作
  • CMD: 指定一个容器运行时要运行的命令; Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD 会被docker run之后的参数替换
  • EMTRYPOINT:指定一个容器运行时要运行的命令;
  • ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值