一、dockerFile基础

1、镜像搭建流程

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run运行镜像

4、docker push发布镜像(DockerHub、阿里云镜像仓库)

2、dockerFile文件构建步骤

1、每个保留关键字(指令)都是必须是大写字母

2、执行从上到下顺序执行

3、# 表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交!

3、dockerFile完整执行流程

dockerfile构建私有镜像_docker

Dockerfile 是软件的原材料。

Docker 镜像是软件的交付品。

Docker 容器则可以认为是软件镜像的运行态,即根据镜像运行的容器实例

DockerFile:dockerfile 涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务以及内核进程打交道的时候,还需要考虑如何设计 namespace 的权限控制)等等。

Dockerlmages:通过DockerFile构建生成的镜像,最终发布和运行的产品。

Docker容器:容器就是镜像运行起来提供服务的。


二、dockerFile参数

DockerFile的命令

FROM

指定基础镜像。

MAINTAINER

指定维护着信息,已过期,可以使用 LABEL xxx=yyy 来代替。

RUN

镜像构建过程中运行的命令。

CMD

指定启动容器时默认的命令。

ENTRYPOINT

指定镜像的默认入口以及运行命令 。

EXPOSE

声明镜像内服务监听的端口,一般而言,此指令只有指导意义,如:SpringBoot 项目的端口是 8080 ,而指定的 EXPOSE 是 8090 ,当然依据 8080 了。

ENV

指定环境变量,可以在 docker run 的时候使用 -e 改变。

ADD

复制指定的 src 路径下的内容到容器中的 dest 路径下,src 可以为 url 会自动下载,也可以为 tar 文件,会自动解压。

COPY

复制本地主机的 src 路径下的内容到镜像中的 dest 路径下,但是不会自动解压等等。

LABEL

指定生成镜像的元数据标签信息。

VOLUME

创建数据卷挂载点。

USER

指定运行容器时的用户名或 UID 。

WORKDIR

配置工作目录,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。

ARG

指定镜像内使用的参数(如版本号信息等),可以在 docker build 的时候,使用 --build-args 改变。

OBBUILD

配置当创建的镜像作为其他镜像的基础镜像是,所指定的创建操作指令。

STOPSIGNAL

容器退出的信号值。

HEALTHCHECK

健康检查。

SHELL

指定使用 shell 时的默认 shell 类型。

1、构建镜像文件

dockerfile构建私有镜像_docker_02

FROM centos:7.9.2009: 这是基础镜像的指令,指定了构建镜像所使用的基础镜像,该镜像为 CentOS 7.9.2009 版本。

WORKDIR /usr/local/java: 设置工作目录为 /usr/local/java

RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ... yum -y install curl: 使用 RUN 指令安装依赖项,包括更新系统、安装 wget、glibc.i686、vim、net-tools 和 curl。

2、 docker build  --no-cache --force-rm -t  mycentos .

--no-cache: 禁用构建过程中的缓存,每一步都会强制重新构建,适用于确保使用最新的依赖项或避免之前的缓存产生的问题。

--force-rm: 在构建过程中删除任何已创建的临时容器。这可以确保每次构建都从干净的环境开始,并且避免残留的临时容器占用空间。

-t 镜像名称:TAG: 指定要构建的镜像的名称和标签。请将 "镜像名称" 替换为你想要的实际镜像名称,将 "TAG" 替换为你想要的标签。例如:-t my-java-image:latest

