当前位置: 澳门新濠3559 > 操作系统 > 正文

创建镜像,build创建一个连续执行docker指令的自动

时间:2019-11-09 19:30来源:操作系统
step 1: 按照语法,如下写一个centos操作系统的nignx镜像。   使用缓存代理(即使用依赖包代理工具有效减短编译指令所消耗的时间) 书中提到,一个基于Debian的系统的Docker镜像从APT资源

step 1: 按照语法,如下写一个centos操作系统的nignx镜像。

 

使用缓存代理(即使用依赖包代理工具有效减短编译指令所消耗的时间)

书中提到,一个基于Debian的系统的Docker镜像从APT资源库中下载依赖包,编译镜像的过程中,apt-get install指令运行的时间长短取决于网络与所需要下载依赖包的大小。降低时间的技巧是引入这些依赖包的缓存代理:如apt-cacher-ng工具等等

这里使用网易蜂巢的镜像进行测试
$ vim Dockerfile


FROM hub.c.163.com/netease_comb/debian:7.9
MAINTAINER netease

RUN apt-get update &&
apt-get install -y nginx

EXPOSE 22 80 443

ENTRYPOINT /etc/init.d/nginx start && /usr/sbin/sshd -D

澳门新濠3559 1

网易蜂巢nginx镜像.png


$ time docker build -t beforecaching .

澳门新濠3559 2

构建beforecaching花了1m23s.png


#################为了提高该编译速度,于是开始搭建apt-cacher-ng缓存代理
笔者本地网络架构图

澳门新濠3559 3

笔者本地网络图

(在另一台主机192.168.1.88上执行命令进行代理
也可以在宿主机上执行,只是个人觉得效果不大)
$ docker run -d -p 3142:3142 sameersbn/apt-cacher-ng

澳门新濠3559 4

apt-cacher-ng运行在192.168.1.88主机上 而dockerhost宿主机为192.168.1.100 用88作为代理主机.png

如果想构建原生的air-cacher-ng 可以看这里.


################修改之前的Dockerfile文件,添加代理路径
vim Dockerfile


