Docker 从入门到实践系列五 - Dockerfile文件,从零开始学springboot百度网盘

    • JDK镜像模版
  • Docker数据持久化

  • 构建过程解析

    • 构建步骤
  • 基础知识

  • Dockerfile 执行流程

  • 小结

什么是DockerFile文件


《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


DockerFile是一个文本格式的配置文件,用户可以使用DockerFile来快速创建自定义的镜像。

DockerFile基本结构


Dockerfile分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令

比如:

This Dockerfile uses the ubuntu image

VERSION 2 - EDITION 1

Author: docker_user

Command format: Instruction [arguments / command] …

Base image to use, this must be set as the first line

FROM ubuntu:18.04

MAINTAINER docker_user docker_user@email.com

COPY . /app

RUN make /app

CMD python /app/app.py

每条指令创建一层:

  • FROM : 指明所基于的镜像名称,从ubuntu:18.04Docker镜像创建一个图层。

  • MAINTAINER:维护者信息,docker_user维护(可以不写)

  • COPY : 从Docker客户端的当前目录添加文件,镜像操作指令

  • RUN : 构建镜像时执行make命令,每运行一条RUN指令,镜像就添加新的一层,并提交(添加可写层)

  • CMD : 指定在容器中运行什么命令,用来指定运行容器时的操作命令

Docker镜像由只读层组成,每个只读层代表一个Dockerfile指令。这些层是堆叠的,每个层都是上一层的变化的增量

Docker可以通过读取Dockerfile指令来自动构建镜像

完整的小例子:

#在一个空目录下,新建一个名为 Dockerfile 文件

mkdir /usr/dockerfile -p

vim dockerfile-demo

#编辑 dockerfile

FROM nginx:latest

维护者 可以省略

MAINTAINER jourwon jourwon@docker.com

#启动容器

RUN mkdir /usr/share/nginx/html/ -p

RUN echo Hello DockerFile! > /usr/share/nginx/html/demo.html

#构建镜像 . : 根据当前上下文环境构建

docker build -f dockerfile-demo -t jourwon/nginx:v1 .

#运行

docker run --rm -d -it --network host jourwon/nginx:v1

浏览器访问

DockerFile指令详解


D ockerfile命令官方文档 常见命令详解:

1. FROM

指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。命令格式如下:

FROM [–platform=] [AS ]

Or

FROM [–platform=] [:] [AS ]

Or

FROM [–platform=] [@] [AS ]

平时不用这么复杂的,只需如下即可

FROM [:]

FROM centos:7.6.1810

任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同 一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一 次)。

2. MAINTAINER

指定维护者信息,格式为MAINTAINER。可以不写

MAINTAINER jourwon jourwon@docker.com

该信息会写入生成镜像的Author属性域中

3. RUN

容器构建时需要运行的命令

1、RUN

默认将在shell终端中运行命令,即/bin/sh-c

2、RUN [“executable”,“param1”,“param2”]。指令会被解析 为Json数组,因此必须用双引号。exec执行,不会启动shell环境

指定使用其他终端类型可以通过此方式实现,例如

RUN ["/bin/bash","-c",“echo hello”]

每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行

在shell形式中,可以使用\(反斜杠)将一条RUN指令继续到下一行。例如,考虑以下两行:

RUN /bin/bash -c 'source $HOME/.bashrc; \

echo $HOME’

它们在一起等效于以下这一行:

RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOME’

要使用’/bin/sh’以外的其他shell ,请使用exec 形式传入所需的shell 。例如:

RUN ["/bin/bash", “-c”, “echo hello”]

注意 在JSON格式中,必须转义反斜杠。在Windows中,反斜杠是路径分隔符,这一点尤其重要。由于无效的JSON,以下行否则将被视为shell形式,并以意外的方式失败:

RUN [“c:\windows\system32\tasklist.exe”]

此示例的正确语法为:

RUN [“c:\windows\system32\tasklist.exe”]

4. CMD

CMD指令用来指定启动容器时默认执行的命令。它支持三种格式:

