【Dockerfile】Dockerfile制作镜像与使用

本文详细介绍了Dockerfile的工作原理,包括其组成部分、常用指令如FROM、RUN、CMD和ADD的用法,以及镜像制作的原理和阶段。通过实例演示如何使用Dockerfile构建openjdk8镜像,并强调了指令顺序、镜像层和缓存机制的重要性。
摘要由CSDN通过智能技术生成

1、Dockerfile

Dockerfile是一个包含用于组合映像的命令的文本文档,可以使用在命令行中调用任何命令。
Docker通过读取Dockerfile中的指令自动生成映像。Dockerfile通常包含四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Docker通过从上到下的顺序运行Dockerfile的指令来构建映像。Dockerfile的常用指令包括FROM、MAINTAINER、RUN等。

用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行.还可以对官方镜像做扩展,以打包成我们生产应用的镜像。

2、Dockerfile的指令

Dockerfile的指令有很多种,这里简要说明一些常用的指令:

  1. FROM:指定基础镜像,所有有效的Docker镜像都可以作为基础镜像。
  2. MAINTAINER:用来指定维护该Dockerfile的作者信息。
  3. ENV:设置环境变量,可以被后面的指令使用。
  4. WORKDIR:指定当前工作目录,后续的指令都会在这个目录下执行。
  5. COPY:复制文件或目录到镜像中。
  6. ADD:更高级的复制文件,可以自动解压文件等。
  7. CMD:容器启动命令,用于指定默认的容器主进程的启动命令。

以上指令都是Dockerfile中常用的,具体的使用方法和参数可以在Docker官方文档中找到。

Docker Dockerfile——菜鸟教程

Docker 官方主页: https://www.docker.com
Docker官方博客: https://blog.docker.com/
Docker官方文档: https://docs.docker.com/

==================================

Docker 国内镜像
阿里云的加速器:https://help.aliyun.com/document_detail/60750.html

网易加速器:http://hub-mirror.c.163.com

官方中国加速器:https://registry.docker-cn.com

FROM 和 RUN 指令的作用

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

3、制作镜像的原理与阶段

  • 如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
  • 如果有多个CMD,只有最后一个运行
  • 如果有多个Entrypoint,只有最后一个运行
  • 如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数

镜像制作分为以下阶段

  1. docker build阶段 基于dockerfile制作镜像 (RUN,用于此阶段的运行命令)
  2. docker run阶段 基于镜像运行容器 (CMD,基于image run容器时候,需要运行的命令)
  3. docker build 基于第一阶段的镜像被别人from制作新镜像 (entrypoint 或onbuild 基于镜像重新构建新镜像时候在此阶段运行的命令)

4、Dockerfile使用:自制一个openjdk8镜像

先创建一个Dockerfile文件,然后vi编辑文件,里面

FROM ubuntu:18.04

RUN apt update -y
RUN apt install -y openjre-8-headless

EXPOSE 8080

完成编辑后,保存并退出vi编辑器。然后,在终端中使用以下命令构建镜像(假设你的Dockerfile名为"Dockerfile"):

docker build -t openjdk8-image .

这将根据Dockerfile构建一个名为"openjdk8-image"的镜像。完成后,可以使用以下命令运行该镜像:

docker run -p 8080:8080 openjdk8-image

这将运行一个容器,并将容器的8080端口映射到主机的8080端口,可以通过主机的8080端口访问应用程序(确保主机的8080端口未被占用)。

5、Dockerfile构建细节

Dockerfile构建的更多细节包括:

  1. 指令的执行顺序:Dockerfile中的指令会按照从上到下的顺序依次执行,因此指令的顺序很重要,需要考虑到每个指令对后续指令的影响。

  2. 镜像层的概念:每个Dockerfile指令都会创建一个新的镜像层,并在该层上进行操作。因此,Dockerfile中的每个指令都应该尽可能地精简,以减少镜像的大小和构建时间。

  3. 缓存机制:Docker在构建镜像时会使用缓存机制,如果某个指令已经执行过并且其结果没有变化,Docker会直接使用缓存的结果,而不是重新执行该指令。这可以提高构建效率,但也需要注意在某些情况下需要清除缓存以确保最新的结果被使用。

  4. 环境变量的使用:可以在Dockerfile中使用ENV指令来设置环境变量,这些环境变量可以在后续的指令中使用,也可以在运行容器时使用。

总之,Dockerfile构建需要考虑到指令的顺序、镜像层的概念、缓存机制和环境变量的使用等细节,以确保构建的镜像符合预期并且高效。

常用的Dockerfile的完整命令

FROM yolo01/openjdk:8-test

COPY target/springdocker-1.0.1-SNAPSHOT.jar /opt

EXPOSE 8080

ENTRYPOINT ["sh","-c","java -jar /opt/springdocker-1.0.1-SNAPSHOT.jar"]
FROM ubuntu:18.04

RUN apt update -y
RUN apt install -y openjdk-8-jdk-headless

EXPOSE 8080
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值