Docker笔记(3):Dockerfile

1.什么是Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。Dockerfile的作用包括:

1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;

2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了; 3、对于运维人员:在部署时,可以实现应用的无缝移植。

2.Dockerfile基本结构

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

# Base images 基础镜像
FROM centos
# MAINTAINER 维护者信息
MAINTAINER tianfeiyu
# 镜像操作指令
RUN <command> 或 RUN ["executable", "param1", "param2"]
# 容器启动时执行的指令
CMD ["executable","param1","param2"]
3.常用命令解析

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

 FROM <image> 或 FROM <image>:<tag>

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

 MAINTAINER <name>

ENV: 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。格式为

ENV <key> <value> 
ENV VERSION 9.3

ADD:将本地文件添加到容器的指定位置, 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。格式为

# ?替代一个单字符,例如:"home.txt"
ADD <src> <dest> 例如:ADD hom?.txt /mydir/      

COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。当使用本地目录为源目录时,推荐使用 COPY。格式为

 COPY <src> <dest>

WORKDIR:为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。格式为

WORKDIR /path/to/workdir

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

WORKDIR /a
WORKDIR b
RUN pwd

则最终路径为 /a/b/c。

RUN:构建镜像时执行的命令,每条 RUN 指令将在当前镜像基础上执行指定命令,并创建新的中间镜像,新创建的中间镜像,会被缓存起来,可以通过配置–no-cache参数,取消中间镜像的缓存。当命令较长时可以使用 \ 来换行。格式为

RUN <command> 或 RUN ["executable", "param1", "param2"]

前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。可以通过第二种方式指定使用其它终端,例如 RUN ["/bin/bash", “-c”, “echo hello”]。

CMD:启动容器时执行的命令,**每个 Dockerfile 只能有一条 CMD 命令。**如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。支持三种格式

CMD ["executable","param1","param2"]  # 使用 exec 执行,推荐方式;
CMD command param1 param2   # 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"]  # 提供给 ENTRYPOINT 的默认参数;

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

ENTRYPOINT :配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。两种格式:

ENTRYPOINT ["executable", "param1", "param2"] 
ENTRYPOINT command param1 param2

ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。

EXPOSE:告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。格式为

 EXPOSE <port> [<port>...]

VOLUME:创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。格式为

VOLUME ["/data"]

ONBUILD:当所构建的镜像被用做其它镜像的基础镜像时,所触发执行的操作指令。格式为:

ONBUILD [INSTRUCTION]

例如,Dockerfile 使用如下的内容创建了镜像 image-A

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。

FROM image-A
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。

LABEL: 用于为镜像添加元数据,格式为

LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"

使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

Dockerfile示例:

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

# MAINTAINER 维护者信息
MAINTAINER tianfeiyu

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/

#RUN 执行以下命令  
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 启动容器时执行以下命令
CMD ["nginx"]
4.Dockerfile中执行命令的方式

(1)RUN:执行命令并创建新的镜像层,RUN经常用于安装软件包。

(2)CMD:设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令行参数替换。

(3)ENTRYPOINT:配置容器启动时运行的命令。

执行命令的形式有两种,Shell和Exec格式,格式如下:

# Shell格式
RUN apt-get install python3
# Exec格式:
RUN ["apt-get", "install","python3"]
5.构建镜像的步骤与原理

(1)创建构建上下文

创建一个目录用来保存 Dockerfile文件,这个目录就是我们的构建环境,也称此环境为上下文或构建上下文。Docker会在构建镜像时将构建上下文和该上下文中的文件和目录上传到 Docker守护进程,这样Docker守护进程就能直接访问你想在镜像中存储的任何代码、文件或者其他数据。

(2)编辑Dockerfile

创建一个Dockerfile文件,写入构建镜像的指令与参数。每条指令都会创建一个新的镜像层并对镜像进行提交。Docker大体上按照如下流程执行 Dockerfile中的指令。

  • Docker从基础镜像运行一个容器;
  • 执行一条指令,对容器做出修改;
  • 执行类似 docker commit的操作,提交一个新的镜像层;
  • Docker再基于刚提交的镜像运行一个新容器;
  • 执行 Dockerfile中的下一条指令,直到所有指令都执行完毕。

即使因为某条指令执行出错,导致Dockerfile构建容器失败,也会得到一个可以使用的镜像。

(3)构建镜像

准备好Docerfile后,使用当前目录的 Dockerfile 创建镜像的命令:

docker build -t myApp_nginx:v1.0 .

-t myApp_nginx:v1.0 ,给新构建的镜像取名为 myApp_nginx:v1.0, 并设定版本为 v1.0 。

-f 可以显式指定构建镜像的Dockerfile 文件,如果不使用 -f,则默认将上下文中的名为Dockerfile的文件认为是构建镜像的 “Dockerfile文件” 。命令中最后 . (点)的告诉Docker到本地目录中去找Dockerfile文件。也可以指定个Git仓库的源地址来指定 Dockerfile的位置。

构建完成后,会将上下文中的文件传送到Docker守护进程。命令执行完毕后,如果可见“Successfully built xxx”字样,则说明镜像创建成功。

如果在构建上下文的根目录下存在以dockerignore文件,那么该文件内容会被按行进行分割,每一行都是一条文件过滤匹配模式。这非常像gitignore文件,该文件用来设置哪些文件不会被上传到构建上下文中去。

由于每一步的构建过程都会将结果提交为镜像,过程中构建的镜像都会被缓存起来。

https://www.runoob.com/docker/docker-compose.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值