使用Dockerfile制作镜像

目录

1.Dockerfile 介绍

2.Dockerfile指令--FROM指令

2.3 Dockerfile指令--MAINTAINER指令

2.4 Dockerfile指令--COPY指令


1.Dockerfile 介绍

Docker中有个非常重要的概念叫做——镜像(Image)。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

(1)Dockerfile 编写的基本结构 Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为Dockerfile 中的注释。

(2)一台主机可以有多个Dockerfile 要使用多个Dockerfile 创建镜像,可以在不同目录编写Dockerfile,然后在Dockerfile 所在的目录下构建新的镜像;

注意:Dockerfile 中所包含需要的内容;如COPY的文件、目录等,都需要在Dockerfile 同级目录下存在;

(3)docker build是基于dockerfile制作镜像的命令

① 格式:

docker build [OPTIONS] PATH | URL | 

② 选项:

  • -t:指定要创建的目标镜像名

  • -c,- cpu-shares int :CPU份额(相对权重)

  • -m,- memory bytes:内存限制

  • --build-arg:设置构建时变量,就是构建的时候修改ARG指令的参数

③PATH

一般用.(即当前工作目录)作为上下文路径

说明:Docker 在运行时分为 Docker 引擎( 也就是服务端守护进程) 和客户端工具。 Docker 的引擎提供了一组REST API, 被称为 Docker Remote API, 而如 docker 命令这样的客户端工具, 则是通过这组 API与Docker 引擎交互, 从而完成各种功能。 因此, 虽然表面上我们好像是在本机执行各种 docker 功能, 但实际上, 一切都是使用的远程调用形式在服务端( Docker 引擎) 完成。 也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。

当我们进行镜像构建的时候, 并非所有定制都会通过 RUN 指令完成, 经常会需要将一些本地文件复制进镜像, 比如通过 COPY 指令、 ADD 指令等。 而 docker build 命令构建镜像, 其实并非在本地构建, 而是在服务端, 也就是 Docker 引擎中构建的。 那么在这种客户端/服务端的架构中, 如何才能让服务端获得本地文件呢?

这就引入了上下文的概念。 当构建的时候, 用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后, 会将路径下的所有内容打包, 然后上传给 Docker 引擎。 这样Docker 引擎收到这个上下文包后, 展开就会获得构建镜像所需的一切文件。

一般来说, 应该会将 Dockerfile 置于一个空目录下, 或者项目根目录下。 如果该目录下没有所需文件, 那么应该把所需文件复制一份过来。 如果目录下有些东西确实不希望构建时传给 Docker 引擎, 那么可以用 .gitignore 一样的语法写一个 .dockerignore , 该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。

那么为什么会有人误以为 . 是指定 Dockerfile 所在目录呢? 这是因为在默认情况下, 如果不额外指定 Dockerfile 的话, 会将上下文目录下的名为 Dockerfile 的文件作为Dockerfile。

这只是默认行为, 实际上 Dockerfile 的文件名并不要求必须为 Dockerfile , 而且并不要求必须位于上下文目录中, 比如可以用 -f ../Dockerfile.php 参数指定某个文件作为Dockerfile,一般大家习惯性的会使用默认的文件名 Dockerfile , 以及会将其置于镜像构建上下文目录中 。

④URL

docker build还支持从URL构建,docker build http://server/context.tar.gz ,如果所给出的URL是个tar压缩包,那么docker引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建。

⑤-

docker build还支持从标准输入中读取Dockerfile进行构建:

  • docker build - < Dockerfile 或者cat Dockerfile | docker build -

如果标准输入传入的是文本文件,则将其视为Dockerfile,并开始构建。这种形式由于直接从标准输入中读取Dockerfile的内容,它没有上下文,因此不可以像其他方法那样可以将本地文件COPY进镜像之类的事情。

  • docker build - < context.tar.gz

如果发现标准输入的文件格式是 gzip 、 bzip2 以及 xz 的话, 将会使其为上下文压缩包,直接将其展开, 将里面视为上下文, 并开始构建。

2.Dockerfile指令--FROM指令

