「伸手摘星,即使一无所获,亦不致满手污泥」。
「请关注公众号:星河之码」
一般我们都使用的Docker中央仓库中已经存在的镜像,当时当我们需要使用自定义镜像,或者对已有镜像的功能做升级的时候,就需要构建新的镜像,DockerFile就是用来做这件事的。
Docker r 创建镜像主要有三种方式
-
「基于已有的镜像创建镜像」 -
「基于 Dockerfile 来创建镜像」 -
「基于本地模板来导入镜像」
第三种基本不会使用,本文主要介绍一下基于已有的镜像创建和重点介绍基于 Dockerfile 来创建镜像
一、基于已有的镜像创建镜像
基于已有的镜像创建镜像主要是通过 「docker commit :从容器创建一个新的镜像」
-
「语法」
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
常用参数
参数 说明 -a 提交的镜像作者 -c 使用Dockerfile指令来创建镜像 -m 提交时的说明文字 -p 在commit时,将容器暂停
下面以一个结合docker cp命令自定义tomcat的index页面的案例演示一下
-
「启动容器」
docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine
这里的镜像是在我的私服上拉取,要先搭建自己私服,搭建过程可以参考《Docker的中央仓库,Docker私服搭建》
-
「修改index页面」
cd /data
echo "Edwin index" > /data/index.jsp -
「将修改cp到容器」
docker cp /data/index.html tomcat:/usr/local/tomcat/webapps/ROOT/index.jsp
-
「将修改commit」
docker container commit -m "update index.jsp file" -a "edwin" tomcat 192.168.242.128:5000/edwinedu/tomcat:v1
-
「将修改推送到私服」
# 推送之前记得先登录:docker login -u admin -p Harbor12345 192.168.242.128:5000
docker push 192.168.242.128:5000/edwinedu/tomcat:v1 -
「在私服查看推送的镜像」
-
「删除容器中的tomcat镜像」
docker rm -f tomcat
-
「重新启动私服中V2版本的镜像」
docker run -itd --name tomcat -p 8080:8080 192.168.242.128:5000/edwinedu/tomcat:v1
-
「访问tomcat」
http://192.168.242.128:8080
上述介绍了commit命令的用法,显然还是有点麻烦的,一般也用的比较少,接下来看卡Dockerfile是如何构建镜像的。
二、Dockerfile
2.1、什么是Dockerfile
「Dockerfile其实就是我们用来构建Docker镜像的源码,跟编程源码不同,它本质上一些命令的集合」,有自己的逻辑和语法格式。Dockerfile可以让用户个性化定制Docker镜像满足实际的需求。总结下来主要是以下三点
-
「Dockerfile 是 Docker 中用于定义镜像自动化构建流程的配置文件」 -
「在 Dockerfile 中,包含了构建镜像过程中需要执行的命令和其他操作」 -
「Dockerfile 可以明确设定 Docker 镜像的制作过程,帮助我们在容器体系下能够完成自动构构建」
2.2、为什么要用 Dockerfile
-
Docker Images 可以通过 DockerFile 直接构建生成的镜像,最终发布和运行产品 -
Dockerfile 是面向开发的,Docker Images 可以通过 DockerFile 文件直接应用于项目发布,制作镜像等 -
DockerFile 定义了构建镜像文件的一切步骤,源代码,能够直观的看到镜像构建的顺序和逻辑 -
Dockerfile 的体积小,容易进行快速迁移部署
2.3 使用 Dockerfile 构建镜像的步骤
-
编写一个 dockerfile 文件 -
docker build 将dockerfile文件构建成为一个镜像 -
docker run 运行镜像 -
docker push 发布镜像(发布到私服:DockerHub 、harbor)
2.4 Dockerfile的基本结构
「Dockerfile是一个包含用于组合镜像的命令的文本文档,可以使用在命令行中调用任何命令」。
-
「Docker通过从上到下的顺序读取运行Dockerfile中的指令自动生成镜像」
-
Docker build命令用于从Dockerfile构建镜像像
「在docker build命令中使用 -f 标志指向文件系统中任 何位置的Dockerfile」
-
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行
-
Dockerfile分为四部分
-
「基础镜像信息」 -
「维护者信息」 -
「镜像操作指令」 -
「容器启动时执行指令」 -
「Dockerfile常见命令」
Dockerfile第一条指令必须是FROM,常见命令如下
一个声 明以 # 字符开头则被视为注释。
可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指 令。
命令 说明 FROM 指定基础镜像,必须为第一个命令 MAINTAINER 维护者(作者)信息 ENV 设置环境变量 RUN 构建镜像时执行的命令 CMD 构建容器后调用,也就是在容器启动时才进行调用。 ENTRYPOINT 指定运行容器启动过程执行命令,覆盖CMD参数 ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖 ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递 给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆 盖前面的设置,而只执行最后的ENTRYPOINT指令。 ADD 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压), 可以访问网络资源,类似wget COPY 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 WORKDIR 工作目录,类似于cd命令 ARG 用于指定传递给构建运行时的变量 VOLUMN 用于指定持久化目录 EXPOSE 指定于外界交互的端口 USER 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指 定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理 员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
2.5 Docker build命令
「docker build 命令用于使用 Dockerfile 创建镜像」。Dockerfile文件记录了构建Docker镜像过程,而Docker build就是用于将Dockerfile 构建成镜像
-
「官网」
https://docs.docker.com/engine/reference/builder/
-
「语法」
docker build [OPTIONS] PATH | URL | -
常见参数
参数 说明 –build-arg=[] 设置镜像创建时的变量 -f 指定要使用的Dockerfile路径 –rm 设置镜像成功后删除中间容器 –tag, -t 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置 多个标签 「注意:当我们使用命令时,需要在最后加一个点,表示当前文件夹下执行DockerFile」
docker build DockerFile .
2.6 Dockerfile案例
这里我使用两个案例来演示Dockerfile,第一个以已有镜像为基础修改一些内容,第二个自己编写简单的DockerFile
-
「案例一:修改已有镜像」
此案例以mysql为例,修改mysql中的时区为东八区,Dockerfile文件用Idea编写
# 指定基础镜像,必须为第一个命令
FROM mysql:5.7.31
# 维护者(作者)信息
MAINTAINER mysql from date UTC by Asia/Shanghai "edwin"
#设置环境变量 TZ 时候修改时区的固定写法
ENV TZ Asia/Shanghai -
「上传Dockerfile」
-
「构建镜像」
下面命令中192.168.242.128:5000/edwinedu/ 是我的私服地址,如果不添加私服可以不加,直接使用 docker build -t mysql:5.7 .
docker build -t 192.168.242.130:5000/edwinedu/mysql:5.7 .
「可以看到上述build命令没有指定Dockerfile文件名,这是因为后面加了一个点,会默认在当前目录下寻找一个叫Dockerfile的文件」
-
「推送镜像到私服」
docker push 192.168.242.128:5000/edwinedu/mysql:5.7
-
「编写Dockerfile」 -
「案例二:通过DockerFile构建新的镜像」
这个案例就是简单的读取一个文本,间隔一秒输出一次,这个案例分为两步
-
「app.properties」
count = 5
-
「Dockerfile」
# 指定基础镜像,必须为第一个命令
FROM ubuntu
# 维护者(作者)信息
MAINTAINER "edwin"
ADD ./app.properties /usr/bin
ENTRYPOINT count=$([ -f "/usr/bin/app.properties" ] && grep -P "^s*[^#]?count=.*$" /usr/bin/app.properties | cut -d'=' -f2); echo $count; for i in $(seq 1 $count); sleep 1; do echo $i; done; -
「上传」
将上述两个文件上传到同一目录下
-
「构建镜像」
#这里的-t 192.168.242.128:5000/edwinedu/edwin-dockerFile:v1 我是把它加到私服里面去,没有私服可以不用 注意命令后面的 .
docker build -t 192.168.242.128:5000/edwinedu/edwin-dockerFile:v1 -f Dockerfile . -
「执行镜像」
# docker build执行成功后,会返回Id
docker run 容器Id -
「上传私服」
#没有私服可以不用执行
docker push -t 192.168.242.128:5000/edwinedu/edwin-dockerFile:v1 -
编写一个配置文件app.properties -
编写Dockerfile制作镜像,执行一个输出脚本
原文始发于微信公众号(星河之码):Dockerfile
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/60792.html