.: 指定 Dockerfile 的路径为当前目录(当前目录即为 .

dockerfile构建私有镜像_docker_03

3、FROM

指定基于 alpine 镜像的 latest 标签FROM alpine


指定基于 alpine 镜像的 3.14 版本标签FROM alpine:3.14

使用自己构建的基础镜像,并指定别名为 baseFROM mybaseimage AS base

在构建镜像时,Docker 将基于指定的基础镜像来创建你的镜像


4、label

LABEL 用来标注镜像的一些说明信息,常常用来指定维护者的信息

下面的这种格式是可以的

LABEL multi.label1="value1" multi.label2="value2" other="value3"


5、run

每个 RUN 指令都会在一个新的镜像层中执行,并在该层中创建新的容器文件系统

在容器内执行 shell 命令RUN echo "Hello, World!"

安装软件包RUN apt-get update && apt-get install -y package-name

运行脚本文件RUN chmod +x script.sh RUN ./script.sh

执行可执行文件RUN ./myapp

设置环境变量RUN export MY_VAR=myvalue


6、ARG

ARG 指令用于定义构建参数,它允许你在构建过程中传递变量。构建参数可以在构建过程中由 docker build 命令传递,也可以在 Dockerfile 中使用默认值指定镜像内使用的参数(如版本号信息等),可以在 docker build 的时候,使用 --build-args 改变。

# 定义构建参数,指定默认值

ARG version=latest

ARG user=myuse

# 构建过程中传递构建参数

 docker build --build-arg version=1.0 --build-arg user=admin .

7、ENV

ENV 指令用于设置环境变量。环境变量可以在容器运行时被访问,用于配置应用程序或传递参数

设置单个环境变量 ENV MY_VAR myvalue

设置多个环境变量  ENV KEY1=value1 KEY2=value2 KEY3=value3

使用构建参数设置环境变量  ARG version ENV APP_VERSION=$version

可以使用 docker run -e name=value 修改 ENV 定义的环境变量


8、ADD

ADD 指令用于将本地文件或远程文件复制到容器中。它可以处理文件、目录、URL 

ADD 指令有自动解压缩功能。如果源文件是一个压缩文件,Docker 将自动解压缩它,并将解压缩后的内容复制到目标位置。

复制单个文件到容器中 ADD myfile.txt /app/myfile.txt

复制目录到容器中 ADD mydir /app/mydir

从 URL 下载文件到容器中  ADD https://example.com/file.txt /app/file.txt


9、COPY

COPY 指令用于将本地文件或目录复制到容器中

COPY 是容器中要复制到的目标路径。

复制单个文件到容器中  COPY myfile.txt /app/myfile.txt

复制目录到容器中 COPY mydir /app/mydir

如果目标路径 <dest> 不存在,则 Docker 会自动创建该目录。

如果 <src> 是一个目录,Docker 将复制整个目录到 <dest>,包括目录中的所有文件和子目录。

如果 <src> 是一个文件,Docker 将复制该文件到 <dest>

10、user

USER 指令用于设置运行容器时的用户名或用户 ID如果没有使用 USER 指令,默认情况下容器将以 root 用户身份运行

切换到非特权用户USER myuser  根据用户 ID 切换用户USER 1000 

11、workdir

WORKDIR 指令用于设置容器中的工作目录,即在容器中执行命令时的当前路径# 设置工作目录为 /app WORKDIR /app

# 设置工作目录为绝对路径 WORKDIR /path/to/mydir

# 使用相对路径设置工作目录 WORKDIR relative/dir

使用 WORKDIR 指令设置容器中的工作目录。这样,在容器中执行命令时,会自动在设置的工作目录下进行操作


12、VOLUME


volumeVOLUME 指令用于在容器中创建一个或多个挂载点,让容器可以持久化存储数据,同时也可以与宿主机或其它容器进行数据共享

# 创建一个挂载点 VOLUME /data # 创建多个挂载点 VOLUME /config /logs

VOLUME 指令创建的挂载点在容器中是空目录,但是如果在启动容器时使用了 -v 或 --mount 选项来指定了宿主机路径或数据卷容器,那么该挂载点将会映射到宿主机或数据卷容器的路径上。

容器中的数据将持久保存在挂载点中。因此,当容器被删除时,数据不会被删除,可以被其他容器或宿主机访问。

可以使用 docker run 命令的 -v 或 --mount 选项来指定宿主机路径或数据卷容器,并将其挂载到 VOLUME 指令创建的挂载点上

13、expose

 EXPOSE 指令用于声明容器运行时将监听的网络端口。

声明单个端口EXPOSE 8080

声明多个端口EXPOSE 80 443
声明端口同时指定协议EXPOSE 8080/tcp 8080/udp

EXPOSE 指令仅仅是一种标记,告诉用户容器将监听这些端口,而不会进行端口映射。

可以使用 docker run 命令的 -p 或 --publish 选项将主机的端口映射到容器中声明的端口上


14、CMD

CMD 指令用于设置容器启动时默认运行的命令和参数

# 使用 exec 格式 CMD ["nginx", "-g", "daemon off;"] 

 # 使用 shell 格式 CMD nginx -g "daemon off;"


#模板镜像

FROM centos:7.9.2009

# 工作目录

WORKDIR /usr/local/java

# 安装依赖

RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 \

   && yum clean all \

   && yum makecache \

   && yum -y update \

   && yum -y install wget \

   && yum -y install glibc.i686 \

   && yum -y install vim \

   && yum -y install net-tools \

   && yum -y install curl

# 下载 JDK 并解压  

RUN curl https://files-cdn.liferay.com/mirrors/download.oracle.com/otn-pub/java/jdk/8u121-b13/jdk-8u121-linux-x64.tar.gz | tar -xzC /usr/local/java/ --strip-components 1 \

   && ls -lah /usr/local/java/

# 设置环境变量

ENV JAVA_HOME=/usr/local/java

ENV JRE_HOME=$JAVA_HOME/jre

ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH

ENV PATH=$JAVA_HOME/bin:$PATH

# 启动命令

CMD ["java","-version"]