系统学习Docker践行DevOps理念(一)

一、容器技术简介

0x1.传统应用运维的弊端 * 部署非常慢成本非常高资源浪费 * 难于迁移和扩展可 * 能会被限定硬件厂商

0x2.虚拟化技术优点 * 一个物理机可以部署多个app * 每个app独立运行在一个VM里

* 资源池——一个物理机的资源分配到了不同的虚拟机里 * 很容易扩展——加物理机器或者加虚拟机 * 很容易云化一亚马逊AWS,阿里云等

0x3.虚拟化技术局限性 * 每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多

0x4.容器技术

* 解决了开发和运维之间的矛盾 * 在开发和运维之间搭建了一个桥梁,是实现 devops 的最佳解决方案 * 对软件和其依赖的标准化打包 * 应用之间相互隔离 * 共享同一个 OS Kernel * 可以运行在很多主流操作系统上

0x5.容器与虚拟化的区别

二、镜像与容器

0x1 镜像(Image)——一个特殊的文件系统   操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而Docker 镜像(Image),就相当于是一个 root 文件系统。 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。   Docker 设计时,就充分利用 Union FS的技术,将其设计为 分层存储的架构 。 镜像实际是由多层文件系统联合组成。   镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。   分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。 0x2 容器(Container)——镜像运行时的实体   镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。   容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。   容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。   按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。

0x3 仓库(Repository)——集中存放镜像文件的地方   镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

  一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

  通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。

这里补充一下Docker Registry 公开服务和私有 Docker Registry的概念:

  Docker Registry 公开服务 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

  最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:https://hub.docker.com/ 。在国内访问Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。

  除了使用公开服务外,用户还可以在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

0x4 Build, Ship, and Run

- Build(构建镜像) : 镜像就像是集装箱包括文件以及运行环境等等资源。 - Ship(运输镜像) :主机和仓库间运输,这里的仓库就像是超级码头一样。 - Run (运行镜像) :运行的镜像就是一个容器,容器就是运行程序的地方。

Docker 运行过程也就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。所以,我们也常常将Docker称为码头工人或码头装卸工,这和Docker的中文翻译搬运工人如出一辙。

三、Dockerfile最佳实践

0x1 FROM - FROM scratch //制作base images - FROM centos //使用base images - 为了安全尽量使用官方的image作为base image!

0x2 LABLE - LABEL maintainer= "geekmubai' - LABEL version="1.0" - LABEL description= "This is description" - Metadata 不可少!

0x3 RUN - 为了美观,复杂的RUN请用反斜线换行! - 避免无用分层,合并多条命令成一行!

RUN yum update && yum install -y vim \ python-dev #反斜线换行 RUN apt-get update && apt-get install -y perl \ pwgen --no-install-recommends && rm -rf \ /var/lib/apt/lists/* #注意清理 cache RUN /bin/bash -C 'source $HOME/. Bashrc; echo $HOME'

123456789

RUN yum update && yum install -y vim \python-dev #反斜线换行 RUN apt-get update && apt-get install -y perl \pwgen --no-install-recommends && rm -rf \ /var/lib/apt/lists/* #注意清理 cache RUN /bin/bash -C 'source $HOME/. Bashrc; echo $HOME'

0x4 WORKDIR 设定当前目录 - 用WORKDIR,不要用RUN cd! - 尽量使用绝对目录,不要使用相对目录!

WORKDIR /root WORKDIR /test #如果没有会自动创建test目录 WORKDIR demo RUN pwd #输出结果应该是/test/demo

12345

WORKDIR /rootWORKDIR /test #如果没有会自动创建test目录 WORKDIR demo RUN pwd #输出结果应该是/test/demo

0x5 ADD & COPY - 大部分情况,COPY优于ADD! - ADD除了COPY还有额外功能(解压)! - 添加远程文件/目录请使用curl或者wget!

ADD hello / #将文件添加到根目录 ADD test.tar.gz/ #添加到根目录并解压 WORKDIR /root ADD hello test/ # /root/test/hello WORKDIR /root COPY hello test/