(1)介绍

  • FROM 指令必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始;

  • FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境;

  • 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会自动从 Docker 的公共库 pull 镜像下来。如果找不到指定的镜像文件,docker build 会返回一个错误信息;

  • FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。

  • 如果FROM语句没有指定镜像标签,则默认使用latest标签。

    在 Docker Store 上有非常多的高质量的官方镜像, 有可以直接拿来使用的服务类的镜像, 如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等; 也有一些方便开发、 构建、 运行各种语言应用的镜像, 如 node 、 openjdk 、 python 、 ruby 、 golang 等。 可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。如果没有找到对应服务的镜像, 官方镜像中还提供了一些更为基础的操作系统镜像, 如ubuntu 、 debian 、 centos 、 fedora 、 alpine 等, 这些操作系统的软件库为我们提供了更广阔的扩展空间。

    除了选择现有镜像为基础镜像外, Docker 还存在一个特殊的镜像, 名为 scratch 。 这个镜像是虚拟的概念, 并不实际存在, 它表示一个空白的镜像。

    如果你以 scratch 为基础镜像的话, 意味着你不以任何镜像为基础, 接下来所写的指令将作为镜像第一层开始存在。 不以任何系统为基础, 直接将可执行文件复制进镜像的做法并不罕见, 比如swarm 、 coreos/etcd 。 对于 Linux 下静态编译的程序来说, 并不需要有操作系统提供运行时支持, 所需的一切库都已经在可执行文件里了, 因此直接 FROM scratch 会让镜像体积更加小巧。 使用 Go 语言开发的应用很多会使用这种方式来制作镜像, 这也是为什么有人认为 Go是特别适合容器微服务架构的语言的原因之一。

(2)格式

FROM <repository>[:<tag>] 或
FROM <repository>@<digest>

(3)示例

# Description: test image
FROM busybox:latest

2.3 Dockerfile指令--MAINTAINER指令

(1)介绍

  • 用于让dockerfile制作者提供本人的详细信息

  • dockerfile 并不限制MAINTAINER 指令可以出现的位置,但推荐将其放置于FROM指令之后

(2)格式

MAINTAINER <authtor's detail>

(3)示例

# Description: test image
FROM busybox:latest
MAINTAINER "Along <along@along.com>"

2.4 Dockerfile指令--COPY指令

(1)介绍

  • 从上下文目录中复制文件或目录到容器里指定的路径

(2)格式

COPY <src>... <dest> 或
COPY ["<src>",... "<dest>"]

注:

  • 要复制的源文件或目录可以是多个,支持使用通配符; 如:

    COPY hom* /mydir/

    COPY hom?.txt /mydir/

  • 要复制的文件必须是build上下文中的路径,不能是其父目录中的文件;

  • 如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制;

  • 使用 COPY 指令, 源文件的各种元数据都会保留。 比如读、 写、 执行权限、 文件变更时间等;

  • 目标路径,即正在创建的image的文件系统路径;建议使用绝对路径, 也可以是相对于工作目录的相对路径( 工作目录可以用 WORKDIR 指令来指定);

  • 目标路径不需要事先创建, 如果目录不存在会在复制文件前先行创建缺失目录;

  • 在路径中有空白字符时,通常使用第2种格式;

(3)COPY文件示例

①编写dockerfile文件

# Description: test image
FROM busybox:latest
MAINTAINER "Along <along@along.com>"
COPY index.html /data/web/html/ #要确保dockerfile 同级路径下有index.html文件

②在dockerfile同级目录下准备好index.html文件

[root@localhost test1]# vim index.html<h1>Busybox httpd server</h1>

③使用build 制作镜像

[root@localhost test1]# docker build -t busyboxhttpd:v0.1 ./
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM busybox:latest
 ---> a9d583973f65
Step 2/3 : MAINTAINER "Along <along@along.com>"
 ---> Running in 3ca8e392d127
 ---> dba31b5cf93c
Removing intermediate container 3ca8e392d127
Step 3/3 : COPY index.html /data/web/html/
 ---> bd9eaeac877f
Removing intermediate container 884fc0798bf4
Successfully built bd9eaeac877f
说明:.代表上下文路径

④基于此新建镜像运行容器,进行验证

[root@localhost ~]# docker run --name web1 --rm busyboxhttpd:v0.1 cat /data/web/html/index.html
<h1>Busybox httpd server</h1>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值