docker-dockerfile
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker-dockerfile相关的知识,希望对你有一定的参考价值。
- docker文件存储驱动
- dockerfile镜像构建
- 指令
- 示例
dockekr镜像是只读的,对容器修改的内容,一旦容器退出,所有的内容将会丢失。镜像是分层的,最上的一层为读写层(写时复制和用时分配)
-
文件系统存储驱动:
- AUFS:UnionFS,Another UFS, Alternative UFS, Adanced UFS
UnionFS:把不同的物理位置的目录合并到同一个目录中。 - Device mapper:类似AUFS
Linux 2.6内核引入的最重要的技术之一,用于在内核中支持逻辑卷管理的通用设备映射机制; - Mapped Device
Mapping Table
Target Device:源设备 - overlayFS:Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层
- AUFS:UnionFS,Another UFS, Alternative UFS, Adanced UFS
- Docker Images:镜像的构建方法:
docker commit:不建议使用,不知道构建过程,“黑盒子”
Dockerfile:文本文件,镜像文件构建脚本; -
Dockerfile
由一些系列用于基础镜像构建新的镜像文件的专用指令序列组成。指令:选定基础镜像、安装必要程序、、复制配置文件和数据文件、自动运行的服务以及要暴露的端口等
语法:指令行、注释行、空白行
指令行:由指令及指令参数构成,指令其字符不区分大小写,约定俗成,使用全大写;
注释行:#号开头,必须单独位于一行中
空白行:忽略 - 例如简单运行一个Web服务
FROM centos:latest #基础镜像centos最新版本来自dockerhub官方 ADD CentOS7-Base-163.repo /etc/yum.repos.d/Centos.repo #把本地的yum配置文件复制到构建容器的yum仓库 RUN yum makecache fast && yum install nginx -y && yum clean all #安装Nginx并清除缓存 EXPOSE 80 #暴露80端口 CMD ["nginx","-g","daemon off;"] #运行nginx于前台,在镜像构建完成后才会执行
-
指令:
-
FROM指令:必须是第一条非注释行,用于指定用到的基础镜像,一般使用构建好的官方镜像,也可以自己构建
语法:
FROM <IMAGE>[:<TAG>]
FROM <IMAGE>[:<TAG>]@<DIGEST> #校验码防止异常
FROM busybox:latest 、FROM centos:7 -
MAINTAINER:用于提供信息,如提供构建者相关信息,建议紧跟FROM指令后,非必须指令
语法:
MAINTAIN <author‘ detail>
MAINTAINER maintainer xuetong <[email protected]> -
COPY:用于从docker宿主机复制文件到所要创建的镜像文件系统中,源文件的元数据会保留
语法:
COPY [--chown=<user>:<group>] <src>... <dest> #空格隔开多个源文件,要复制的源文件或目录,支持使用通配符
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]:(文件名中有空白字符时使用此种格式)
例如:
COPY flanneld.service /etc/systemd/system/flanneld.service
COPY *.conf /etc/httpd/conf.d/
<src>由于构建过程将本地dockerfile和相关文件发送至server端构建,路径需使用上下文目录,源文件不能使用类似“../some_dir/some_file”类的路径;
<dest> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录 -
ADD :类似COPY指令,但更高级用法,额外还支持复制TAR文件,以及URL路径下载
语法:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
例如:
ADD haproxy.cfg /etc/haproxy/haproxy.cfg
ADD http://www.magedu.com/download/nginx/conf/nginx.conf /etc/nginx/ #文件权限为600
ADD epel.repo.tar.gz /etc/yum.repos.d/ #会自动解压
如果使用copy:COPY epel.repo.tar.gz /etc/yum.repos.d/ RUN cd /etc/yum.repos.d/ && tar xf epel.repo.tar.gz -
ENV:设置环境变量,可以被当前Dockerfile文件中其他指令使用,调用格式为:$Var_name/${Var_name},相当于在本地执行export USER_HOME="/root"
语法:
ENV <KEY> <VALUE> #一次只能设置一个
ENV <key>=<value> ... #可以设置多个变量 ,中有空白字符,要使用字符进行转义或加引号;换行
ENV name="xiao qin" -
USER: Dockerfile文件中的任何RUN/CMD/ENTRYPOINT指令指定的程序时的用户名或UID
语法:
USER <uid>|<username> -
WORKDIR: 用于指定当前镜像的工作目录,可以多次使用
语法:
WORKDIR <DIR-PATH>
WORKDIR /etc/sysconfig/network-scripts
WORKDIR $STATEPATH #变量名ENV中定义 -
VOLUME:用于目标镜像文件中创建一个挂载点目录,用于挂载主机上的卷
语法:
VOLUME <mountpoint>
VOLUME ["<path1>", "<path2>"...] -
EXPOSE:用于为容器指定要暴露的端口;当使用-大P时可以把默认端口映射至主机
语法:
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]] ... #<protocol>为tcp或udp二者之一,默认为tcp;
例如:
EXPOSE 11211/tcp 11211/udp 80 -
RUN:用于指定docker build过程中要运行的命令,而不是docker run 此dockerfile构建成的镜像时运行;
语法:
RUN <command> #shell来执行命令
RUN ["<executeable>", "<param1>", "<param2>", ...] #不会启动shell,不支持通配符、命令替换 -
CMD:似于RUN指令,用于运行程序;但二者运行的时间点不同;CMD在docker run时运行,而非docker build;
CMD指令的首要目的在于为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束;不过,CMD指令指定的程序可被docker run命令行参数中指定要运行的程序所覆盖。
语法:
CMD ["executable","param1","param2"] #使用exec执行,推荐的方式
CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用
CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数
注意:如果dockerfile中存在多个CMD指令,仅最后一个生效; -
ENTRYPOINT:似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序;可以使用该指令做一些初始化操作,写成脚本,若要让CMD指令继续往下走,可以在脚本中添加:exec "[email protected]",否则后面指令不会执行
语法:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2 (shell中执行) -
jq工具:用来解析json格式 yum install jq
docker inspect web | jq .[]."Mounts" #查看web的挂载json信息
-
-
dockerfile最佳实践
镜像尽可能减少分层、基础镜像尽可能小,如Ubuntu、Debian、alpine(常用于构建二进制包类)
对多行参数排序
避免安装不必要的包 - 示例:
参考资料:
http://dockone.io/article/1513
https://hub.docker.com/explore/
以上是关于docker-dockerfile的主要内容,如果未能解决你的问题,请参考以下文章