【云原生-Docker】docker镜像制作、上传、dockerfile命令解析

news/2024/11/1 20:33:54/

场景

  • 在实际业务场景中,需要制作多个不同版本进行镜像使用,如maven版本、JDK、openJDK不同使用等,所以需要做多个针对不同版本做不同的镜像。
  • 这里记录一下之前devops用的openJDK版本、某些部门需要用orcle JDK、特此需要做不同的镜像,镜像内包含centos、maven、jdk。

镜像制作

基础镜像

  • 基础镜像拉去,如centos、alpine等
  • docker pull centos:7

jdk、maven

  • 拉取centos基础镜像,把jdk、maven镜像制作进基础镜像中,在使用centos:7作为基础镜像,配置jdk版本及maven版本,当拉取镜像时可以直接使用,在devops使用过程中,可以直接run进行启动使用。
  • dockerfile
FROM centos:7
MAINTAINER rundreams@yeah.netWORKDIR /usr/bin/jdk
WORKDIR /usr/bin/mvn
COPY apache-maven-3.8.6 /usr/bin/mvn
COPY jdk1.8.0_202 /usr/bin/jdkENV LANG=C.UTF-8
ENV JAVA_HOME=/usr/bin/jdk
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV MAVEN_HOME=/usr/bin/mvn
ENV PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
  • 然后下载maven、JDK版本在Dockerfile同级目录下,并配置Maven配置文件信息,如拉取仓库地址等
  • 在同级目录存在文件夹 apache-maven-3.8.6、jdk1.8.0_202
  • 基于进行可以根据要求选择,如果还有其他命令执行或者需要加入某些环境变量配置,可以参考后面的命令解析

构建镜像

  • 执行命令
docker build -f Dockerfile -t 镜像地址:版本 .

在这里插入图片描述

推送远程

docker push 镜像地址:版本

命令解析

  • 官方参考
  • https://docs.docker.com/engine/reference/builder/

FROM

  • 指定基础镜像,必须为第一个命令
格式:FROM <image>FROM <image>:<tag>FROM <image>@<digest>
示例:  FROM centos:7
注:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

RUN

  • 构建镜像时执行的命令
RUN用于在构建镜像时执行命令,其有以下两种命令执行方式:
shell执行
格式:RUN <command>
exec执行
格式:RUN ["executable", "param1", "param2"]
示例:RUN apk updateRUN ["/etc/execfile", "arg1", "arg1"]
注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定--no-cache参数,如:docker build --no-cache

ADD

  • 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:ADD <src>... <dest>ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:ADD hom* /mydir/          # 添加所有以"hom"开头的文件ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/

COPY

  • 类似ADD,但是是不会自动解压文件,也不能访问网络资源

CMD

  • 构建镜像后调用,也就是在容器启动时才进行调用。
格式:CMD ["executable","param1","param2"] (执行可执行文件,优先)CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)CMD command param1 param2 (执行shell内部命令)
示例:CMD echo "This is a test." | wc -lCMD ["/usr/bin/wc","--help"]注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

ENTRYPOINT

  • 配置容器,使其可执行化。
格式:ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)ENTRYPOINT command param1 param2 (shell内部命令)
示例:FROM centos:7ENTRYPOINT ["ls", "/usr/local"]CMD ["/usr/local/tomcat"]之后,docker run 传递的参数,都会先覆盖cmd,然后由cmd 传递给entrypoint ,做到灵活应用注:ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给CMD。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。通常情况下,	ENTRYPOINT 与CMD一起使用,ENTRYPOINT 写默认命令,当需要参数时候 使用CMD传参

LABEL

  • 用于为镜像添加元数据
格式:LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:LABEL version="1.0" description="ssd硬盘" by="rundreamsFly"
注:使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

ENV

  • 设置环境变量
格式:ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:ENV myName IversionENV myCat=demos

EXPOSE

  • 指定于外界交互的端口
格式:EXPOSE <port> [<port>...]
示例:EXPOSE 80 443EXPOSE 8080    EXPOSE 11211/tcp 11214/udp
注:  
EXPOSE并不会让容器的端口访问到主机。要使其可访问,
需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口如果没有暴露端口,后期也可以通过-p 8080:80方式映射端口,但是不能通过-P形式映射

VOLUME

  • 指定持久化目录(指定此目录可以被挂载出去)
