Docker学习(九)-----Dockerfile定制镜像

Docker定制镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改

  • 1.从已经创建的容器中更新镜像,并且提交这个镜像
  • 2.使用Dockerfile指令来创建一个新的镜像

1.对于开发人员,可以为开发团队提供一个完全一致的开发环境
2.对于测试人员,可以直接拿开发时所构建的镜像测试
3.对于运维人员,在部署时,可以实现快速部署,移植

镜像的定制实际上就是定制每一层所添加的配置,文件。如果我们可以把每一层修改,安装,构建,操作的命令都写入一个脚本,用这个脚本来构建,定制镜像那么之前提及的无法重复的问题,镜像构建透明性的问题,体积的问题就都会解决,这个脚本就是Dockerfile

Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

Dockerfile常用命令

1.FROM

–指定基础镜像
基础镜像不存在会在Docker Hub上拉去(一般会是文件的第一个指令)
使用格式:
FROM<镜像>:[tag]
FROM<镜像>@digest[校验码]
当前主机没有此镜像时,会自动去官网HUB下载

2.MAINTAINER

–提供Dockerfile,制作者提供本人信息
[逐渐废弃]
LABLE --替代MAINTAINER
具体使用:
LABLE maintainer=“作者信息”

使用格式:

MAINTANIER ”xxx xxxx@aliyun.com“
LABLE maintainer="xxxx.com"
LABLE "com.example.vendor"="ACME Incorporated"
LABLE com.example.label-with-value="foo"
LABLE version="1.0"
LABLE description="This text illustrates\
that label-values can span multiple lines."

3.ENV

ENV指令可以用于为docker容器设置环境变量ENV设置的环境变量,可以使用docker inspect命令来查看。同时还可以使用docker run --env=来修改环境变量

具体用法
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/

4.USER

用来切换运行属主身份的,Docker默认是使用root,但若不需要,建议切换使用者身份,毕竟root权限太大了,使用上有安全的风险

5.WORKDIR

WORKDIR用来切换工作目录的
Docker默认的工作目录是/,只有RUN能执行cd命令切换目录,而且还只作用在当下下的RUN,也就是说每一个RUN都是独立进行的

如果想让其它指令在指定的目录下执行,就得靠WORKDIR。WORKDIR动作的目录改变是持久的,不用每个指令前都是用一次WORKDIR

WORKDIR /usr/local/tomcat/

6.VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
-卷
只能定义docker管理的卷
VOLUME /data/mysql 运行的时候会随机在宿主机的目录下生成一个卷目录

7.COPY

–把宿主机中的文件复制到镜像中去!
文件要在Dockerfile工作目录
src 原文件

  • 支持通配符
  • 通常相对路径

dest 目标路径

  • 通常绝对路径

8.ADD

类似于COPY命令

ADD将文件从路径<src>复制添加到容器内部路径<dest>
<src>必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url
<dest>是目标容器中的绝对路径,所有的新文件和文件夹都会创建UID和GID,事实上如果<src>是一个远程文件URL,那么目标文件的权限将会是
600

9.EXPOSE

为容器打开指定要监听的端口以实现与外部通信
使用格式:
EXPOSE 80/tcp 23/udp

不加协议默认位tcp

使用-P选项可以暴露这里指定的端口!
但是宿主的关联至这个端口的端口是随机的!

10.RUN

RUN指令是用来执行命令行命令的,由于命令行的强大能力,RUN指令在定制镜像时是最常用的指令之一。其格式有两种:

  • shell 格式:RUN<命令>,就像直接在命令行中输入的命令一样。刚才写的Dockerfile中的RUN指令就是这种格式
  • exec格式:RUN[“可执行文件”,“参数1”,“参数2”],这更像是函数调用中的格式
使用格式
RUN <command>
RUN ["<executable>","<param1>","<param2>"]

RUN就像shell脚本一样可以执行命令,那么我们是否就可以像shell脚本一样把每个命令对应一个RUN呢?比如这种:


RUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN wget http://download.redis.io/releases/redis-4.0.1.tar.gz
RUN tar xzf redis-4.0.1.tar.gz
RUN cd redis-4.0.1

Dockerfile中每一个指令都会建立一层,Run也不例外,每一个Run的行为,和刚才我们手动建立镜像的过程一样,新建立一层,在其上执行这些命令,执行结束后,commit这一层的修改,构成新的镜像
而上面的这种写法,创建了多层镜像,这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境,更新的软件包

Union FS 是有最大层限制的,比如AUFS,曾经是最大不得超过42层,现在是不得超过127层,上面的Dockerfile正确的写法应该是这样:

构建镜像Build

在Dockerfile文件所在目录执行:

docker build -t demo1 .

docker build命令进行镜像构建,其格式为:

docker build [选项] <上下文路径/URL/->
docker build -t demo1 . //.代表Dockerfile上下文路径

-t:指定要创建的目标镜像名
.:Dockerfile文件所在目录,可以指定Dockerfile的绝对路径

在这里我们指定了最终镜像的名称-t demo1,构建成功后,我们可以像之前运行tomcat那样来运行这个镜像,其结果会和tomcat一样。(如果有版本号名称:demo1:01)

案例一

需求:创建一个镜像(基于tomcat)里面要有一个index.html,并写入Hello qfnj Docker

1.在宿主机创建一空白目录

mkdir -p /usr/local/docker/demo1

2.在该目录下,创建一文件Dockerfile

vim Dockerfile

3.其内容为:

FROM tomcat
RUN echo "Hello qfnj Docker"

4.构建镜像

docker build -t demo1

5.运行镜像所在容器