FROM hub.c.163.com/netease_comb/debian:7.9
MAINTAINER cai980273879
#################添加了这一行
RUN echo Acquire::http { Proxy"

RUN apt-get update &&
apt-get install -y nginx

EXPOSE 22 80 443

ENTRYPOINT /etc/init.d/nginx start && /usr/sbin/sshd -D


澳门新濠3559 5

修改后的dockerfile.png

开始执行构建:
$ time docker build -t aftercaching .

澳门新濠3559 6

添加代理cachering后的主机缓存时间为0m37s.png

#############可见通过使用代理,获得6.5倍的速度提升。
笔者这里用的是163的镜像,由于是国内镜像,相比国外镜像速度不会提升多少(只提升了30s)
其他代理的方式有:Sonatype:Maven,Ruby,PyPi,NuGet的依赖包缓存
Polipo:通用代理缓存
Squid:较为流行的代理缓存
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx题外话xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
总共有三种方法可以进行缓存代理 本文采用的是第一种方法
1.添加一个apt代理设置echo 'Acquire::http { Proxy "http://dockerhost:3142"; };' >> /etc/apt/conf.d/01proxy
如:RUN echo Acquire::http { Proxy"http://dockerhost:3142";};>/etc/apt/apt.conf.d/01proxy

2.设置环境变量:http_proxy=http://dockerhost:3142/
如: docker run --rm -t -i -e http_proxy=http://dockerhost:3142/ debian bash

3.修改你的sources.list来开始http://dockerhost:3142/


dockerfile用于存放docker指令,通过dockerfile文件,docker可以自动构建镜像、用户可以通过docker build创建一个连续执行docker指令的自动构建程序

然后回车,执行build如下图,只需要等待build所有过程完成即可。

三、实验步骤

Docker镜像的编译时间降低了约80倍

Format

dockerfile内容格式:

# Comment(描述、注释)

INSTRUCTION(指令) arguments(参数)

指令区分大小写,但通常约定指令大写,以便于同参数区分

dockerfile必须以FROMR指令开始

# Comment #代表注释(注释中不支持换行符)

RUN echo 'we are running some # of cool things'

 

澳门新濠3559 7

澳门新濠3559 8

创建镜像,build创建一个连续执行docker指令的自动构建程序。从镜像获取角度

#######书中提到,当需要在本地不同的宿主机中部署相同的镜像,如果分主机一个一个从dockerhub上下载是低效的,故采用了上一节的私人registry仓库部署,从而达到一次下载进行分配而无需多次下载。

配置本地registry文件位置
ubuntu主机的docker.service文件位置为:/etc/default/docker/
centos主机的docker.service文件位置为:/etc/sycconfig/docker
搭建本地registry可以看我的文章.

########当然其他主机下载时,首先会检查同一局域网中是否存在registry,若存在则从本地拷贝下载(即忽略dockerhub下载),否则就从dockerhub上下载。其次,docker daemon还会检查是否本地存在一样的sha256值的相同镜像,如不同才下载。
书中提到,搭建docker本地Registry可以提升下载上游镜像的速度,通常速度可以提升两倍左右~>-<

澳门新濠3559 9

这是笔者从另一台docker主机下载本地registry镜像的时间

如若sha256值,即镜像一样时无须下载

澳门新濠3559 10

同样sha256为:2daa1d34f7063398edaff5b67c无须下载

Usage

docker build通过dockerfile和相关上下文构建镜像,构建的上下文是在指定位置的目录或者URL的文件集

上下文构建递归进行,包括指定的path及其子目录、子文件

docker build . :表示以当前目录作为构建上下文

构建程序通过docker守护进行执行,在通常情况下,尽量使用一个空目录作为构建上下文,并且不要在dockerfile中加入docker 构建无关的文件

Warning:不要使用/root路径作为上下文路径,否则docker build会将整个硬盘中的数据传入docker守护进程中

可以通过不需要参与构建的文件写入.dockerignore文件中,如此一来,在docker build时,会忽略掉其中的内容,提升构建效率

在默认情况下,dockerfile在路径中以"Dockerfile"为文件名,位于docker context的根目录,也可以自己指定一个路径,使用"-f"指定之后,docker构建镜像时会自动在指定路径下寻找Dockerfile

docker build -f /path/to/a/Dockerfile .

如果构建成功,可以指定一个存储库和标签来保存新镜像:

docker build -t shykes/myapp .

可以通过-t生成多个标签:

docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

docker build对dockerfile中的指令是逐条执行的,在生成最终镜像时,docker daemon会自动删除上下文

Note:每条指令单独运行,每次运行指令时都会生成新的镜像

--cache-from:使用指定的镜像构建缓存

 

四、实验结果

从复用镜像层角度(dockerfile角度)

  • 改变语序以复用缓存
  • 减少构建上下文大小
  • 使用缓存代理

Parser directives(解析器指令)

 解析器指令用于提示解析器进行特殊处理,对于parser directives有以下需要几点需要注意:

1 可以不添加该指令,如果需要用于,必须放在dockerfile的第一行,否则会被当成注释处理

2 字母不区分大小写,不过约定情况下都使用小写

3 不支持换行符

根据以上规则,以下为非法形式:

1 换行无效

  # direc

  tive=value

2 出现两次无效

   # directive=value1

   # directive=value2

3 没有写在第一行无效

  FROM ImageName

  # directive=value(此处因为写在了from指令的后面,会被当成注释)

  

  # About my dockerfile

  # directive=value(同上)

  FROM ImageName

4 未知指令无效

  # unknowndirective=value

注:对于解析器指令 中间可以有空格,以下几种形式等效

  #directive=value

  # directive =value

  # directive= value

  # directive = value

  #   dIrEcTiVe=value

 

 

牢记,将更新语句集结到Dockerfile最前段,可有效节省修改后构建的时间


</br>

备注:最后加1个空格,1个英文句号,OK

 

变更dockerfile文件,剥离更新语句

$ vim Dockerfile


FROM ruby:2.2.2

ADD Gemfile /app/Gemfile
WORKDIR /app
RUN bundle install
ADD . /app //这句话置为更新语句后>-<

EXPOSE 9292
CMD rackup -E none


澳门新濠3559 11

原本的dockerfile

澳门新濠3559 12

现在的dockerfile文件

首先执行dockerfile进行构建,时间应该和之前的大致相同
$ time docker build -t showdependencies .

澳门新濠3559 13

修改后的Dockerfile构建

###########现在继续修改config.ru文件的内容改变应用程序的功能,+多少个other随意
$vim config.ru


app= proc do |env|
[200, {} , %w(hello other other other other docker)]
end
run app


澳门新濠3559 14

修改config.ru重新构建镜像,天啊撸!速度快得惊人!

澳门新濠3559 15

这就是速度!

#########不得不提的是,从输出的记录可以看到,docker build复用了Steps3中的缓存,这是因为对于Gemfile文件并没有改动

    dockerfile, 主要是四部分组成:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。

/opt/command/kevin_docker_files/01_nginx/Dockerfile/kevin_nginx_dockerfile.dockerignore

减少构建上下文大小(即使用dockerignore忽略一些文件)

澳门新濠3559 16

存在这样的一个文件夹

书中提到:假设我们在基于Git版本控制管理中有一个dockerfile文件,在当前文件夹中存在一个1001M大小的.git文件。当编译Docker镜像时会发现时间非常久,原因是在编译时docker客户端上传了整个.git文件夹,而仅仅是因为它在镜像的编译路径下!!!于是Docker守护进程花了大量的时间来接收这部分内容。
########不得不提的是,这些.git文件内容对于编译dockerfile镜像是无益的!这些Git相关的文件对于在生产环境中的应用是无用的,因此我们设定Docker去忽略掉一些文件:使用.dockerignore
于是在当前目录创建一个.dockerignore文件,加入以下内容:
.git

澳门新濠3559 17

add .dockerignore

然后重新编译镜像你回发现docker镜像编译的时间明显缩短!!
########编译时间至少提升了500倍以上, 同时减少了编译内容的大小
*(注:此处多处引用原文,望原文作者不要怪罪>_<)


澳门新濠3559 18

docker version: 1.13.1

改变dockerfile语序以复用缓存(即将dockerfile中含有update或者install的语句提前)

了解过dockerfile原理的宝宝们都知道:当我们在构建Dockerfile时,docker会检查dockerfile中正在处理的指令,判断在它的缓存机制中是否存在可以复用的镜像,而不是重复创建一个一样的镜像。通过改变语句如“RUN apt-get update”或者"RUN bundle install"或者“RUN yum -y update”等更新程序包等语句,对依赖库进行一次操作而为重复操作。在大多数情况下。我们更新的只是应用程序中的核心部分。
书中提到的是ruby的bundle更新,这里跟着书上一样进行实验:
$ mkdir ~/rubyapp
$ cd ~/rubyapp
然后需要创建三个文件
$vim config.ru


app= proc do |env|
[200, {} , %w(hello docker)]
end
run app

澳门新濠3559 19

config.ru文件



$vim Gemfile
source 'https://gems.ruby-china.org/'

gem 'rack'
gem 'nokogiri'

澳门新濠3559 20

Gemfile文件


$ vim Dockerfile
FROM ruby:2.2.2

ADD . /app
WORKDIR /app
RUN bundle install

EXPOSE 9292
CMD rackup -E none

澳门新濠3559 21

Dockerfile文件


澳门新濠3559 22

当前目录有三个文件

执行$ time docker build -t showdependencies .

澳门新濠3559 23

花费了将近3分钟

###########现在修改config.ru文件的内容改变应用程序的功能
$vim config.ru


app= proc do |env|
[200, {} , %w(hello other docker)]
end
run app


澳门新濠3559 24

只是改变了一行!!

在这里只是添加了“other”

澳门新濠3559 25

只是改变了一行语句!!

#######可以发现:尽管有一行代码发生了改变,但是还是需要在创建镜像的过程中为Docker镜像的每一次迭代执行bundle install命令,这样是很低效的~~~
书中提到,为了优化,我们改变语序,#########将准备应用程序依赖的更新部分的阶段从整个应用程序镜像架构中剥离出来

 

docker cluster : master 1 + data node 4

个人以为 编译时所花费的时间很大部分都是花在 更新镜像源这块(即获取上游镜像的过程中),特别是使用官方源(国外源)小编等的连死的心都有了-_-

然后记得:wq保存和退出vi。

二、材料准备

root >>> docker images

  1. 执行命令,顺序如下

root >>> docker build -t kevin_nginx/v1:latest -f /opt/command/kevin_docker_澳门新濠3559,files/kevin_nginx_dockerfile.dockerignore .

root >> docker build -f "/opt/command/kevin_docker_files/01_nginx/Dockerfile/kevin_nginx_dockerfile.dockerignore" -t "nginx/kevin.tian" .

附上代码,如下地址(下载后,请记得修改文件后缀.sh为.dockerignore)

# 注意:build命令结尾有个结束符号 英文句号“.",不要忘记,否则执行会提示错误少个参数。

 

一、测试环境

 

# 执行docker build命令,创建镜像,

最后,查看自己创建的镜像,使用如下命令(可以加参数过滤其他镜像)

root >> docker images

# Instruction
FROM centos

# LABLE info
LABEL vendor="itshare" 
      version="0.0.1-beta" 
      release-date="2018-09-02"

# Dockerfile execute command
RUN mkdir -p /opt/apt/
RUN touch /opt/apt/sources.list
RUN echo "kevin.tian installed nginx" >> /opt/apt/sources.list
# RUN yum update && yum install -y nginx
RUN apt-get update && apt-get install -y nginx
RUN echo "ndaemon off;" >> /etc/nginx/nginx.conf

# Container startup command
CMD /usr/sbin/nginx

如果对您有帮助,请帮我点赞,各位的支持也是我写作的动力,谢谢

# 查看本地的Docker镜像

step 2: 构建dockerfile镜像文件

OS version: CentOS Linux release 7.5.1804 (Core)

  1. dockerfile 文件,如下

 

编辑:操作系统 本文来源:创建镜像,build创建一个连续执行docker指令的自动

关键词: