Dockerfile

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Docker系列文章:此篇是Docker系列的第五篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油!• 为什么要学习Docker• Docker基本概念• Docker镜像基本原理• Docker容器数据卷

一、前言


Docker系列文章:

此篇是Docker系列的第五篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油!


二、什么是DockerFile


Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系。Docker程序将读取Dockerfile,根据指令生成定制的镜像(Image)。相比镜像这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确镜像是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成镜像即可,省去了敲命令的麻烦,每次增加一条命令就相当于在镜像的基础增加一层。


三、Dockerfile基本结构



Dockerfile一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,每一行只支持一条指令,每条指令可以携带多个参数。

四、Dockerfile指令介绍


关于每个核心指令我都做自己学习时候可执行指令,大家耐心看,可以将指令拷贝执行一下,感悟会更加深刻。

FROM(指定基础镜像)

指定基础镜像,必须为第一个命令;后续的指令都依赖于该指令指定的镜像。FROM指令指定的基础镜像可以是官方远程仓库中的,也可以位于本地仓库。

#使用
FROM <image>
FROM <image>:<tag>
#demo
FROM mysql:5.7
#解释
tag是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER(用来指定镜像创建者信息)

构建指令,用于将镜像制作者相关的信息写入到镜像中。当我们对该镜像执行docker inspect命令时,输出中有相应的字段记录该信息。

#使用
MAINTAINER <name>
#demo
MAINTAINER wtz wtz@163.com
RUN(构建镜像时执行的命令)

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:

#shell执行方式
#使用
RUN <command>
#demo
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz 
#exec执行方式
#使用
RUN ["executable", "param1", "param2"]
#demo
RUN ["/etc/execfile", "arg1", "arg1"]
#备注
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
ADD(添加文件)

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget;

#使用
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
#demo
ADD test.txt /test/    #添加test文件到 /test/
COPY(拷贝文件)

拷贝文件,不会自动解压文件,也不能访问网络资源;

CMD(构建容器后调用)

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。后面这两点一定要注意,我做了一些对应的demo,大家可以参考一下。

#支持三种格式:
#使用exec执行,推荐方式;
CMD ["executable","param1","param2"]
#在/bin/sh中执行,提供给需要交互的应用;
CMD command param1 param2
#提供给ENTRYPOINT的默认参数;
CMD ["param1","param2"]
  1. CMD使用demo
#编写dockerfilecmdtest
vim dockerfilecmdtest
FROM centos
CMD ["ls","-a"]
#构建镜像
docker build -f dockerfilecmdtest -t centoscmdtest .
#查看镜像
docker images
#启动镜像
docker run 8000ab3673ac

  1. 验证用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令;
#启动镜像时候执行-l 查看详细的文件内容 
docker run 8000ab3673ac -l

#我们执行一个 ls -al 发现就可以执行
docker run 8000ab3673ac ls -al

  1. 如果CMD指定了多条命令,只有最后一条会被执行;
#编辑dockerfilecmdtest
vim dockerfilecmdtest
#增加一条
CMD echo "This is a test."
#构建镜像
docker build -f dockerfilecmdtest -t centoscmdtest .
#查看启动镜像
docker iamges
docker run 86f69e6e6cbe

ENTRYPOINT(构建容器后调用)

类似于CMD指令,配置容器启动后执行的命令,并且不被docker run提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

可以搭配CMD命令使用:变参会使用CMD ,这里的CMD等于是在给ENTRYPOINT传参。

#支持两种格式
#使用exec执行
ENTRYPOINT ["executable", "param1", "param2"]
#shell中执行
ENTRYPOINT command param1 param2
  1. ENTRYPOINT使用demo并且验证ENTRYPOINT提供的参数不被docker run提供的参数覆盖;
#编写dockerentrypointtest
vim dockerentrypointtest
FROM centos
ENTRYPOINT ["ls","-a"]
#构建镜像
docker build -f dockerentrypointtest -t dockerentrypointtest .
#启动镜像
docker images
docker run 1ff15d1bff30 -l
#删除镜像
docker rmi 1ff15d1bff30

  1. 搭配CMD命令动态传递参数;
#编辑dockerentrypointtest
vim dockerentrypointtest
FROM ubuntu  
CMD ["-a"]  
ENTRYPOINT ["/usr/bin/ls"] 
#启动容器
docker run 601d1c5b2cdd

ENV(设置环境变量)

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。容器启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。

#使用
ENV <key> <value>
EXPOSE(指定于外界交互的端口)

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

#使用
EXPOSE <port> [<port>...]
VOLUME(指定支持化的目录)

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放需要持久化的数据。Volume设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用;

#使用
VOLUME ["<mountpoint>"]
WORKDIR(切换目录)

设置指令,可以多次切换(相当于cd命令);

