精华内容
下载资源
问答
  • | 程序师 - 程序员、编程语言、软件开发、编程技术原文出处:程序师Docker是啥?打开翻译君输入Docker 结果显示码头工人,没错!码头工人搬运的是集装箱,那么今天要讲的Docker其操作的也是集装箱,这个集装箱就...

    0b2bb02f620f03741ab800a3cf476168.png

    原文作者:唐文广

    原文链接:想理解、会用Docker,这篇文章就够了! | 程序师 - 程序员、编程语言、软件开发、编程技术

    原文出处:程序师

    Docker是啥?
    打开翻译君输入Docker 结果显示码头工人,没错!码头工人搬运的是集装箱,那么今天要讲的Docker其操作的也是集装箱,这个集装箱就静态而言就是一个应用镜像文件,就动态而言,就是一个容器。蒙了吧?好吧,上图解释。

    2ed82f3d5fbe3bad7a7ea52a297f91d1.png
    Docker从狭义上来讲就是一个进程,从广义上来讲是一个虚拟容器,其实更专业的叫法是应用容器( Application Container ),Docker进程和普通的进程没有任何区别,它就是一个普通的应用进程。不过是用来操作镜像文件的。所以Docker进程+构建的应用镜像文件就等于Docker容器。本文所有讲的Docker都是指Docker容器哦。
    再继续下文之前我们首先要明确几个docker重要的基本概念吧,镜像,容器,仓库。镜像Docker images,就类似于VM虚拟机里面的快照,但是可比快照轻量化多了。快照不懂?那可以把images直接理解成一个文件夹。我们可以通过ID或者易识别的名字+tag来确认唯一的目标镜像。ImagesID是一个64位的字符,但是一般我们都是使用前面12位就足够区别了。
    如图中左边红框中redis: lates和右边的红框中5f515359c7f8都唯一表示为同一个镜像。所以我们一般的镜像可以命名为类似centos:latest、centos:centos7.1.1503等等。
    镜像是分层的,有基础镜像,仅仅包含操作系统,比如centos镜像;有中间件镜像,比如redis等数据库镜像;最后是应用镜像,就是指具体的应用服务了,应用镜像可以非常丰富,随时可以发布,这三者之间依次叠加。
    所以当我们在使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新镜像层。如下图,基础镜像就是centos镜像,中间件镜像就是两个红色圈,应用镜像就是紫色圈。其中redis+centos这样叠加组合的中间件镜像就可以供A服务或者B服务使用,这样叠加组合更加灵活。仍和一种镜像都可以从Docker hub公共仓库中拉取。

    2d1d949ec9b7d822796b63f896a3acff.png
    容器Docker containers,你可以从镜像中创建容器,这如同从快照中创建虚拟机,不过更轻量,启动更快,秒启。应用是在容器中运行的,打个比方,你首先下载了一个Ubuntu的镜像,然后又安装mysql和Django应用及其依赖,来完成对它Ubutun镜像的修改,一个个人觉得非常完美应用镜像生成了!就把这个镜像分享给大家使用,大家通过这个镜像就生成一个容器。容器启动之后就会运行Django服务了。

    1c114adb64a16aba27c540da6e3179f4.png
    上面也说到了,容器就是一个个独立的封闭的集装箱,但是也需要对外提供服务的,所以Docker允许公开容器的特定端口,在启动Docker的时候,我们就可以将容器的特定端口映射到宿主机上面的任意一个端口,所以,如果几个服务都需要80端口,那么容器的对外端口是80,但是映射到宿主机上面就是任意端口,就不会产生冲突,所以就不需要通过代理来解决冲突。容器对外端口与宿主机的端口映射可以通过下面的命令来完成。 启动docker容器 docker run -d -p 2222:22 --name 容器名 镜像名 -d 守护容器,就 是后台运行,退出命令窗口容器也不会停止 -it 交互式容器 退出命令窗口容器就停止运行了 -p宿主机端口和容器端口映射 8081:80 宿主机端口:容器公开的端口

    571412123850ae1c187e56e93c3ea17e.png
    仓库Docker registeries,docker仓库和存放集装箱的仓库是一样的,不过docker使用来存放镜像的。仓库存在公有和私有之分,公有仓库docker hub提供了非常多的镜像文件,这些镜像直接拉取下来就可以运行了,你也可以上传自己的镜像到docker hub上面。同时也可以自己搭建私有仓库用于团队项目管理。
    结合前面介绍的基本概念,我们可以将docker的几个概念使用大致串起来,他们之间是如何运作的,也就是Docker的生命周期。
    看下图,主要是三步走。

    657f41192aa6418234919404f08cd3e0.png
    1、 开发构建镜像并将镜像push到Docker仓库
    2、 测试或者运维从Docker仓库拷贝一份镜像到本地
    3、 通过镜像文件开启Docker容器并提供服务为啥要用Docker?能干些啥?
    为啥要用Docker?这要从目前软件行业的痛点来讲起 1、软件更新发布及部署低效,过程繁琐且需要人工介入,2、环境一致性难以保证,3、不同环境之间迁移成本太高。有了Docker可以很大程度解决上面的问题。
    首先,Docker的使用简单至极,从开发的角度来看就是三步走:构建,运输,运行。其中关键步骤就是构建环节,即打包镜像文件。但是从测试和运维的角度来看,那就只有两步:复制,运行。有了这个镜像,那么想复制到哪运行都可以,完全和平台无关了。同时Docker这种容器技术隔离出了独立的运行空间,不会和其他应用争用系统资源了以及还不需要考虑应用之间相互影响,想想就开心。
    其次,因为在构建镜像的时候就处理完了服务程序对于系统的所有依赖,所以在你使用的时候,你可以忽略掉原本程序的依赖以及开发语言。对测试和运维而言,更多专注于自己的业务内容上。
    最后,Docker于开发者而言提供了一种开发环境的管理办法,与测试人员而言保证了环境的同步,于运维人员提供了可移植的标准化部署流程。
    所以, Docker 能干啥,总结如下:构建容易分发简单隔离应用解除依赖快速部署测完就销
    Docker是个进程级的轻量化虚拟机,和传统虚拟机有啥区别呢?
    Docker这个虚拟机超级轻量级,仅仅是一个进程而已。与传统的虚拟机比如VM有着巨大的差别
    区别看下图:

    d367062cda6d759aae62cb308ad0c27c.png
    我们来看一下二者的区别,因为 VM 的 Hypervisor 需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,其中虚拟机操作系统占用内存是比较大的,一个操作系统有好几个G,自然在启动速度和资源利用率以及性能上有非常大的开销,如果在本地,或者个人电脑,那么影响还不是那么大,但是在云端就是一个非常大的资源浪费。
    咱们很多时候做事情的时候不会考虑与事情本身无关的问题,比如造飞机的不会考虑飞机是否要潜水,对于我们目前很多移动互联网的应用来说,很少会涉及到对操作系统的部分,其实我们主要关心的是应用的本身,而VM虚拟机的上层是运行的运行时库和应用,整个虚拟机的空间是非常的庞大,但是容器化技术Docker技术的出现后,省去了操作系统这一层,多个容器之间相互隔离且共用了宿主操作系统和运行时库。
    所以Docker 应用容器相对于 VM 有以下几个优点启动速度快,容器启动本质就是一个开启一个进程而已,因此都是秒启,而 VM 通常要更久。资源利用率高,一台普通 PC 可以跑成百上千个容器,你跑十个 VM 试试。性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源。
    所以很多移动互联网的应用或者云计算的后端节点都可以用docker来替换物理机器或者虚拟机。比如腾讯地图的很多后台服务基本上都迁移docker部署了。Docker是个啥架构?底层又是用的啥技术?
    前面说了那么多,始终还是雾里看花。下面就详细介绍一下技术架构,底层又是用的啥技术来实现上述那么多优点的?
    Docker技术架构图:

    2d01382525dc339df4c3b0eb61fff9d5.png
    从Docker依赖的底层技术来看,Docker原生态是不能直接在Windows平台上运行的,只支持linux系统,原因是Docker依赖linux kernel三项最基本的技术,namespaces充当隔离的第一级,是对Docker容器进行隔离,让容器拥有独立的hostname,ip,pid,同时确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程;Cgroups是容器对使用的宿主机资源进行核算并限制的关键功能。
    比如CPU,内存,磁盘等,union FS主要是对镜像也就是image这一块作支持,采用copy-on-write技术,让大家可以共用某一层,对于某些差异层的话就可以在差异的内存存储,Libcontainer是一个库,是对上面这三项技术做一个封装。
    Docker engine 用来控制容器container的运行,以及镜像文件的拉取。Docker安装
    通过脚本的方式安装docker,非常简单。
    1、 获取最新的docker安装包
    nicktang@nicktang-virtual-machine:~$ wget -qO- https://get.docker.com/ | sh

    87515454231a05e69ead9f8fb61ea4fb.png
    输入当前用户的密码后,就会下载脚本并且安装Docker及依赖包。

    90aa50a957ef451a56352a8d21cc5a51.png

    52131843019b5f53f346cf3f34f0cbfe.png
    显示上图内容就表明安装完成。
    2、 启动docker 后台服务
    root@nicktang-virtual-machine:/data # sudo service docker start #启动守护进程
    root@nicktang-virtual-machine:/data # docker -v

    1283e2583f49208d347f7b67136c6efd.png
    能够看见版本号,说明docker的安装成功。简单吧!至此就差一个镜像了。自己制作还是从公共仓库拉取就随你啦。
    root@nicktang-virtual-machine:/data # sudo service docker stop #关闭守护进程Docker使用
    Docker的使用,我们主要从【增删查】几方面来说说怎么使用docker,为什么没有【改】呢,因为在我看来docker容器一旦出现问题了,根本没有修复的必要,直接把容器停止并删除,再启动,这样来得快。所以我们只需要掌握几个基本命令即可,具体如下。
    【查】查看本地已有的镜像 Docker images

    2130e48dfc60370d6a505d53ef4555ae.png
    【增】运行一个镜像,即启动一个容器 docker run 镜像名 ,比如我们运行docker run centos
    键入这个命令的时候完成了三样操作
    1、 检查本地是否有hello-world这个镜像,有->就跳过第二步 没有->依次执行
    2、 就自动去docker hub下载这个镜像
    3、 就把镜像加载到容器并且运行

    0fddd91ab5618e4a644fc4380878310a.png
    再用docker images查看的时候本地就增加了centos镜像。

    7f814bdab01dc043fc538f85f1b8d6a3.png
    Tag为latest就表示是最新版本的centos系统镜像。因为会从docker hub拉取没有的镜像,所以算【增】里面。
    【增】拉取指定的镜像文件 docker pull 镜像名:TAG
    上面那种通过直接运行的方式拉取的是docker hub中最新的镜像,但是有时候我想拉取指定的镜像文件就需要使用docker pull命令来拉取。因为从官方拉取镜像文件,通常是比较慢的,所以我们可以通过加速器技术来从国内的镜像仓库拉取。
    【查】查看所有的容器docker ps -a 可以用来查看所有的容器,包括运行中的和已经停止的。

    e427f9678d3b3f89b7693c4701e909ed.png
    第一个字段就是已经启动的容器ID,第二个字段就是这个容器是根据哪个镜像生成的。但是上面这个命令只是临时启动一下容器,上面图中的status 是exited(0),表示容器是退出状态。如果想容器在后台运行,所以我们需要启动守护式容器才可以,只要在启动命令中添加一个 -d参数,即docker run -d centos就可以了。
    【查】查看镜像/容器的具体信息 docker inspect镜像ID(镜像名)/容器ID(容器名) docker inspect centos
    这个命令是返回一个镜像或者容器详细信息的json串。其中包括ID,ip,版本,容器的主程序等非常多的信息,根据这些信息我们可以进行二次开发。在这个命令的基础之上增加一个-f参数我们可以指定获取自己需要的信息,比如获取redis容器的IP地址,内存信息,CPU使用情况。docker inspect -f ‘{{.NetworkSettings.IPAddress}}’ [ID /Name]

    8dd70e405d34c1432afa7a909de9a5e0.png
    【查】进入容器 docker run -it centos 即启动一个交互式容器
    -it 完成容器终端和当前终端进行关联,即当前终端的显示就会切换到容器终端的显示。

    557ba8d090280ebbe6a1c8a903ce4a4b.png
    查看容器目录结构,发现和物理机器的目录结构完全一致,这就是为什么有的人称docker容器也称之为虚拟机的原因。
    Exit可以退出容器终端。

    881ef22dd950e00a99743b3492ea13c6.png
    【删】删除容器,docker rm 容器ID,删除多个容器就可以多个容器ID之间用空格隔开即可。

    9c43dbcc1f74e70f35f31fe39f08e9b1.png
    怎么用Docker完成持续集成、自动交付、自动部署?
    这年头见面不聊点自动化什么的,持续什么的,都不好意思。所以,咱们也要了解一下持续集成,自动交付,自动部署。但是上面说了这么多,没发现Docker有那三样功能啊,是的,Docker是没有这个功能,但是你在完成上述三样自动化的步骤都是依赖Docker的。Docker是这些流程实现的基础,就如同软件开发,软件代码才是根本,开发工具是辅助。所有搭建一个完整的自动化流程还需要github+jenkins+ registry三样帮助。
    持续集成和自动部署的原理如下图所示:

    e5dddce3e356712e59ef332917c1231e.png
    1. RD推送代码到git 仓库或者svn等代码服务器上面,git服务器就会通过hook通知jenkins。
    2. jenkine 克隆git代码到本地,并通过dockerFile文件进行编译 。
    3. 打包生成一个新版本的镜像并推送到仓库 ,删除当前容器 ,通过新版本镜像重新运行。
    而在整个过程中 RD只需要敲入三个命令Git add * ;Git commit –m “”;Git push即可完成持续集成、自动交付、自动部署。后面通过案例实际演示这个过程的神奇!
    Docker还可以很方便的自动扩容哦,一般的自动扩容的两种方式,一种就是docker容量扩大,另一种就是docker节点数扩充。第一种就修改配置文件即可,第二种通过简单的拷贝,运行就完成了节点的扩容。总结
    虽然Docker具有超轻量化,但是不建议一台机器上面部署太多的应用,同时部署的时候一定要差异化部署,什么意思呢?就是将大量计算的,和内存需要大的,IO操作频繁的对系统资源需求不一致的部署到同一台宿主机上。
    展开全文
  • docker是啥?是干什么的? what? 定义 我们知道,软件依赖的环境大致包括: • 配置文件 • 代码 • tomcat • JDK • 操作系统 Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境...

    docker是啥?是干什么的?
    what?
    定义
    我们知道,软件依赖的环境大致包括:

    • 配置文件
    • 代码
    • tomcat
    • JDK
    • 操作系统

    Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中。
    在这里插入图片描述

    思想:
    集装箱
    标准化
    隔离
    核心
    docker有3大核心:镜像、容器、仓库。

    鲸鱼是操作系统。
    要交付的应用程序是各种货物,要将各种形状和尺寸不同的货物放到大鲸鱼上,得考虑每件货物怎么安放(应用程序配套的环境),还得考虑货物和货物之间能否重叠起来(应用程序依赖的环境是否会冲突)。
    现在使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省力。
    即:打包放到鲸鱼上,鲸鱼放到服务器上。也就是“build——ship——run”,这样在自己的电脑上怎么运行,在服务器上也会怎么运行。
    用docker运行一个程序的过程:
    去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。

    (1) 镜像-复制的程序
    定义:
    Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

    作用
    类似于虚拟机的快照,用来创建新的容器。

    特点:
    镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    (2)容器-集装箱
    运行程序的地方
    镜像是静态的,每一层都只是可读的,而容器是动态的,里面运行着我们指定的应用。
    (3)仓库-存放镜像的地方
    存放镜像的地方,和git类似
    why?
    在知乎上看到一个很好的解释:
    在这里插入图片描述
    简单来说就是,不同的应用程序所依赖的环境不一样,如果把他们依赖的软件都安装在一个服务器上,不仅需要调试很久,而且可能会有冲突。
    如果想把两个应用程序隔离起来,可以在服务器上创建不同的虚拟机,不同的虚拟机放不同的应用,但是虚拟机的开销比较高。docker作为轻量级的虚拟机,是一个很好的工具。
    在这里插入图片描述

    作用?
    解决运行环境不一致所导致的问题。这样就不会产生“本地运行没问题,可一到服务器上就不行了”的情况。
    限定最大的cpu使用内存硬盘,这样就起到了隔离的作用,避免产生“一块代码产生死循环,把磁盘占满了,其它程序也挂了”的情况。
    双11时扩展机器用。
    在这里插入图片描述
    总结成一句话:docker的标准化让快速扩展,弹性伸缩变得简单

    使用之前和之后
    之前,可以发现,每发布一个程序,都要走一遍以下的流程:
    在这里插入图片描述
    之后:
    在这里插入图片描述

    展开全文
  • 我只是把之前的学习笔记整理一下,贴到这里,可能会显得比较凌乱。。。1.1啥是Docker?Docker 一个开源项目,它被用来做构建、打包和运行程序。它一个命令行...
        

    我只是把之前的学习笔记整理一下,贴到这里,可能会显得比较凌乱。

    1.1 啥是Docker?

     

    Docker 是一个开源项目,它被用来做构建、打包和运行程序。它是一个命令行程序,一个后台进程,也是一组使用逻辑方法来解决常见软件问题的远程服务,让你可以简化安装、运行、发布、删除软件的体验。它是通过一种叫做容器的操作系统技术来实现这些功能的。

     

    1.1.1 Hello World

    前提条件:安装Docker,需要互联网连接。

    命令docker run dockerinaction/hello_world

     

    docker run,它告诉docker你想触发这一系列动作:在容器内安装和运行程序

    640?wx_fmt=png

    命令的第二部分指明了你想在容器里运行的程序, 本例中就是 dockerinaction/hello_world, 它叫做镜像 (image) 名 (有时候也叫做仓库 repository). 从现在开始, 你就可以把镜像的名字作为你想安装或运行的程序名. 镜像本身就是一组文件和元数据. 其中元数据包括了要运行的特定程序和相关配置.

    ·         本例容器运行结果就是输出一个“hello world”, 输出完, 程序就退出了. 这时容器的状态被标记为 stopped.

    ·         容器的运行状态直接和容器内的单个运行程序的状态是绑定的. 如果一个程序在运行状态, 那么容器也在运行状态; 如果这个程序是出于停止状态的, 那么容器也是停止状态的.

    ·         重启容器将会重新运行该程序.

     

    当你第二次运行该命令的时候:

     

    640?wx_fmt=png


    1.1.2 容器

    历史上, UNIX风格的操作系统使用jail这个术语来描述一个被修改的运行时环境, 意思是它会把jailed的程序可访问的资源限制在一定范围之内.

    任何使用Docker运行的软件都是放在容器内的. Docker使用现有的容器引擎来提供根据最佳实践来构建的一致容器, 这就为每个人提供了更大的安全保障.

    使用Docker, 用户获得容器的成本要低得很, 因为Docker会帮助你处理这一切.

     

    1.1.3 容器不是虚拟化

    ·         与虚拟机不一样, Docker容器不使用任何的硬件虚拟化. 在Docker容器内运行的程序直接与主机的Linux内核交互.

    o    许多程序是可以独立运行的, 对操作系统没有更多的依赖, 页不需要忍受整个启动过程造成的延迟

    o    这是一个非常重要的区别.

    o    Docker不是虚拟化技术.

    o    它帮助你使用你操作系统内核已经存在的容器技术.

    ·         你可以在操作系统为现代Linux的虚拟机里面使用Docker.

     

    1.1.4 容器中运行软件为的是隔离性

    ·         Docker 使用 Linux命名空间和cgroups, cgroups自从2007年开始就成为了Linux 的一部分.

    ·         Docker 本身并不提供容器技术, 但是它使得容器技术可以更简单的使用

    ·         

    640?wx_fmt=jpeg

    在这里CLI运行在user space内存里, 和其它程序一样, 也是运行在操作系统之上. 理想状态下, 在user space里运行的程序无法修改内核空间(kernel space)内存. 更广泛的说, 操作系统是所有用户程序和支撑计算机运行的硬件之间的接口.

    ·         

    640?wx_fmt=jpeg

    你可以看见, 运行Docker其实意味着在user space 里面运行两个程序.

    o    Docker 引擎, 如果安装适当的话, 这个进行会一直运行的.

    o    Docker CLI, 这额是用户交户的Docker程序. 如果你想开始, 停止, 或安装软件, 你就会向Docker程序发送一个相应的命令.

    上图中, 你可以看三个正在运行的程序, 每一个都是作为Docker引擎的子进程运行的, 外边包裹着一个容器.

    o    委托进程是运行在user space的自己的内存子空间里.

    o    运行在容器内的程序至可以访问它们自己的内存和资源, 也就是容器限定的内存和资源.

     

    ·         Docker构建容器时(构建容器在运行时)使用了10个主要的系统特性:

    o    PID namespace—Process identifiers and capabilities

    o    UTS namespace—Host and domain name

    o    MNT namespace—File system access and structure

    o    IPC namespace—Process communication over shared memory

    o    NET namespace—Network access and structure

    o    USR namespace—User names and identifiers

    o    chroot()—Controls the location of the file system root

    o    cgroups—Resource protection

    o    CAP drop—Operating system feature restrictions

    o    Security Modules—Mandatory access controls

    1.1.5 Shipping Containers 运输容器

    你可以把Docker容器看作物理运输使用的集装箱一样. 它就是一个箱子, 在这里你可以存储和运行应用程序及其所有的依赖项(除了运行操作系统内核这一条). 和起重机, 开车, 火车, 轮船可以很方便的使用集装箱一样, 用Docker来运行, 复制, 分发容器也是非常简单的. 而且Docker让这个传统的集装箱比喻更加完整, 它加入了打包和分发软件的方式. 负责运输容器的组件就叫做镜像 image.

     

    前面的例子里的镜像只包含一个文件, 一个linux的可执行程序.

    ·         而一般来说, Docker镜像是容器内运行的程序需要用到的所有文件的一个捆绑的快照.

    ·         从一个镜像, 你可以创建任意个容器, 这些容器都是从同一个镜像作为起点来创建的, 它们并不会共享对文件系统的修改.

    ·         当你使用Docker分发软件的时候, 你使用这些镜像来进行分发, 其它的计算机也是通过这些镜像来创建容器的.

    ·         镜像就是Docker生态里可运输的单元.

     

     

    1.2 Docker 解决了什么问题?

    ·         使用软件是一件非常复杂的事.

    o    在安装软件前, 你需要考虑使用哪个操作系统,

    o    软件所需的资源,

    o    已经安装了哪些软件,

    o    它还依赖于其它哪些软件.

    o    还需要决定软件应该安装在哪,

    o    然后你还需要知道如何去安装它.

    现在各个软件的安装过程差别也非常大, 所以安装软件其实是非常复杂且没有一致性的操作. 如果你想让多台电脑在不同时刻使用相同的一套软件, 那么情况只会更加糟糕.

    大部分人的电脑都安装了不只一个程序, 很多程序还依赖于其它程序. 如果你想要使用的软件无法和其它软件很好的一起工作, 那么该怎么办? 灾难.

    ·         而当多个程序共享依赖项的时候, 一切只会变得更加复杂:

    o    如果一个程序的依赖项需要升级, 而其它程序的这个依赖项却不需要升级, 那么会发生什么?

    o    当你移除了一个程序, 它真的被删除了吗?

    o    你可以移除老的依赖项吗?

    o    你还记得为了安装这个软件你做的那些修改吗? 现在你想删除这个软件, 这些修改怎么办?

    所以说, 软件越多, 越难管理. 此外, 还有安全性需要考虑.

    这些一切的一切管理起来很难, 并且很浪费时间.

     

    1.2.1 Getting Organized

    没有Docker, 你的电脑看起来就像装满垃圾的抽屉一样, 乱七八糟.

     

    640?wx_fmt=jpeg

    而使用Docker, Docker会把一切整理的井然有序, 通过镜像和容器, 一切都被隔离了.

    640?wx_fmt=jpeg

    看起来这里创建了一些多余的依赖项, 例如gcc, 所以会引入一些开销. 这点以后再解释, 简单的说就是Docker的打包系统会削减存储开销的.

     

    1.2.2 改善可移植性

    另一个软件问题就是应用程序的依赖项里通常包括特定的操作系统. 操作系统间的可移植性对用户来说是个大问题. 例如一些在Linux和Mac上可以兼容的程序, 想要在Windows上使用它就挺困难. 这可能需要重构整个软件, 而且还需要Windows有相应的依赖替代项.

    现在, Docker可以在Linux上原生的运行, 在Mac和Windows上需要使用一个虚拟机. 这种在Linux上的聚合意味着在Docker容器中运行的软件只需要针对一组一致的依赖项编写一次即可.

    在Windows和Mac上, Docker使用一个很小的虚拟机来运行所有容器. 这样的话, 运行虚拟机的开销是固定的, 而容器的数量确实可以扩展的.

    优点有三个:

    ·         解锁了新世界. 例如以前无法在Windows上运行的Linux软件现在也可以使用了.

    ·         可以在任何系统上运行完全相同的软件.

    ·         软件维护者可集中精力针对一套平台和依赖来开发软件了.

     

    1.2.3 保护你的计算机

    容器可以保护我的计算机不受容器中运行的软件影响.

    程序的风险主要有这些:

    ·         程序可能是恶意程序员写的

    ·         善意开发者写出来的程序也可能含有有害的bug

    ·         程序输入处理中的漏洞, 可能被恶意攻击者利用

     

    和实体监狱一样, 容器里的任何东西只能访问容器里面的东西. 但是用户可以设置一些例外.

    640?wx_fmt=jpeg

    左侧就是恶意程序直接访问到了敏感资源.

    右侧, 恶意程序被限制在了容器里.

     

    1.3 Docker 为什么这么重要?

    ·         Docker 提供了一种抽象, 抽象允许你使用简化的方式来处理复杂的事物. 针对Docker来说, 我们只需考虑安装哪个软件即可. 安装和删除的过程异常简单.

    ·         每个人都可以使用, 省时省力省钱.

    ·         软件社区正在大力推动使用容器和Docker

    ·         它为桌面实现了移动设备的应用商店一样的功能. 并且Docker的做法是跨平台并且开放的.

    ·         更好更多的采用了操作系统的高级隔离特性.

     

    1.4 何时何地使用Docker?

    Docker几乎可在任何地方运行, 但是并不意味着这样做就合适.

    在桌面上运行Windows/OS X原生程序是不行的.

    容器对于必须取得机器全部控制权限的程序的安全性是没有多大帮助的.

     

    1.5 Docker在更大的生态中

    ·         今天容器的生态更大, 高级工具也很多, 它们主要是为了解决一些新出现的, 高阶的问题: 容器编排, 高可用集群, 微服务生命周期管理, 可见性.

    ·         这些工具通常是作为插件或者依赖于Docker提供更高级的功能性. 有一些工具使用了Docker的子组件, 这些子组件是独立的项目, 例如 runc, libcontainerd, notary等.

    ·         Kubernetes是整个生态中除了Docker之外最值得一提的工具. 它提供了一个可扩展平台, 用于在集群环境中把服务作为容器进行编排. 它已经成长为某种“数据中心操作系统”了. 就像Linux 内核一样, 云提供商和平台公司都在对Kubernetes进行包装. Kubernetes依赖于像Docker一样的容器引擎, 所以在你笔记本上构建的容器和镜像在Kubernetes里面也会运行.

     

    1.6 Docker 命令行帮助

    docker

    docker help

    docker help <command>

     

     

    640?wx_fmt=jpeg

    展开全文
  • Docker技术到底是啥Docker是一个开源项目,可以轻松创建容器和基于容器的应用程序,最初是为Linux构建的,现在也可以在Windows和MacOS上运行。   一直以来Docker都可以帮助开发人员快速构建轻量级和可移植的软件...
        

                                    

    戳蓝字“CSDN云计算”关注我们哦!

    640?wx_fmt=jpeg

                                                          编译作者:风车云马(微信号:zhangyisq)
    文︱Serdar Yegulalp
    本篇文章转自InfoWorld网站

    在畅聊Docker之前,我们先讲讲什么是容器?                                           

    现代软件开发的目标之一是应用程序既能运行在同一主机或集群上,又能彼此隔离,这样它们就不会过度干扰彼此的操作或维护,但由于要运行包、库和其他软件组件,这样就会变得会比较困难。

     

    解决这个问题的方案之一是用虚拟机,它将相同硬件上的应用程序完全隔离,并将软件组件之间的冲突和硬件资源之间的竞争降到最低,但是虚拟机体积比较庞大,每个虚拟机都需要自己的操作系统,所以通常是GB大小而且很难维护和升级。

     

    与虚拟机相反,容器将应用程序的执行环境彼此隔离,但共享底层OS内核。它们通常以兆字节为单位,使用的资源比虚拟机少得多,而且几乎是立即启动的。可以做到在相同的硬件上更密集地打包,而不需要花费太多的精力和开销。

     

    容器提供了一种高效和高粒度的机制,将软件组件组合到现代企业所需的各种应用程序和服务堆栈中,并保持这些软件组件的更新和维护。 

    640?wx_fmt=jpeg

    图片来源网络

     

    Docker技术到底是啥?

    Docker是一个开源项目,可以轻松创建容器和基于容器的应用程序,最初是为Linux构建的,现在也可以在Windows和MacOS上运行。

     

    一直以来Docker都可以帮助开发人员快速构建轻量级和可移植的软件容器,从而简化应用程序开发、测试和部署等诸多环节。具体来说,它是一个用于构建应用程序的软件平台,可以提供一种小型和轻量级的执行环境用来共享操作系统内核,但在其他方面是独立运行的。

     

    虽然容器概念已经出现不短的时间,但2013年推出的开源项目Docker在很大程度上帮助推广了这项技术,并推动了软件开发中容器化和微服务的趋势,这种趋势后来被称为云原生开发。

     

    要理解Docker的工作原理,让我们看一下用于创建Docker容器化应用程序的一些组件。 

    640?wx_fmt=jpeg

    图片来源网络

    Dockerfile文件每个Docker容器都从一个Dockerfile开始。Dockerfile是用易于理解的语法编写的文本文件,其中包含构建Docker镜像的指令,指定了容器的操作系统、编程语言、环境变量、文件位置、网络端口和其他组件,当然还指定了容器在运行后要做什么。

     

    Docker镜像:编写好Dockerfile之后,就可以调用Docker构建工具build来创建一个Dockerfile镜像。

     

    Dockerfile是一组说明如何生成镜像的指令,而Docker镜像是一个可移植文件,包含容器将运行哪些软件组件以及如何运行的规范,因为Dockerfile可能包含关于从在线资源库获取某些软件包的说明,所以需要注意指定正确的版本,否则Dockerfile可能会根据调用的时间不同生成不一致的镜像。但是一旦创建了一个镜像,它就是静态的。

     

    Docker启动:Docker的实用程序run是启动容器的命令,每个容器都是一个镜像的实例。容器设计为瞬态和临时的,但是它们可以停止和重新启动。此外可以同时运行同一镜像的多个容器实例(每个容器具有唯一的名称)。

     

    Docker Hub库:虽然构建容器很容易,但也不要以为需要从头构建每个镜像。Docker Hub是一个用于共享和管理容器的SaaS存储库,可以从中找到来自开源项目和软件供应商的官方Docker镜像,甚至普通公众的非官方镜像。甚至可以下载包含有用代码的容器镜像,或者上传自己的镜像共享它们,也可以将它们设置为私有,如果愿意还可以创建一个本地Docker注册表。

     

    Docker 引擎:Docker引擎是Docker的核心,Docker创建和运行容器采用的是底层CS(客户端-服务器)技术。一般来说,当某人泛泛地说Docker,而不是指公司或整个项目时,他们指的是Docker引擎。Docker引擎有两个不同的版本:Docker Engine Enterprise和Docker Engine Community。

     

    Docker在2017年发布了企业版Enterprise Edition,兼容最初的版本,仍然是免费开源的。除此之外,Enterprise Edition增加了高级管理功能,包括集群控制和镜像管理,以及漏洞监控,每个节点每年的成本为1500美元。

     

    Docker组件、Docker集群和Kubernetes:Docker还使容器之间的协调变得更容易,通过将容器打包来构建应用程序堆栈。Docker组件简化了开发和测试多容器应用程序的过程。它是一个命令行工具,类似于Docker客户端,它接收一个特殊格式的描述符文件,用于从多个容器组装应用程序,并在单个主机上协同运行它们。

     

    这些更高级的版本由其他产品提供,比如Docker Swarm和Kubernetes。但是Docker提供了基础。Swarm是从Docker项目中发展起来的,Kubernetes实际上已经成为Docker编配平台的首选。

    Docker优势可圈可点

    Docker容器提供了一种构建企业应用程序和业务流程应用程序的方法,这些应用程序比传统应用程序更容易安装、维护和移动。

     

    Docker容器支持隔离:Docker容器使应用程序不仅彼此隔离,而且与底层系统隔离。这不仅使软件栈更干净,而且更容易使容器化应用程序使用系统资源,例如CPU、GPU、内存、I/O、网络等,它还可以确保数据和代码保持独立。

     

    Docker容器支持可移植性:Docker容器在支持容器运行环境的任何机器上运行。应用程序不必绑定到主机操作系统,因此可以保持应用程序环境和底层操作环境的整洁和最小化。

     

    例如,采用容器的MySQL将在大多数支持容器的Linux系统上运行,应用程序的所有依赖项通常都在同一个容器中提供。基于容器的应用程序可以轻易从on-prem系统迁移到云环境中,或从开发人员的笔记本电脑移到服务器上,只要目标系统支持Docker以及可能与之一起使用的任何第三方工具,比如Kubernetes。

     

    通常,Docker容器镜像必须为特定的平台构建。例如Windows容器不能在Linux上运行,反之亦然;以前,绕过此限制的一种方法是启动运行所需操作系统实例的虚拟机,并在虚拟机中运行容器。

     

    然而Docker团队后来设计了一个更优雅的解决方案,称为manifest,它允许多个操作系统的镜像并行打包。尽管manifest虽然还处于试验阶段,但这暗示了容器可能成为跨平台应用程序解决方案和跨环境应用程序解决方案。

     

    Docker容器支持可组合性:大多数业务应用程序由几个独立的组件组成,web服务器、数据库和cache缓存。Docker容器可以将这些部件组合成一个容易更换的功能单元。每个部分由不同的容器提供,可以独立于其他容器进行维护、更新、交换和修改。

     

    这本质上是应用程序设计的微服务模型。通过将应用程序功能划分为独立的、自包含的服务,微服务模型为过程缓慢的传统开发和单一僵化的应用程序提供了一种解决方案,轻量级和便携式容器使构建和维护基于微服务的应用程序变得更加容易。

     

    Docker容器简化了编排和扩展:由于容器是轻量级的,并且开销很小,所以可以在给定的系统上启动更多的容器,而且容器也可以用于跨系统集群扩展应用程序,并将服务向上或向下扩展以满足高峰需求或节约资源。

     

    用于部署、管理和扩展容器的大多数企业级工具版本都是通过第三方项目提供的。其中最主要的是谷歌的Kubernetes,这是一个支持容器部署和扩展的自动化系统,还支持容器连接、负载平衡和管理。Kubernetes还提供了创建和重用多容器应用程序或“Helm charts”图表的方法,这样就可以根据需要构建和管理复杂的应用程序堆栈。

     

    Docker还内置了Swarm编排模式,目前该模式应用比较少,Kubernetes已成为某种默认选择。事实上Kubernetes与Docker Enterprise Edition捆绑在一起。

    Docker是如何征服容器世界的?

    几十年来,Unix操作系统(如BSD和Solaris)一直存在这样一种思想,即给定的进程可以在一定程度上独立于其操作环境运行。最初的Linux容器技术LXC是一种os级别的虚拟化方法,用于在一台主机上运行多个隔离的Linux系统。LXC是通过两个Linux特性实现的:命名空间(namespaces)和cgroups控制组(controlgroups),命名空间封装了一组系统资源,使其看起来像是专门用于该进程的;cgroups控制组用于管理一组进程的系统资源(如CPU和内存)的隔离和使用。

     

    容器将应用程序与操作系统解耦,这意味着用户可以拥有一个干净且最小的Linux操作系统,并在一个或多个隔离的容器中运行其他所有东西。由于操作系统是从容器中抽象出来的,所以您可以将容器移动到支持容器运行环境的任何Linux服务器上。

     

    Docker在LXC基础上进行了几项重大更改,使容器更加便捷和灵活。使用Docker容器,比使用虚拟机更快、更容易地部署、复制、移动和备份工作负载。Docker为任何能够运行容器的基础架构带来了云一样的灵活性。Docker的容器镜像工具也是LXC的一个改进,它允许开发人员构建镜像库,从多个镜像组合应用程序,并在本地或远程基础架构上启动这些容器和应用程序。

     

    Docker表现并不万能

     

    容器可以解决很多问题,但也不是万能药,有一些缺点是由设计本身造成的。

     

    Docker容器不是虚拟机。人们对容器最常见的错误是将它们等同于虚拟机。然而,由于容器和虚拟机使用不同的隔离机制,它们有明显不同的优点和缺点。

     

    虚拟机为进程提供了高度的隔离,因为它们在自己的操作系统实例中运行。该操作系统也不必与主机上运行的操作系统相同。Windows虚拟机可以在Linux管理程序上运行,反之亦然。

     

    相反,容器使用主机操作系统资源的受控部分;许多应用程序以高度管理的方式共享相同的OS内核。因此,容器化应用程序不像虚拟机那样完全隔离,但是它们为绝大多数工作负载提供了足够的隔离。

     

    Docker容器无法提供裸机速度。容器几乎没有虚拟机的开销,但是它们的性能影响仍然是存在的。如果您的工作负载需要裸机速度,那么容器可能足够接近—比vm更接近—但是您仍然会看到一些开销。

     

    Docker容器是无状态和不可变的。容器从描述其内容的镜像启动和运行。默认情况下,该镜像是不可变的——一旦创建,它就不会更改。

     

    因此,容器没有持久性。如果启动一个容器实例,然后将其终止并重新启动它,那么新的容器实例将不会具有与旧容器实例关联的任何有状态信息。

     

    这是容器区别于虚拟机的另一个方式。默认情况下,虚拟机具有跨会话的持久性,因为它有自己的文件系统。对于容器来说,改变这种情况的唯一方法是创建一个新的、修改过的容器镜像。

     

    从积极的方面看,容器的无状态性使容器的内容更加一致,它还迫使开发人员将应用程序数据与应用程序代码分开。如果希望容器具有任何持久性状态,则需要将该状态放置到其他位置。可以是数据库,也可以是在引导时连接到容器的独立数据卷。

     

    Docker容器不是微服务。在前面提到过容器如何帮助创建微服务应用程序。这并不意味着将给定的应用程序粘贴到容器中就会自动创建一个微服务。无论微服务是否部署在容器中,都必须根据微服务设计模式构建微服务应用程序。

     

    当虚拟机出现时,它们使应用程序与所运行的系统解耦成为可能。Docker容器进一步实现了这一想法,它不仅比虚拟机更轻量级、更便携、运行速度更快,而且还提供了虚拟机无法提供的扩展、组合和管理特性。


    640?wx_fmt=png

    如何少走弯路,利用不同区块链的数据结构实现项目上链?

     

    数据架构是区块链的重要组成部分,了解数据架构,可以让我们对于自身业务是否适合上链做出明智的判断。

     

    9月19日,【dfuse小聚:区块链数据应用讨论会】将在上海举行,dfuse CTO&联合创始人、EOS加拿大联合创始人 Alex Bourget;慢雾科技合伙人兼安全产品负责人启富(Keywolf);MYKET联合创始人/EOS Cannon联合创始人Ricky胖哥,与你一起深度探索区块链应用搭建以及区块链数据结构的奥秘,让你明白到底你的业务该如何上链!

     

    长按下方二维码报名

    ???

    640?wx_fmt=jpeg

    福利

    扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

    640?wx_fmt=jpeg



    推荐阅读:

    展开全文
  • 什么 Docker,使用Docker好处?

    千次阅读 2019-01-22 09:56:31
    Docker 一个开源项目,这个项目旨在通过把应用程序打包为可移植的、自给自足的容器(引用语) DocKer一次构建可放在任何地方就可以运行,不需要进行任何改变DocKer 就类似于一个容器。这个容器就好像咱们常用的...
  • Docker是

    2017-11-15 21:48:00
    谈到docker大家应该都不陌生,从2013年初诞生到现在,短短两年时间内,迅速成为仅次于openstack的最受欢迎的云计算开源项目。 那么是什么原因导致docker这么火热呢?... 本文主要介绍docker是什么...
  • Docker container 是啥

    2020-10-31 16:56:47
    Containers are just normal Linux Processes with additional configuration applied. 容器只是有附加配置的 ...$ docker run -d --name=db redis:alpine # --name 指定容器名称 $ docker images REPOSITORY TAG IM.
  • docker是什么

    2017-12-15 13:19:56
    Docker有啥用,看这篇文章就够了!...Docker是啥? 打开翻译君输入Docker 结果显示码头工人,没错!码头工人搬运的是集装箱,那么今天要讲的Docker其操作的也是集装箱,这个集装箱就静态而言就是一个应用镜像文件
  • Docker image 是啥

    2020-10-31 11:11:20
    A container image is a tarfile containing tar files. Each of the tar file is a layer. Once all tar files have been extract into the same location then you have the container’s filesystem...docker pull .

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 870
精华内容 348
关键字:

docker是啥