《容器化开发竞赛培训》-4.erfile构建镜像_第1页
《容器化开发竞赛培训》-4.erfile构建镜像_第2页
《容器化开发竞赛培训》-4.erfile构建镜像_第3页
《容器化开发竞赛培训》-4.erfile构建镜像_第4页
《容器化开发竞赛培训》-4.erfile构建镜像_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《Docker容器技术与应用》Dockerile构建镜像

学习目标01

了解构建镜像的两种方法02

使用dockercommit命令基于容器构建镜像03

熟悉Dockerfile构建镜像的基本用法和主要的Dockerfile指令04

使用dockerbuild命令基于Dockerfile构建镜像对Docker用户来说,最方便的方式是使用已有的镜像。如果找不到合适的现有镜像,或者需要在现有镜像中加入特定的功能,则需要自己构建镜像。Docker提供了两种构建镜像的方法:一是基于容器生成镜像,二是通过Dockerfile构建镜像。描

述项目描述任

务分解tasks

01基于容器生成镜像

02

Dockerfile构建镜像

03Dockerfile文件指令任务1:

基于容器生成镜像01

基于容器生成镜像--任务说明理解dockercommit的实现原理使用dockercommit构建镜像

基于容器生成镜像—

实现原理•容器启动后是可写的,所有写操作都保存在顶部的可写层中。可以通过docker

commit命令将现有的容器进行提交来生成新的镜像。•具体的实现原理是通过对可写层的修改生成新的镜像。docker

commit命令的格式如下:docker

commit[选项]

<容器ID或容器名>

[<仓库名>[:<标签>]]docker

commit命令的常用选项如下。(1)

-a

:提交镜像的作者。(2)

-c

:使用Dockerfile指令来创建镜像。(3)

-m

:提交时的说明文字。(4)

-p:在提交时,将容器暂停。

dockercommit命令格式基于容器生成镜像—操作步骤基本步骤:

运行容器→修改容器→将容器保存为新的镜像。(1)运行容器——以交互方式启动centos容器。[root@host1

~]#docker

run

-it

--namec1

-hc1centos:7/bin/bash

(2)修改容器——在该容器中安装httpd服务。[root@c1/]#yumclean

all[root@c1/]#yum

-y

install

httpd[root@c1/]#vi/var/www/html/index.htmlhello[root@c1/]#httpd

-kstart[root@c1/]#exit[root@docker

~]#dockerexec

-itc1

httpd

-kstart退出容器后测试是否可以访问http服务。[root@docker

~]#curl

http://(3)提交容器为新镜像。先退出容器,再执行dockercommit命令将该容器提交并在本地生成新的镜像,然后查看该镜像的基本信息。[root@docker

~]#dockercommitc1

centos-httpd可以通过docker

history命令来进一步验证镜像的构建过程和镜像的分层结构(4)使用新镜像运行容器。[root@docker

~]#docker

run

-it

--namec2

-hceshicentos-httpd:latest(5)在新容器中启动服务,并测试。[root@c2/]#httpd

-kstart[root@docker

~]#curl

http://基于容器生成镜像—操作步骤《Docker容器技术与应用》下期见!基于容器生成镜像

实操演示

02

任务2:

Dockerfile构建镜像

Dockerfile构建镜像--任务说明理解Dockerfile命令格式使用Dockerfile构建镜像•

Dockerfile可以非常容易地定义镜像内容。

Dockerfile是由一系列指令和参数构成的脚本,每一条指令构建一层,因此每一条指令的内容就是描述该层应当如何构建,一个Dockerfile包含了构建镜像的完整指令。•镜像的定制实际上就是定制每一层所添加的配置、文件。•将每一层修改、安装、构建、操作的命令都写入一个Dockerfile脚本,使用该脚本

构建、定制镜像,可以解决基于容器生成镜像无法重复、构建缺乏透明性和体积偏大的问题。•创建Dockerfile之后,当需要定制自己额外的需求时,只需在Dockerfile上添加或者

修改指令,重新生成镜像即可。进一步了解Dockerfile

Dockerfile构建的基本用法•使用docker

build命令通过Dockerfile和构建上下文(Build

Context)构建镜像。docker

build

[选项]路径

|

URL

|

-•构建上下文是由文件路径或一个URL(

Git仓库位置)定义的一组文件。•