CMD 指令的格式和 RUN 相似:

  • shell 格式:CMD <命令>

  • exec 格式(推荐):CMD ["可执行文件","参数 1","参数 2"...]

  • 参数列表格式:CMD ["参数 1","参数 2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体参数

注:DockerFile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。

5. COPY

复制本地主机的下的内容到镜像中的路径下。目标路径不存在时,会自动创建格式如下:

COPY

src:为Dockerfile所在目录的相对路径、文件或目录dest:镜像中的目标路径,相对和绝对都可以

支持通配符和正则

COPY hom* /mydir/

COPY hom?.txt mydir/

当使用本地目录为源目录时,推荐使用COPY

6. ENV

用来在构建镜像过程中设置环境变量。这个其实就是用一个别名指定一个目录地址,然后后续RUN指令可以通过 $别名 的方式来使用这个目录地址。

格式为ENV或ENV=… ,ENV 指令有两种形式

第一种形式ENV 会将一个变量设置为一个值。第一个空格之后的整个字符串将被视为 -包括空格字符。该值将为其他环境变量解释,因此如果不对引号字符进行转义,则将其删除。

第二种形式ENV = … 允许一次设置多个变量。请注意,第二种形式在语法中使用等号= ,而第一种形式则不使用等号= 。与命令行解析一样,引号和反斜杠可用于在值中包含空格。

例如:

ENV myName=“John Doe” myDog=Rex\ The\ Dog \

myCat=fluffy

ENV myName John Doe

ENV myDog Rex The Dog

ENV myCat fluffy

是一样的

ENV 从结果镜像运行容器时,使用设置的环境变量将保留。可以使用查看值docker inspect , 并使用更改它们docker run --env = 。

docker run --env= built_image

7. ADD

将宿主机目录下的文件拷贝到镜像且 ADD 命令会自动处理 URL 和解压 tar 压缩包,格式为

ADD hom* /mydir/

ADD hom?.txt /mydir/

ADD test.txt /absoluteDir/

ADD test.txt relativeDir/

其中可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一 个tar文件(如果为tar文件,会自 动解压到路径下)。可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径

与COPY的区别

1、Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在 构建镜像的过程中完成的。

2、COPY指令和ADD指令的区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。

3、满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩

4、当要读取URL远程资源的时候,并不推荐使用ADD指令,而是建议使用RUN指令,在RUN指令 中执行wget 或curl命令

8. ENTRYPOINT

指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的 参数

ENTRYPOINT有两种形式:

  • 在EXEC的形式,这是优选的形式ENTRYPOINT ["executable", "param1", "param2"],这种执行的是executable param1 param2

  • 带壳形式:ENTRYPOINT command param1 param2 。这中其实执行的是/bin/sh -c command param1 param2

多个ENTRYPOINT 只有最后一条生效

ENTRYPOINT [“echo”, “4”]

ENTRYPOINT [“echo”, “5”]

ENTRYPOINT [“echo”, “6”]

9. VOLUME

容器数据卷,用于数据保存和持久化工作。

创建一个数据卷挂载点,格式为VOLUME ["/data"]

FROM centos:7.6.1810

RUN mkdir /myvol

RUN echo “hello world” > /myvol/greeting

VOLUME /myvol

RUN echo “hello” > /myvol/greeting

可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等

10. WORKDIR

指定在创建容器后,终端默认登陆进来的工作目录,即一个落脚点。

为后续的RUN、CMD和ENTRYPOINT指令配置工作目录格式为WORKDIR /path/to/workdir

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则 会基于之前命令指定的路径

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

最终的输出pwd命令这Dockerfile 将是/a/b/c

11. EXPOSE

声明镜像内服务所监听的端口格式为EXPOSE[…]

EXPOSE 指令通知Docker 容器在运行时监听指定的网络端口。可以指定端口是侦听TCP 还是

UDP ,如果未指定协议,则默认值为TCP 。

EXPOSE 22 80 8443

默认情况下, EXPOSE 假定为TCP 。还可以指定UDP :

EXPOSE 80/udp

要同时在TCP和UDP上公开,请包括以下两行:

EXPOSE 80/tcp

EXPOSE 80/udp

无论EXPOSE设置如何,都可以在运行时使用该-p标志覆盖它们。例如

docker run -p 80:80/tcp

DockerFile创建镜像


编写完成Dockerfile之后,可以通过docker build命令来创建镜像。

基本的格式为docker build[选项]内容路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像

如果使用非内容路径下的Dockerfile,可以通过-f选项来指定其路径

$ docker build -f /path/to/a/Dockerfile .

要指定生成镜像的标签信息,可以使用-t选项

docker build -t jourwon/ubuntu:v1 .

docker build 最后的 . 号,其实是在指定镜像构建过程中的上下文环境的目录

镜像管理

Docker镜像由一系列层组成。每层代表镜像的Dockerfile中的一条指令。除最后一层外的每一层都是只 读的。考虑以下Dockerfile:

FROM ubuntu:18.04

COPY . /app

RUN make /app

CMD python /app/app.py

该Dockerfile包含四个命令,每个命令创建一个层。该 FROM语句首先从ubuntu:18.04镜像创建只读层。

该COPY命令从Docker客户端的当前目录添加一些文件。

该RUN命令使用命令构建您的应用程序make。

最后一层指定在容器中运行什么命令。 运行镜像并生成容器时,可以在基础层之上添加一个新的可写层

(“容器层”)。对运行中的容器所做的所有更改(例如写入新文件,修改现有文件和删除文件)都将写 入此可写容器层。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值