Docker学习(自用)

1.Docker简介

1.1 什么是Docker

假定您在开发一个尚硅谷的谷粒商城,您使用的是一 台笔记本电脑而且您的开发环境具有特定的配置。其 他开发人员身处的环境配置也各有不同。您正在开发 的应用依赖于您当前的配置且还要依赖于某些配置文 件。此外,您的企业还拥有标准化的测试和生产环 境,且具有自身的配置和一系列支持文件。您希望尽 可能多在本地模拟这些环境而不产生重新创建服务器 环境的开销。请问? 您要如何确保应用能够在这些环境中运行和通过质量 检测?并且在部署过程中不出现令人头疼的版本、配 置问题,也无需重新编写代码和进行故障修复? 答案就是使用容器。Docker 之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。

1.2 Docker 解决的问题

before:

1. 传统方式部署项目,在开发这边可以跑起来,但是测试那边报各种各样的问题(可能吵架)

2. 如果是服务器集群,需要redis配置3主3从,mysql配置4主4从,并需要弹性的扩容和缩容,这对运维来说很麻烦,会疯掉

after:

软件可以带环境安装,也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题

1.3 容器与虚拟机比较

1.3.1 容器发展简史

 

        • 传统虚拟机技术

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

它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。  

Win10VMWareCentos7各种cpu、内存网络额配置+各种软件虚拟机实例

 

虚拟机的缺点:

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

 

        • 容器虚拟化技术

由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:

Linux容器(Linux Containers,缩写为 LXC)

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

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

 

        • 对比

比较了 Docker 和传统虚拟化方式的不同之处:

*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;

*容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

2. Docker的基本组成

2.1 镜像(image)

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器

它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。

相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于javanew出来的实例对象。

2.2 容器(container)

1 从面向对象角度

Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

2 从镜像容器角度

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

        • 仓库(repository)

2.3 仓库(Repository)

仓库是集中存放镜像文件的场所。

类似于

Maven仓库,存放各种jar包的地方;

github仓库,存放各种git项目的地方;

Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub(https://hub.docker.com/)

存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

2.4 小总结

需要正确的理解仓库/镜像/容器这几个概念:

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

image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

镜像文件

*  image 文件生成的容器实例,本身也是一个文件,称为镜像文件。

容器实例

*  一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器

仓库

* 就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。

3. Docker常用命令

强烈推荐:docker 常用命令大全_docker常用命令_保护我方胖虎的博客-CSDN博客

小总结

  • 常用命令

attach    # 当前 shell 下 attach 连接指定运行镜像

commit    # 提交当前容器为新的镜像

cp   #从容器中拷贝指定文件或者目录到宿主机中

create  # 创建一个新的容器,同 run,但不启动容器

exec   # 在已存在的容器上运行命令

export   # 导出容器的内容流作为一个 tar 归档文件[对应 import ]

history # 展示一个镜像形成历史

images  # 列出系统当前镜像

import  # 从tar包中的内容创建一个新的文件系统映像[对应export]

info  # 显示系统相关信息

inspect  # 查看容器详细信息

kill      # kill 指定 docker 容器

logs      Fetch the logs of a container                 # 输出当前容器日志信息

pause     Pause all processes within a container        # 暂停容器

ps        List containers                               # 列出容器列表

pull      # 从docker镜像源服务器拉取指定镜像或者库镜像

push   # 推送指定镜像或者库镜像至docker源服务器

restart   Restart a running container                   # 重启运行的容器

rm        Remove one or more containers                 # 移除一个或者多个容器

rmi       Remove one or more images       # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]

run       Run a command in a new container              # 创建一个新的容器并运行一个命令

search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像

start     Start a stopped containers                    # 启动容器

stop      Stop a running containers                     # 停止容器

tag       Tag an image into a repository                # 给源中镜像打标签

version   Show the docker version information           # 查看 docker 版本号

wait      Block until a container stops, then print its exit code   # 截取容器停止时的退出状态值

4. 镜像分层概念

4.1 镜像分层概念

     在我们运行命令docker pull XXX的时候,我们可以很明显的发现镜像在下载的时候是一层层的下载的。其实这是因为镜像是分层的!

​ Docker镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

4.2、分层的原因:UnionFS(联合文件系统)

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

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

 

4.3、Docker镜像加载原理


​ docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

boofs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的LinuxUnix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

​ rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, letc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

​ Docker镜像层都是只读的,镜像层都是可写的。

 

5. Docker Commit、

由于docker下载的镜像是最小的,内容只有基础的执行命令,有时我们需要的命令可能它并不包含,所有我们可以自己修改docker下载的镜像运行容器,并且上传到本地镜像。

​ 类似与JAVA继承于一个Base基础类,自己按需扩展。

 

6. 容器数据卷

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

​ 数据都储存在容器中,如果我们将容器删除,那么数据就会丢失。容器中有一个数据共享的技术!将我们容器内的目录挂载到Linux上!

-v :添加自定性的容器卷

①:宿主机的路径

②:容器内的路径

③:放开权限(

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为

在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即

使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

​ 实现了宿主机的文件和容器内文件的共享互联。

特点

  1. 数据卷可在容器之间共享或重用数据、
  2. 卷中的更改可以直接实时生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续倒没有容器使用它为止

强烈推荐:Docker——容器数据卷_docker卷是什么_宋子浩的博客-CSDN博客

 7.docker导入导出问题

7.1 图文解析 

7.2 两种方案的差别

特别注意:两种方法不可混用。
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。
1,文件大小不同

export 导出的镜像文件体积小于 save 保存的镜像

 2,是否可以对镜像重命名

docker import 可以为镜像指定新名称
docker load 不能对载入的镜像重命名

3,是否可以同时将多个镜像打包到一个文件中

docker export 不支持
docker save 支持

4,是否包含镜像历史

export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

5,应用场景不同

docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

serenity宁静

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值