例:

使用当前目录作为构建上下文的简单构建命令如下。

docker

build

.•指令不区分大小写,建议大写。指令可以指定若干参数。•Docker按顺序执行其中的指令。

Dockerfile文件必须以FROM指令开头。

FROM指令之前唯一允许的是ARG指令(用于定义变量)

。•

以“#”符号开头的行都将被视为注释。•Dockerfile中需要调用的文件必须跟Dockerfile文件在同一目录下,

或者在其子目录

下,父目录或者其它路径无效。•编写Dockerfile文件要求尽可能精简。其目的是为了尽可能产生数目较少的中间层镜像。

Dockerfile格式•

Dockerfile格式#注释指令参数•基本步骤:准备构建上下文→编写Dockerfile→构建镜像。(1)准备构建上下文。建立一个目录用作Dockerfile的构建上下文并准备所需的文件。其中nginx.repo用于安装Nginx软件包的yum源定义文件,其内容与使用dockercommit命令基于容器构建镜像的示例相同。(2)编写Dockerfile文件。

Dockerfile构建镜像的操作步骤录Sending

buildcontextto

Dockerdaemon4.096kBStep

1/10:

FROMcentos:7#获取基础镜像---

>eeb6ee3f44bdStep2/10:

MAINTAINER“zqzhaoqing@126.com“#备注信息

---

>

Running

in710c3755aa1cRemoving

intermediatecontainer710c3755aa1c---

>e66c06b76babStep

3/10:

RUNyumclean

all

#清除缓存---

>

Running

in

361e899abc99Loaded

plugins:fastestmirror,ovlCleaning

repos:

baseextras

updatesRemoving

intermediatecontainer361e899abc99---

>0cbce0bf072f基于Dockerfile构建镜像(3)使用docker

build命令构建镜像。[root@controllerdockerbuild]#docker

build

-tcentos-httpd:v1.#最后点号表示构建上下文为当前目基于Dockerfile构建镜像Step4/10:

RUNyum

-y

install

httpd#安装httpd---

>

Running

inf43c33a0c252Loaded

plugins:fastestmirror,ovlComplete!Removing

intermediatecontainerf43c33a0c252---

>77adf5ffa165Step

5/10:ADD

run-httpd.sh/run-httpd.sh#将启动文件添加到镜像---

>74ea8c38c4dcStep6/10:

RUNchmod755/run-httpd.sh#为启动文件赋权限---

>

Running

in

3c6de5d1ff69Removing

intermediatecontainer3c6de5d1ff69---

>83b5c50b98aeStep7/10:ADD

index.html/var/www/html#将首页文件添加到镜像

---

>

54340987b983Step8/10:

EXPOSE80

#对外提供服务端口---

>

Running

in7eb4dcd26e47Removing

intermediatecontainer7eb4dcd26e47---

>

bd9fe1efce0fStep9/10:WORKDIR/#设置工作目录---

>

Running

infe77ad9abe22Removing

intermediatecontainerfe77ad9abe22---

>

b32f4e665228Step

10/10:CMD

["/bin/bash","/run-httpd.sh"]#运行启动文件---

>

Running

in4dc3c9b8ce0aRemoving

intermediatecontainer4dc3c9b8ce0a---

>9ca6ad88ba28Successfully

built9ca6ad88ba28Successfullytaggedcentos-httpd:v1基于Dockerfile构建镜像#成功完成镜像构建

#为镜像设置标签(4)使用创建的镜像启动容器[root@dockerdockerbuild]#docker

run

-d

-it

--named1centos-httpd:v1[root@dockerdockerbuild]#docker

inspectd1[root@dockerdockerbuild]#curl

http://[root@dockerdockerbuild]#curl

http://0基于Dockerfile构建镜像《Docker容器技术与应用》下期见!使用Dockerfile构建httpd镜像实操练习

03

任务3:

Dockerfile文件指令1、

FROM——设置基础镜像FROM

<镜像

>

[AS

<名称>]FROM

<镜像>[:<标签>]

[AS

<名称>]FROM

<镜像>[@<摘要值>]

[AS

<名称>]

Dockerfile常用指令•

例:FROM

centos:latest2.

MAINTAINER—设置备注maintainerMAINTAINER指令可以放置在Dockerfile命令的任意位置。该指令用于声明镜像作者,建议放在FROM指令之后。

