docker基础知识


一、前言

1、为什么突然想起了解docker
在用Ubuntu-vulhub环境做复现实验的时候,老用到docker-compose启动,新做的一个复现是用docker run启动使用。
2、前提知识
Linux基本命令
Maven/Git相关的知识

二、docker简介

1、基本概念

概念:docker解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
通过命令进入了容器中,我们发现这是一个完整的操作系统,有 root 目录,有 bin,有 sbin,有 proc。运行一切 对应操作系统的命令也都是正常的。好像我们就是在一个虚拟机一样。好像跟宿主机没有半毛钱关系 (我这里的实验宿主机是 ubantu)。 但这是个假象,我们在容器里运行的任何命令其实就是在宿主机上运行的,是 docker 耍了一些手段让我们以为是在一个跟宿主机不相关的完整的操作系统上,但其实我们在容器里运行的任何命令在本质上就是在宿主机上运行的。这就是容器和虚拟机最大的区别。 虚拟机是个完整的操作系统,与宿主机完全隔离,在虚拟机上运行的任何东西都不会影响宿主机。 而容器不是, 容器就是个骗局,它让你以为你是运行在一个完整的操作系统上,其实你们都是在宿主机上玩而已。 所以我们之前一定听过类似这样的话:容器是节省资源的,是共享宿主机内核的,容器上运行的东西是有可能把宿主机搞挂的
Docker是基于Go语言实现的云开源项目
Docker的主要目标是”build、ship and run any app、anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的app及其运行环境能够做到’’一次封装,到处运行”。
在这里插入图片描述
虚拟机缺点:资源占用多、冗余步骤多、启动慢

2、Docker三要素:仓库、镜像、容器

镜像:就是只读模板,可以创建docker容器,一个镜像可以创建多个容器
容器:镜像的一个实例
Docker是利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例。
可以把容器看作是一个简易版的Linux环境(包括root用户权限,进程、用户、网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库:集中存放镜像文件的场所
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等
总结
Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎image镜像文件。只有通过这个镜像文件才能生成Docker容器。image文件可以看作是容器的模板。Docker 根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
image文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
在这里插入图片描述

3、docker的框架图

在这里插入图片描述

4、下载(建议去阿里云或网易云下载)

在这里插入图片描述

三、docker安装

1、环境前提说明

Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
Docker-CE版本分为静态链接与动态链接两种:
静态链接版本不依赖操作系统库,所以包较大。 (windows 和mac目前只提供静态链接版)
动态链接版本可以执行程序小一些,与操作系统库相关,只能在某种操作系统的具体发行版下安装。 centos,debian,fedora,raspbian,ubuntu五类发版。
Windows (企业一般不用)
CentOS 6.5(64-bit)或更高版本 (CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上)
Ubuntu也较为推荐

2、安装步骤

2.1、CentOS 6.8

yum install -y epel-release
yum install -y docker-io
安装后的配置文件:/etc/sysconfig/docker
在这里插入图片描述
用以下命令查看,如下所示说明配置成功
在这里插入图片描述
启动Docker后台服务:service docker start
Docker version验证
注:Docker使用EPEL发布,RHEL系的OS首先要确保已经持有EPEL仓库,否则先检查OS的版本,然后安装相应的EPEL包

2.1、CentOS 7.0++

在这里插入图片描述

3、底层原理

3.1、Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们前面说到的集装箱。

3.2、Docker比VM 快的原因

不需要Hypervisor实现硬件资源虚拟化;docker利用的是宿主机的内核,不需要Guest OS(虚拟机里面的系统)

四、docker常用命令

1、帮助命令 3

docker version 验证
docker info 自身容器详解
docker --help 类似Linux的man

2、镜像命令 4

docker images 列出本地主机上的镜像
    -a 列出本地所有镜像(含中间映像层)
    -q 只显示镜像id
    --digests 显示镜像的摘要信息
    --no-trunc 显示完整的镜像信息
docker search 某个镜像名 (自动从https://hub.docker.com网站查看)
    --no-trunc 显示完整的镜像描述
    -s 列出收藏数不小于指定值的镜像
    --automated 只列出automated build类型的镜像
docker pull 某个镜像名 下载镜像
    等价于docker pull 某个镜像名:latest
docker rmi 某个镜像名/id
    等价于docker rmi 某个镜像名
    -f 强制删除
    -f 镜像名1 镜像名2 强制删除多个镜像
    -f $(docker images -qa) 强制全部删除

3、容器命令 8 (有镜像才能创建容器,这是根本前提)

新建并启动容器 (启动交互式容器)

docker run [option] IMAGE [COMMAND] [ARG…]
   -name="容器新名字”   为容器指定一个名称;
   -d 后台运行容器,并返回容器ID,也即启动守护式容器;
   -i 以交互模式(会返回一个容器id)运行容器,通常与-t同时使用;
   -t 为容器重新分配一个伪输入终端,通常与-i同时使用;
   -P 随机端口映射;
   -p 指定端口映射,有以下四种格式
      ip:hostPort:containerPort
      ip::containerPort 
      hostPort:containerPort 
      containerPort

在这里插入图片描述
Run的运行过程步骤
在这里插入图片描述
列出当前所有正在运行的容器

docker ps
   -a   列出当前所有正在运行的容器+历史上运行过的
   -1   显示最近创建的容器。
   -n   显示最近n个创建的容器。
   -q   静默模式,只显示容器编号。
   --no-trunc   不截断输出。

退出容器

   exit  容器停止退出
   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

4、常用容器内命令 6

启动守护式容器

Docker run -d 容器名
	  问题:用docker ps -a 查看,会发现容器自动退出(docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是一直挂起的命令【top、tail等】,就会自动退出)
	  解决:docker run -d centos /bin/sh -c “while ture; do echo hello zzyy; sleep 2; done”

查看容器日志

Docker logs -f -t --tail 容器id
	-t 加入时间戳
	-f 跟随最新的日志打印
	-tail 数字 显示最后多少条

查看容器内运行的进程

   docker top 容器ID

查看容器内部细节

   docker inspect 容器ID

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

在容器中打开新的终端,并且可以启动新的进程
	docker exec -it 容器id
	docker exec -it 容器id bashShell (不用进入容器可以直接得到结果)
直接进入容器启动命令的终端,并且可以启动新的进程
	docker attach 容器id

从容器内拷贝文件到主机上

   docker ps 容器id

在这里插入图片描述

五、docker镜像

1、基本概念

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

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

Docker镜像加载原理
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会有差别,因此不同的发行版可以公用

为什么docker镜像要采用这种分层结构?
最大的一个好处就是:共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

2、docker的特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜橡层”。

3、commit操作补充

docker commit 提交容器副本使之成为一个新的镜像
docker commit 镜像id 新镜像的名字
在这里插入图片描述docker commit -m=”提交的描述信息” -a=”作者” 容器id要创建的目标镜像名:[标签名]

六、Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

平时练习可用链接:
https://labs.play-with-docker.com/

参考资料:
[1]: https://www.bilibili.com/video/BV1Vs411E7AR?from=search&seid=6613395589045198291
[2]: https://www.runoob.com/docker/docker-compose.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值