1、Dockerfile
Dockerfile是一个包含用于组合映像的命令的文本文档,可以使用在命令行中调用任何命令。
Docker通过读取Dockerfile中的指令自动生成映像。Dockerfile通常包含四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Docker通过从上到下的顺序运行Dockerfile的指令来构建映像。Dockerfile的常用指令包括FROM、MAINTAINER、RUN等。
用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行.还可以对官方镜像做扩展,以打包成我们生产应用的镜像。
2、Dockerfile的指令
Dockerfile的指令有很多种,这里简要说明一些常用的指令:
- FROM:指定基础镜像,所有有效的Docker镜像都可以作为基础镜像。
- MAINTAINER:用来指定维护该Dockerfile的作者信息。
- ENV:设置环境变量,可以被后面的指令使用。
- WORKDIR:指定当前工作目录,后续的指令都会在这个目录下执行。
- COPY:复制文件或目录到镜像中。
- ADD:更高级的复制文件,可以自动解压文件等。
- CMD:容器启动命令,用于指定默认的容器主进程的启动命令。
以上指令都是Dockerfile中常用的,具体的使用方法和参数可以在Docker官方文档中找到。
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的参数
镜像制作分为以下阶段
- docker build阶段 基于dockerfile制作镜像 (RUN,用于此阶段的运行命令)
- docker run阶段 基于镜像运行容器 (CMD,基于image run容器时候,需要运行的命令)
- 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构建的更多细节包括:
-
指令的执行顺序:Dockerfile中的指令会按照从上到下的顺序依次执行,因此指令的顺序很重要,需要考虑到每个指令对后续指令的影响。
-
镜像层的概念:每个Dockerfile指令都会创建一个新的镜像层,并在该层上进行操作。因此,Dockerfile中的每个指令都应该尽可能地精简,以减少镜像的大小和构建时间。
-
缓存机制:Docker在构建镜像时会使用缓存机制,如果某个指令已经执行过并且其结果没有变化,Docker会直接使用缓存的结果,而不是重新执行该指令。这可以提高构建效率,但也需要注意在某些情况下需要清除缓存以确保最新的结果被使用。
-
环境变量的使用:可以在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