#格式
WORKDIR /path/to/workdir
USER(指定用户)

指定运行容器时的用户名或UID,默认是root,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户;

#使用
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group

五、实战


创建一个自带tomcat的centos镜像;

  1. 编辑DockerFile;
#编辑文件centostomcat
vim centostomcat
#基础镜像
FROM centos
#作者
MAINTAINER wtz "171776704@qq.com"
#拷贝文件当前目录文件到/usr/local/中
COPY test.txt  /usr/local/test.txt
#拷贝当前目录下的文件tomcat和jdk到/usr/local/并解压
ADD jdk-8u141-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.46.tar.gz /usr/local/
#安装vim
RUN yum -y install vim
#生命变量
ENV INSTALLPATH /usr/local
WORKDIR $INSTALLPATH
#配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_141
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/$CLASSPATH
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.46
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.46
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA/bin
#对外暴露8080端口
EXPOSE 8080
#启动tomact 并查看日志
CMD /usr/local/apache-tomcat-9.0.46/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.46/logs/catalina.out
  1. 构建镜像;
docker build -f centostomcat -t dockerfiletomcat .


  1. 启动镜像,访问8088端口,发现tomact已经启动起来了;
docker run -d  -it --name tomcattest -p 8088:8080 dockerfiletomcat
curl localhost:8088

  1. 进入镜像内部检查/usr/local目录下是否存在test.txt文件,是否安装Java;
#进入镜像
docker exec -it 141eec62a29a /bin/bash
ls
java -version

相关文章
|
缓存 Kubernetes 开发者
Gitlab Runner的分布式缓存实战
配置兼容S3的分布式缓存minio,在k8s环境支持Gitlab CI脚本的缓存语法
313 1
Gitlab Runner的分布式缓存实战
|
Oracle 关系型数据库 Linux
Virtualbox上安装Linux系统(CentOS7)(图文超详细)
Virtualbox上安装Linux系统(CentOS7)(图文超详细)
4307 1
|
11月前
|
应用服务中间件 nginx Docker
Dockerfile
【11月更文挑战第01天】
145 10
|
10月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
1245 5
|
12月前
|
存储 前端开发 Java
springboot整合最新版minio和minio的安装(完整教程,新人必看)
本文详细介绍了如何使用Docker安装配置最新版的MinIO,并展示了如何在Spring Boot应用中整合MinIO以及如何通过前端进行文件上传测试。
1240 3
springboot整合最新版minio和minio的安装(完整教程,新人必看)
|
Ubuntu Shell Docker
Dockerfile
Dockerfile 可以通过以下步骤进行: 1. 了解 Dockerfile 的基本概念:Dockerfile 是用于构建 Docker 镜像的文本文件,它包含了构建 Docker 镜像所需的指令。了解 Dockerfile 的基本概念有助于更好地理解 Dockerfile 的作用和用途。
127 2
|
11月前
|
Ubuntu
Ubuntu禁止内核自动更新
通过上述步骤,您可以在Ubuntu系统中有效地禁用内核的自动更新。这些步骤包括锁定内核版本、禁用自动更新配置、移除不需要的内核包以及禁用相关的自动更新服务。这样可以确保系统在内核层面保持稳定,避免因内核自动更新导致的不必要问题。
2411 1
|
弹性计算 固态存储 大数据
阿里云服务器租用费用:一年、1个月和1小时价格表(2024真优惠)
2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年82元,折合6.8元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器298元一年,2核4G服务器30元3个月,4核16G10M服务器70元1个月、210元3个月,8核32G服务器160元1个月、480元3个月,阿小云整理阿里云服务器租用费用价格表,包括一年优惠价格、一个月和1小时收费明细表
7035 0
|
消息中间件 运维 安全
大搜车:云上多地域高可用消息系统的构建
大搜车利用云上MQTT+消息队列RocketMQ+全球消息路由+消息队列Kafka构建了完整的云上消息系统。
3663 107
大搜车:云上多地域高可用消息系统的构建
|
存储 SQL 人工智能
ClickHouse创始人:融合数据库该“卷”的还是性能和速度
在刚刚结束的阿里云瑶池数据库峰会上,阿里云宣布与全球流行的开源分析型数据库 ClickHouse 正式签订战略合作协议,成为 ClickHouse 在中国独家的云服务提供商,并提供具备独有企业能力的 ClickHouse 版本。借此机会,王一鹏有幸独家专访了 ClickHouse 创始人兼 CTO Alexey Milovidov、阿里云数据库事业部 OLAP 产品部负责人林亮,围绕 ClickHouse 演进迭代的历程、双方此次合作的契机、当前数据库技术所面临的挑战和机遇,以及 OLAP 数据库未来发展趋势等问题展开深度对谈。
59087 3
ClickHouse创始人:融合数据库该“卷”的还是性能和速度