格式:VOLUME ["/path/to/to"]
示例:VOLUME ["/data"]VOLUME ["/var/www", "/var/log/apache2", "/etc/apache/user"
注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:卷可以容器间共享和重用容器并不一定要和其它容器共享卷修改卷后会立即生效对卷的修改不会对镜像产生影响卷会一直存在,直到没有任何容器在使用它

WORKDIR

  • 工作目录,类似于cd命令
格式:WORKDIR /path/to/workdir
示例:WORKDIR /a  (这时工作目录为/a)WORKDIR b  (这时工作目录为/a/b)WORKDIR c  (这时工作目录为/a/b/c)
注: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

ARG

  • 相当于构建镜像时可以在外部为里面传参
格式:ARG <name>[=<default value>]
示例:ARG siteARG build_user=www
From centos:7
ARG parameter
VOLUME /usr/share/nginx
RUN yum -y install $parameter
EXPOSE 80 443
CMD nginx -g "daemon off;"# 可以这如下这样灵活传参
docker build --build-arg=parameter=net-tools -t nginx:1.14 . 

一图汇总

在这里插入图片描述

其他信息

源码编译制作nginx镜像

# This my first nginx Dockerfile
# Version 1.0# Base images 基础镜像
FROM centos#MAINTAINER 维护者信息
MAINTAINER bertwu #ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  #RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make installRUN echo "daemon off;" >> /etc/nginx.conf#EXPOSE 映射端口
EXPOSE 80#CMD 运行以下命令
CMD ["nginx"]

http://www.ppmy.cn/news/24612.html

相关文章

Android java创建子线程的几种方法

1.新建一个类继承自Thread&#xff0c;并重写run()方法&#xff0c;并在里面编写耗时逻辑。 1 2 3 4 5 6 7 class ThreadTest extends Thread { Override public void run() { //具体的耗时逻辑代码 } } new ThreadTest().st…

2023前端面试总结含参考答案

文章目录1. 父子组件生命周期的执行顺序:2. 原型链&#xff1a;3. promise的理解&#xff1a;4. 数组循环&#xff0c;foreach&#xff0c;filter&#xff0c;map&#xff0c;reduce5. 数组去重&#xff0c;set6. 组件通信方式7. 路由钩子8. 首页首屏加载优化&#xff1a;9. th…

一篇文章带你学会Ansible的安装及部署

目录 前言 一、什么是Ansible 二、Ansible的工作方式 三、Ansible的安装 四、构建Anisble清单 1、清单书写方式 2、清单查看 3、清单书写规则 4、主机规格的范围化操作 五、ansible命令指定清单的正则表达式 六、 Ansible配置文件参数详解 1、配置文件的分类与优先…

Linux基础笔记总结

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

「1」线性代数(期末复习)

&#x1f680;&#x1f680;&#x1f680;大家觉不错的话&#xff0c;就恳求大家点点关注&#xff0c;点点小爱心&#xff0c;指点指点&#x1f680;&#x1f680;&#x1f680; 第一章 行列式 行列式是一个数&#xff0c;是一个结果三阶行列式的计算&#xff1a;主对角线的乘…

SpringCloud Alibaba

文章目录&#x1f68f; 第十七章 SpringCloud Alibaba入门简介&#x1f6ac; 一、为什么使用Alibaba&#x1f6ad; 1、spring netflix进入维护模式&#x1f6ad; Spring cloud alibaba&#x1f6ac; 二、如何使用&#xff1f;&#x1f6ac; 三、版本对应&#x1f68f; 第十八章…

UART和RS232、RS485的联系和区别、以及对软件编程的影响

1、串口、UART、RS232、RS485概念的理解 (1)狭义上的串口&#xff1a;指的是串口协议&#xff0c;就是时序图、数据收发先后顺序等&#xff0c;是抽象出来的协议&#xff1b; (2)广义上的串口&#xff1a;指的是符合串口协议的接口&#xff0c;UART、RS232、RS485在实际工作中都…

(C语言)自定义类型,枚举与联合

问&#xff1a;1. 结构体在自引用的时候不能怎么样&#xff1f;可以怎么样&#xff1f;2. Solve the problems&#xff1a;自定义一个学生结构体类型&#xff0c;要包含姓名&#xff0c;性别&#xff0c;年龄&#xff0c;六科成绩&#xff0c;家乡&#xff08;也为结构体&#…