4

Dockerfile详解 - Akai-yuan

 1 year ago
source link: https://www.cnblogs.com/akai-yuan/p/17084782.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文基于应用容器引擎-Docker继续讲解DockerFile的有关知识。在学习完Dockerfile的知识后,你可以自己独立部署一个前后端分离的项目,具体部署操作可以浏览我之前的博客:部署实战-Docker+nginx部署前后端分离项目
@Author:Akai-yuan
@更新时间:2023/2/2

1.Dockerfile是什么

Dockerfile 是一个用来构建镜像的文本文件
我们直接从仓库获取的镜像可能很多时候是不满足我们的需求,比如你有这个需求场景:部署你的SpringBoot项目:

1.基于JDK1.8的镜像
2.需要将自己的jar等文件放到镜像目录
3.运行镜像后需要启动SpringBoot项目

这时候如果直接从仓库获取镜像,然后运行成容器,并进入容器部署自己的项目,这一列操作就非常麻烦。
而如果有的Dockerfile,则可以一次性生成满足你需求的自有镜像。

2.Dockerfile构建镜像示例

以下示例将展示:如何构建一个基于JDK1.8的SpringBoot项目

1、添加一个目录

例如:/usr/local/dockerfile

2、添加Dockerfile文件

在上面的目录下创建一个Dockerfile文件,文件名最好使用Dockerfile,这样生成镜像的命令就不用指定文件了,文件内容如下:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY *.jar demo.jar
ENTRYPOINT ["java","-jar","/demo.jar"]

3、将Jar包放到目录下

可以使用Idea连接远程服务器,也可以通过Xftp上传,或者在Xshell中执行rz指令
关于linux中的rz命令:

rz [选项]

选项说明:
-+, --append:将文件内容追加到已存在的同名文件
-a,--ascii:以文本方式传输
-b, --binary:以二进制方式传输,推荐使用
--delay-startup N:等待N秒
-e, --escape:对所有控制字符转义,建议使用
-E, --rename:已存在同名文件则重命名新上传的文件,以点和数字作为后缀
-p, --protect:对ZMODEM协议有效,如果目标文件已存在则跳过 -
-q, --quiet:安静执行,不输出提示信息
-v, --verbose:输出传输过程中的提示信息
-y, --overwrite:存在同名文件则替换
-X, --xmodem:使用XMODEM协议
--ymodem:使用YMODEM协议
-Z, --zmodem:使用ZMODEM协议
--version:显示版本信息
--h, --help:显示帮助信息

但是其实博主在使用rz命令从客户端上传文件到服务端时,经常会遇到上传异常中断,然后生成乱码文件,此时还需要rm -rf 文件名清除掉指定文件。所以其实能用Xftp的话还是尽量避免使用rz。

4、生成镜像

docker build -t 镜像名称:标签名 .

docker build -t demo:v1 .

生成完成之后,查看本地镜像:

docker ps

以上就是一个简单的Dockerfile构建镜像的示例

3.Dockerfile构建命令详解

1.FROM

FROM命令是Dockerfile文件的开始,标识创建的镜像是基于哪个镜像
格式:FROM 镜像名[:标签名]

FROM 镜像名[:标签名]

# 示例1:基于Nginx
FROM nginx

# 示例2:基于openjdk:8-jdk-alpine
FROM openjdk:8-jdk-alpine

2.COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径
格式:

COPY [--chown=:] <源路径1>...  <目标路径>
COPY [--chown=:] ["<源路径1>",...  "<目标路径>"]

  
# 将以hom开头的文件和目录拷贝到容器目录下
COPY hom* /mydir/
# 将一些文件拷贝到容器目录下
COPY hom?.txt /mydir/
# 将一个文件拷贝到容器,并重新命名
COPY xxxx.jar abc.jar

3.ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:
在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:
在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

4.RUN

用于执行后面跟着的命令行命令。
注意:RUN是在docker build时运行,而非docker run时运行
Shell格式:

RUN <shell 命令>

# 示例一
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

# 示例二,合并简化
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

exec格式:

RUN ["可执行文件", "参数1", "参数2"]

# 等价于 RUN ./test.php dev offline
RUN ["./test.php", "dev", "offline"] 

5.CMD

类似于 RUN 指令,用于运行程序。与RUN不同的是,CMD命令是在docker run时执行
格式:

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

示例:

# CMD <shell 命令> 
CMD java -jar demo.jar

# CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["java","-jar","demo.jar"]

# CMD ["<param1>","<param2>",...] 为 ENTRYPOINT 指令指定的程序提供默认参数
CMD ["/etc/nginx/nginx.conf"]

6.ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,见以下示例。

示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 可以在docker run -c 指定参数
CMD ["/etc/nginx/nginx.conf"] # 给ENTRYPOINT约定默认参数

不传参运行:

docker run  nginx:test
# 相当于nginx -c /etc/nginx/nginx.conf

传参运行:

docker run  nginx:test -c /etc/nginx/new.conf
# 忽略CMD中的参数,使用自定义参数

7.ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
格式:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

8.ARG
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
格式:

ARG <参数名>[=<默认值>]

9.VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
格式:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

10.EXPOSE

仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:

EXPOSE <端口1> [<端口2>...]

11.WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:

WORKDIR <工作目录路径>

12.USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:

USER <用户名>[:<用户组>]

13.HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

14.ONBUILD
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:

ONBUILD <其它指令>

15.LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

比如我们可以添加镜像的作者:

LABEL org.opencontainers.image.authors="runoob"

4.构建镜像命令

# 格式
docker build [OPTIONS] PATH | URL | -

# 示例
docker build -t 镜像名:标签名 .

参数说明:

–build-arg=[] :设置镜像创建时的变量;
–cpu-shares :设置 cpu 使用权重;
–cpu-period :限制 CPU CFS周期;
–cpu-quota :限制 CPU CFS配额;
–cpuset-cpus :指定使用的CPU id;
–cpuset-mems :指定使用的内存 id;
–disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
–force-rm :设置镜像过程中删除中间容器;
–isolation :使用容器隔离技术;
–label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
–memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
–no-cache :创建镜像的过程不使用缓存;
–pull :尝试去更新镜像的新版本;
–quiet, -q :安静模式,成功后只输出镜像 ID;
–rm :设置镜像成功后删除中间容器;
–shm-size :设置/dev/shm的大小,默认值是64M;
–ulimit :Ulimit配置。
–squash :将 Dockerfile 中所有的操作压缩为一层。
-t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
–network: 默认 default。在构建期间设置RUN指令的网络模式

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK