Dockerfile:由一系列脚本和参数构成的脚本,这些命令应用于基础镜像,并最终创建一个新镜像
命令:
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 镜像的创建者
EXPOSE 容器需要暴露的端口,容器启动时通过-p进行映射绑定
VOLUME 挂载点,创建一个从本地主机或其他容器的挂载点
ENV key value 设置环境变量
RUN command Dockerfile的核心部分,Build时执行(可以写多条)
ADD source_dir/file desc_dir/file 将宿主机的文件复制到容器内,(自动解压)
COPY source_dir/file 和ADD类似,当目标路径不存在时,自动创建,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
CMD 容器的启动命令,只允许有一条,当容器启动时指定运行命令时,会覆盖掉Dockerfile中的CMD命令
ENTRYPOINT 容器的启动命令,值允许有一条,可被docker run提供的–entrypoint参数覆盖
CMD、RUN的区别:
RUN是镜像Build的时候执行,用来预装软件和做配置使用;
CMD是镜像启动的时候执行的命令,
每个Dockerfile文件只能有一条CMD命令,如果有多条,只执行最后一条命令
ENTRYPOINT指令:
也是只能有一条.不和CMD一起使用。如果启动容器时不指定容器参数,则CMD和ENTRYPOINT指令无区别,如果有容器参数。CMD指定的命令会被docker run传递的容器参数覆盖,而ENTRYPOINT会将容器参数作为ENTRYPOINT指令的参数执行。
Dockerfile案例1:构建jdk1.8镜像
1、创建目录
mkdir /usr/local/dockerjdk8
cd /usr/local/dockerjdk8
2、上传jdk压缩包jdk-8u171-linux-x64.tar.gz
rz
3、创建Dockerfile
vim Dockerfile
FROM centos:7
MAINTAINER fanwenjian
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_171
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
4、使用Dockerfile创建镜像
docker build -t=‘jdk1.8’ . -- -t:指定镜像名 后面的点表示在当前文件夹中找Dockerfile文件
5、
FROM centos:7
MAINTAINER fanwenjian
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_171
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
构建Core镜像
FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /app
COPY . ./
RUN dotnet restore
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "FAN.Core2.dll"]
构建镜像:
docker build -t CorePublishImage .
运行容器:
docker run -it -p 5001:5001 CorePublishImage