版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海底捞内部员工制度
- 炼油厂内部工作制度范本
- 煤矿内部事故汇报制度
- 煤矿开采内部控制制度
- 环保公司内部管理制度
- 环评公司内部考核制度
- 监理内部会议制度
- 监理部内部安全管理制度
- 科学公司内部管理制度
- 科技公司内部考核制度
- 1.3“开元盛世”与唐朝经济的繁荣 课件(内嵌视频) 2025-2026学年统编版七年级历史下册
- 特种设备作业人员资格复审申请表
- 2026年吉安幼儿师范高等专科学校单招职业适应性考试题库附答案详解(夺分金卷)
- 2024-2025学年人民版四年级劳动下册全册教案设计
- 2026年春季开学教职工会议校长讲话:以改革之剑破局以实干之力育人
- 2026年部编本三年级下册《23.暴风雨来临之前》教案设计
- XX中学2026年春季学期“开学第一课”主题班会活动方案
- 2026年人教版三年级下册数学全册教学设计(春改版教材)
- 2026秋招:重庆农商行笔试题及答案
- 产品研发流程规范与指导(标准版)
- 初中音乐学业水平考试复习资料
评论
0/150
提交评论