docker run --rm --name demo1-8080 -p 8080:8080 -d demo1

访问浏览器即可成功访问

案例二

案例:基于上一个镜像(基于tomcat)
将ROOT内多余的文件都删除。只保留index.html

1.基于如上修改Dcokerfile

FROM tomcat //指定tomcat最新版本镜像
WORKDIR /usr/local/tomcat/webapps/ROOT/  //切换到该目录下
RUN rm -rf *   //将当前目录的文件都删掉
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/

WORKDIR用来切换工作目录的,而不是用RUN

2.构建镜像

docker build -t 镜像名 . //Dockerfile上下文路径

3.查看镜像列表docker images

如果镜像名称有<none>

4.删除虚拟镜像

docker image prune

案例三

案例:基于上一个镜像(基于tomcat)外部复制一个文件(图片),并复制到容器中并能访问

1.基于如上修改Dockerfile

FROM tomcat  //指定tomcat最新版本镜像
WORKDIR /usr/local/tomcat/webapps/ROOT/   //切换到该目录下
RUN rm -rf * //将当前目录的文件都删掉
COPY 1.png  /usr/local/tomcat/webapps/ROOT/
RUN echo 'Hello Dokcer'>/usr/local/tomcat/webapps/ROOT/index.html

2.构建镜像

docker build -t 镜像名 . //Dockerfile上下文路径
COPY格式:

· COY<源路径>...<目标路径>
· COY["<源路径1>",...<目标路径>"]
和RUN指令一样,也有两种格式,一种类似与命令行,一种类似与函数调用
COPY指令从创建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。比如:
COPY 1.png /usr/local/tomcat/webapps/ROOT/
<目标路径>可以使容器内的绝对路径。也可以是相对于工作目录的相对路径(工作目录可以用WORKDIR指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建确实目录
此外,还需要注意一点,使用COPY指令,源文件的各种元数据都会保留,比如读,写,执行权限,文件变更时间等,这个特性对于镜像定制很有用。特别是构建想问文件都在使用Git进行管理的时候

案例四

在实际开发中,利用Dokcerfile将一个war包生成镜像的Dockerfile

1.docker下创建项目工程名称

mkdir -p /usr/local/docker/qfjy_exam
cd /usr/local/docker/qfjy_exam

2.将桌面qfjy_exam.zip复制到访目录下

cp qfjy_exam-1.0-SNAPSHOT.zip

3.创建镜像文件Dockerfile

FROM tomcat   //引入基本镜像
WORKDIR /usr/local/tomcat/webapps/ROOT  //指定工作目录
RUN rm -rf * //删除指定目录的所有内容文件
COPY qfjy_exam-1.0-SNAPSHOT.zip /usr/local/tomcat/webapps/ROOT 复制到ROOT下
RUN unzip qfjy_exam-1.0-SNAPSHOT.zip //解压文件
RUN rm -rf qfjy_exam-1.0-SNAPSHOT.zip  //移除调多余的压缩包
WORKDIR  /usr/local/tomcat  //指定回工作目录

4.构建镜像

docker build -t qfjy_exam

5.进入镜像内查看

docker run -it qfjy_exam bash
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Apollo Docker Quick Start Files是用于在Docker容器中快速启动Apollo配置中心的文件集合。Apollo配置中心是携程框架部门开发的分布式配置管理平台,用于实现配置集中管理和动态配置更新的需求。 使用Docker容器来快速启动Apollo配置中心可以提高开发和部署的效率,方便跨平台和环境的使用。Apollo Docker Quick Start Files包含了配置中心的相关配置文件、Dockerfile和启动脚本等,使用这些文件可以快速构建和启动配置中心的Docker容器。 在启动Docker容器之前,我们需要先配置好Apollo配置中心的相关信息,在配置文件中指定数据库、端口等参数。然后,使用Docker命令构建Docker镜像并生成Docker容器,通过运行启动脚本,让Docker容器启动并运行Apollo配置中心。 通过使用Apollo Docker Quick Start Files,可以方便地在各种环境中部署和启动Apollo配置中心,提高系统的可维护性和可扩展性。同时,通过Docker的特性,我们可以更好地管理和监控配置中心的运行状态,更灵活地进行配置的更新和维护。 总之,Apollo Docker Quick Start Files提供了一种便捷的方式来快速部署和启动Apollo配置中心,使得我们能够更加高效地管理和使用分布式配置,提高系统的稳定性和可靠性。 ### 回答2: Apollo是一个分布式配置中心,用于管理和配置分布式系统中的应用程序的配置信息。Docker是一种容器化平台,可以将应用程序打包成容器,并在不同的环境中快速部署和运行。 Apollo-Docker-Quick-Start-Files是一个用于快速开始使用Apollo和Docker的文件集合。它包含了一系列的配置文件和脚本,可以帮助用户快速搭建Apollo配置中心和使用Docker部署应用程序。 在这个文件集合中,用户可以找到一些配置文件示例,如application.properties和meta-server.properties,这些文件定义了Apollo的配置中心和元数据服务器的相关配置信息。用户可以根据自己的需要进行修改和定制。 此外,还有一些脚本文件,如docker-compose.yaml和Dockerfile。这些文件用于定义Docker容器的构建和部署规则。用户可以使用docker-compose命令,根据docker-compose.yaml文件一键启动Apollo配置中心和应用程序的Docker容器。 使用Apollo-Docker-Quick-Start-Files,用户可以轻松地搭建Apollo配置中心和部署应用程序。它提供了一种快捷的方式,帮助用户快速入门并使用Apollo和Docker进行分布式系统的配置和部署管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce-li__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值