码迷,mamicode.com
首页 > 其他好文 > 详细

Docker系列教程(三) DockerFile

时间:2020-09-10 23:01:12      阅读:40      评论:0      收藏:0      [点我收藏+]

标签:需要   bre   ora   dma   die   rtm   pos   程序   rmq   

一、什么是Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,每条指令构建一层。

二、Dockerfile文件内容

Dockerfifile文件内容一般分为4部分:
  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行的指令

三、常用命令

FROM image_name:tag
定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name
声明镜像的维护者及联系方式,不推荐
LABEL maintainer=“user_name”
添加镜像元数据信息,推荐使用此方式声明镜像维护信息
ENV key value
设置环境变量
RUN command
Dockerfile核心部分,用于执行命令行命令
ADD source_dir/file dest_dir/file
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file
和ADD相似,但是如果有压缩文件不能解压
WORKDIR path_dir
设置工作目录
EXPOSE port
声明容器运行的服务端口
VOLUME path
挂载容器数据卷
CMD command
启动容器时执行的shell命令

1. FROM

指明构建的新镜像来自于哪个基础镜像,必须为第一条命令。

2. MAINTAINER、LABEL

指明镜像维护者及联系方式(一般是邮箱地址),如
MAINTAINER panfang <157****@qq.com>
但是并不推荐使用MAINTAINER,更推荐使用LABEL来指定镜像作者,如
LABEL maintainer="panfang"

3. RUN

用于执行后面跟着的命令行命令。有以下俩种格式:
  • shell 格式
RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。
  • exec 格式
RUN ["可执行文件", "参数1", "参数2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大,例如:
FROM centos 
RUN yum 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 

以上执行会创建 3 层镜像。可简化为以下格式: 
FROM centos 
RUN yum install wget \     
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \     
    && tar -xvf redis.tar.gz
 
所以请以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

4. COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径,不支持自动下载和解压,如:
COPY ./start.sh /start.sh

5. ADD

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

6. CMD

似于 RUN 指令,二者运行的时间点不同:
  • CMD 在docker run 时运行(容器启动时)。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

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

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

7. ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

8. WORKDIR

指定RUN、CMD、ADD等命令执行的工作目录,类似于cd到目录后再执行命令。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

9. VOLUME

指定容器挂载点到宿主机自动生成的目录或者其他容器,一个卷可以存在于一个或多个容器的指定目录,如:

VOLUME ["/var/lib/mysql"]

10. EXPOSE

指定外界交互的端口,无实际作用,仅有提示意义,要使其可访问,需要在docker run时使用-p来设置端口。如:

EXPOSE 11211/tcp 11211/udp

11. ENTRYPOINT

启动容器时执行的shell命令,同CMD类似,但docker run命令指定的参数会追加到该指令指定的命令之后,可存在多条指令,但只有最后一个会生效,如:
ENTRYPOINT ["/bin/bash", "-C", "/start.sh"] ENTRYPOINT /bin/bash -C ‘/start.sh‘

四、定制镜像示例

1. 定制一个简单的 nginx 镜像

构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件
# 1. 在一个空目录下新建一个名为 Dockerfile 的文件,并添加内容 
FROM nginx RUN echo 这是一个本地构建的nginx镜像 > /usr/share/nginx/html/index.html 

# 2. 进入Dockerfile文件所在目录,执行cmd命令 
docker build -t nginx:test . 
# 或者可以指定Dockerfile所在位置 
docker build -t nginx:test e:\test 
# 也可以使用docker commit,不推荐使用 
# docker commit <已启动的容器名> <新的容器名>:<版本号> 

# 3. 命令执行成功,查看nginx:test镜像成功创建 
docker images 

# 4. 启动新建的镜像,进入/usr/share/nginx/html目录查看存在index.html 
docker run -dit --name test nginx:test docker exec -it test /bin/bash cd /usr/share/nginx/html/ ls

技术图片

2. 定制一个jdk镜像

# 1. 在一个空目录下新建一个名为 Dockerfile的文件并添加内容 
FROM centos:7 MAINTAINER panfang WORKDIR /usr RUN mkdir /usr/local/java ADD jdk-8u261-linux-x64.tar.gz /usr/local/java/ 

# 设置环境变量时要注意jdk的目录 
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_261 
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 

# 2. 下载 jdk-8u261-linux-x64.tar.gz 文件放在该目录下 

# 3. 进入Dockerfile文件所在目录,执行cmd命令 
docker build -t jdk1.8:test . 

# 4. 命令执行成功,查看nginx:test镜像成功创建 
docker images # 

5. 基于新建的镜像创建容器并启动容器进行测试 
docker run -it --name=testjdk jdk1.8:test /bin/bash 

# 6. 在容器中测试jdk是否已经安装
java -version

 

Docker系列教程(三) DockerFile

标签:需要   bre   ora   dma   die   rtm   pos   程序   rmq   

原文地址:https://www.cnblogs.com/sharef/p/13468033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!