选择基础镜像
FROM nginx:1.21.1 //使用nginx作为基础镜像
FROM JDK1.8 //使用jdk1.8作为基础镜像
创建镜像
docker image build -t <自定义镜像名称> .
通过RUN执行命令(linux指令)
文件的复制以及目录操作
WORKDIR:进入容器内的某个目录下
构建参数和环境变量
ARG变量,只能在镜像构建时使用(多用于构建镜像时,应用的版本)
ENV变量,可以在构建镜像以及启动容器时使用(多用于容器运行后,内部程序还需再次调0用env变量)
CMD
可以用来设置容器启动时默认会执行的命令(对容器执行,而不是对镜像内程序执行)
1、容器启动时默认执行的命令
2、如果docker run启动容器时指定了其他命令,则再Dockerfile内的cmd指令会失效
3、如果定义多个cmd,只有最后一个被执行
docker system prune -f (将已经退出的容器全部删除)
docker image prune -a(将没被容器使用的镜像删除)
docker run --rm (在容器退出后自动删除)
ENTRYPOINT
也是设置容器启动时要执行的命令。
cmd在docker run时传入其他命令,会被覆盖。
而ENTRYPOINT则不会,会优先执行dockerfile中的命令,进而执行docker run后的命令
合理使用缓存
尽可能将一些经常需要改变的命令,放在最后几行。
因为当某一行命令发生改变或所需要执行的文件发生改变,cache将会失效,之后的几行cache也会失效。
DockerIgnore
与gitignore功能相同,打包镜像时,如果使用复制文件操作,会把目标文件当前文件夹下其他无关文件同样打包,这时就需要dockerignore来忽略其他文件。
Docker多阶段构建技巧
FROM gcc:9.4 AS builder #搭建c语言环境,并将该镜像起别名为builder
COPY hello.c /src/hello.c #将本地hello.c源文件拷贝到镜像里/src/hello.c
WORKDIR /src #进入镜像src文件夹下
RUN gcc --static -o -hello hello.c 将hello.c源文件编译成为hello
FROM alpine:3.13.5. #搭建C语言运行环境
COPY --from=builder /src/hello /src/hello # --from=builder代表从别名为builder镜像的/src/hello文件到当前镜像到/src/hello
ENTRYPOINT ["/src/hello"]
CMD[]
执行该dockerFile,最终会打包成两个镜像
适用于需要多环境语言程序的运行