一、dockerFile基础
1、镜像搭建流程
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库)
2、dockerFile文件构建步骤
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
3、dockerFile完整执行流程
Dockerfile 是软件的原材料。
Docker 镜像是软件的交付品。
Docker 容器则可以认为是软件镜像的运行态,即根据镜像运行的容器实例
DockerFile:dockerfile 涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务以及内核进程打交道的时候,还需要考虑如何设计 namespace 的权限控制)等等。
Dockerlmages:通过DockerFile构建生成的镜像,最终发布和运行的产品。
Docker容器:容器就是镜像运行起来提供服务的。
二、dockerFile参数
DockerFile的命令
FROM | 指定基础镜像。 |
| 指定维护着信息,已过期,可以使用 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、构建镜像文件
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 的路径为当前目录(当前目录即为 .
)
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"]