当前位置: 代码网 > it编程>开发工具>Docker > 【云原生-Docker】docker镜像制作、上传、dockerfile命令解析

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

2024年08月06日 Docker 我要评论
【代码】【云原生-Docker】docker镜像制作、上传、dockerfile命令解析。

场景

  • 在实际业务场景中,需要制作多个不同版本进行镜像使用,如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.net

workdir /usr/bin/jdk
workdir /usr/bin/mvn
copy apache-maven-3.8.6 /usr/bin/mvn
copy jdk1.8.0_202 /usr/bin/jdk

env 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 镜像地址:版本

命令解析

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 update
    run ["/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 -l
    cmd ["/usr/bin/wc","--help"]

注:cmd不同于run,cmd用于指定在容器启动时所要执行的命令,而run用于指定镜像构建时所要执行的命令。

entrypoint

  • 配置容器,使其可执行化。
格式:
    entrypoint ["executable", "param1", "param2"] (可执行文件, 优先)
    entrypoint command param1 param2 (shell内部命令)
示例:
    from centos:7
    entrypoint ["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 iversion
    env mycat=demos

expose

  • 指定于外界交互的端口
格式:
    expose <port> [<port>...]
示例:
    expose 80 443
    expose 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 site
    arg 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 install

run echo "daemon off;" >> /etc/nginx.conf

#expose 映射端口
expose 80

#cmd 运行以下命令
cmd ["nginx"]
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com