MAINTAINER指令的格式如下。MAINTAINER

<name>例:

MAINTAINER

zhangsan@qq.comDockerfile常用指令

Dockerfile常用指令

3.

RUN—构建镜像时执行命令RUN指令是Dockerfile执行命令的核心部分,是用于在docker

build构建镜像中执行命令,它接收命令作为参数并用于创建镜像。

RUN指令有以下两种格式。格式1:

RUN

<命令

>例:RUN

echo

docker

>/var/www/html/index.html格式2:

RUN

["可执行程序",

"参数1",

"参数2"]例:RUN

["/bin/bash",

"-c",

"echo

docker

>/var/www/html/index.html"]

Dockerfile常用指令

注意:按优化的角度来讲:当有多条要执行的命令,不要使用多条RUN,尽量使用&&符号与\符号连接成一行。因为多条RUN命令会让镜像建立多层(总之就是会变得臃肿了)用于指定镜像构建时所要执行的命令。格式1:

CMD

["可执行程序","参数1","参数2"]格式2:

CMD

["参数1","参数2"]格式3:

CMD命令参数1参数2•

例:

CMD["/bin/bash","/run-httpd.sh"]4.

CMD—容器启动时要执行的命令•

CMD不同于RUN,CMD用于指定在docker

run容器启动时所要执行的命令,而RUN

Dockerfile常用指令•

注意:•每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,

则会覆盖掉CMD指定的命令。•

什么是启动容器时指定运行的命令?•

#docker

run

-d

-p80:80镜像名运行的命令•

CMD和RUN的区别——

P31

Dockerfile常用指令5、

ENTRYPOINT指令ENTRYPOINT与CMD非常类似。相同点:一个Dockerfile只写一条,如果写了多条,那么只有最后一条生效,而且都是容器启动时才运行。不同点:如果用户启动容器时候指定了运行的命令,

ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖。但是,如果运行docker

run时使用了--entrypoint选项,

则此选项的参数可当作要运行的程序覆盖

ENTRYPOINT指令指定的程序。格式如下:格式1:

ENTRYPOINT

<command>格式2:

ENTRYPOINT

["<executeable>","<param1>","<param2>",...]

Dockerfile常用指令•

Dockerfile指令的exec和shell格式•

exec格式的一般用法<指令

>

["可执行程序",

"参数1",

"参数2",

…]当指令执行时会直接调用命令,不会被shell解析。示例:ENV

nameTesterENTRYPOINT

["/bin/echo",

"Hello!

$name"]运行该镜像将输出以下结果。Hello!

$name其中的环境变量name没有被解析。采用exec格式要使用环境变量,可修改如下。ENV

nameTesterENTRYPOINT

["/bin/sh",

"-c",

"echo

Hello!

$name"]这样运行镜像将输出如下结果。Hello!Testerexec格式没有运行bash或sh的开销,

还可以在没有bash或sh的镜像中运行。使用DockerHub•

Dockerfile指令的exec和shell格式•

shell格式的一般用法

<指令

>

<命令

>指令执行时shell格式底层会调用/bin/sh–c语句来执行命令。示例:ENV

nameTesterENTRYPOINTecho

"Hello!

$name"运行该镜像将输出以下结果。Hello!Tester其中环境变量name已经被替换为变量值。CMD和ENTRYPOINT指令应首选exec格式,因为这样指令可读性更强,更容易理解。

RUN指令则两种格式都可以。如果使用CMD指令为ENTRYPOINT

指令提供默认参数,则CMD和ENTRYPOINT指令都应以JSON数组格式指定。使用DockerHub6、

EXPOSE——声明容器运行时侦听的网络端口EXPOSE

<端口

>

[<端口>

…]7、

ENV——指定环境变量ENV

<键

>

<值

>ENV

<键

>=<值

>

Dockerfile常用指令例:

ENVJAVA_HOME=/usr/local/jdkxxxx/

源路径必须位于构建上下文中,

不能使用指令COPY../something/something,因为docker

build命令

的第1步是发送上下文目录及其子目录到Docker守护进程中。

如果源是目录,则复制目录的整个内容,包括文件系统元数据。

如果源是任何其他类型的文件,

则它会与其元数据被分别复制。在这种情形下,

如果目的路径以斜杠(/)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论