1234567

ADD hello /  #将文件添加到根目录ADD test.tar.gz/ #添加到根目录并解压WORKDIR /root ADD hello test/ # /root/test/helloWORKDIR /root COPY hello test/

0x6 ENV - 增加可维护性

MYSQL_ VERSION 5.6 #设置常量 RUN apt-get install -y mysql-server= "${MYSQL_ VERSION}" \ && rm -rf /var/lib/apt/lists/* #引用常量

1234

MYSQL_ VERSION 5.6 #设置常量RUN apt-get install -y mysql-server= "${MYSQL_ VERSION}" \&& rm -rf /var/lib/apt/lists/* #引用常量

0x7 RUN CMD Entrypoint RUN:执行命令并创建新的 Image Layer CMD:设置容器启动后默认执行的命令和参数 - 容器启动时默认执行的命令 - 如果 docker run 指定了其它命令,CMD 命令被忽略 - 如果定义了多个 CMD,只有最后一个会执行 ENTRYPOINT:设置容器启动时运行的命令 - 让容器以应用程序或者服务的形式运行 - 不会被忽略,一定会执行 - 最佳实践:写一个 shell 脚本作为 entrypoint

Shell格式和Exec格式

Shell 格式 RUN apt-get install -y vim CMD echo "hello docker" ENTRYPOINT echo "hello docker" Exec 格式 RUN ["apt-get","install","-y", "vim"] CMD["/bin/echo", "hello docker" ] ENTRYPOINT [ "/bin/echo" ,"hello docker"]

12345678910

Shell 格式RUN apt-get install -y vimCMD echo "hello docker" ENTRYPOINT echo "hello docker" Exec 格式RUN ["apt-get","install","-y", "vim"]CMD["/bin/echo", "hello docker" ]ENTRYPOINT [ "/bin/echo" ,"hello docker"]

除特别注明外,本站所有文章均为慕白博客原创,转载请注明出处来自https://geekmubai.com/programming/730.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈唁志

什么是Docker?Docker的快速入门教程

Docker 从2013年发布至今, 许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?

853
来自专栏Laoqi's Linux运维专列

Docker 空间使用分析与清理

4724
来自专栏Coding01

自建 Laravel 的 Docker 开发环境

好久没写东西,今天说一说怎么自建一个 Laravel 运行的 Docker 环境。

1632
来自专栏容器云生态

如何优雅的编写Dockerfile

在生产环境中一般我们会对基本的环境进行自构建,从而利用images的分层特性去层层构建上层的业务镜像。 1.默认情况下我们会首先构建一个基本的base镜像,这...

1.1K8
来自专栏写代码的海盗

Docker学习总结之docker入门 What is Docker?What can I use Docker for?What are the major Docker components?

  Understanding Docker 以下均翻译自Docker官方文档 ,转载请注明:Vikings翻译。 What is Docker? Dock...

2723
来自专栏北京马哥教育

Docker 入门教程

几个月以前,红帽(Red Hat)宣布了在 Docker 技术上和 dotCloud 建立合作关系。在那时候,我并没有时间去学习关于 Docker 的知识,所以...

3727
来自专栏惨绿少年

Docker 容器入门

1.1 容器简介 1.1.1 什么是 Linux 容器 Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件...

5459
来自专栏北京马哥教育

docker容器技术系列三:docker镜像

本系列教程由旺旺知识库授权进行发布 前面基本概念部分我们已经介绍了docker镜像就是一个只读模板,可以从镜像启动一个容器实例。我们也发现,在启动容器的过程中...

4056
来自专栏Java架构沉思录

微服务不得不了解的Docker入门与实践

Docker 是一个能让程序跑在一个它无法感知的、用于隔绝外界环境里的容器的工具。

831
来自专栏AI-vell

docker镜像制作commit方式

可以先基于一个已有镜像,通过bash添加自己需要的环境,然后commit一下【虽然官方不建议通过commit方式来创建,如果不担心镜像会越来越大的话,这种方式是...

2776

扫码关注云+社区

领取腾讯云代金券