Dockerfile文件中各个常用的基本命令,共18个指令
FROM
MAINTAINER
RUN
CMD
LABEL
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
SHELL
WORKDIR
ONBUILD
STOPSIGNAL
HEALTHCHECK
FROM系统基础,FROM是Dockerfile第一个命令,关系到生成镜像的版本
FROM # 系统
FROM : #系统版本
FROM [–platform=] [@] [AS ]
例: FROM centos:7.6.1860
- 单个dockfile可以多次出现 FROM ,以使用之前的构建阶段作为另一个构建阶段的依赖项
- AS name表示为构建阶段命名,在后续FROM和COPY --from=说明中可以使用这个名词,引用此阶段构建的映像
- digest其实就是就是根据镜像内容产生的一个ID,只要镜像的内容不变digest也不会变
- tag或digest值是可选的。如果您省略其中任何一个,构建器默认使用一个latest标签。如果找不到该tag值,构建器将返回错误。
- –platform标志可用于在FROM引用多平台镜像的情况下指定平台。例如,linux/amd64、linux/arm64、 或windows/amd64
MAINTAINER 维护者信息
MAINTAINER ribou [email protected]
RUN 基础镜像命令
RUN linux命令,在基础镜像中需要的一系列操作
例
FROM centos:7.6.1860
MAINTAINER ribou [email protected]
RUN mkdir /user/local/nginx
&& mkdir /usr/local/nginx/config
&& yum -y install nginx
ADD/COPY 复制
从本地向制作镜像中复制文件,
ADD可以使用url,也可以复制tar文件,并会自动解压到目标路径中
COPY不能访问网络资源,也不会自动解压
ADD …
ADD [“”,…“”]用于支持包含空格的路径
COPY [–chown=:] <源路径1>…<目标路径>
CMD命令
CMD命令是根据镜你创建的容器启动时,需要执行的命令,这个命令在容器创建后,用于执行项目,可以写到一个sh文件中
CMD [“executable”,“param1”,“param2”] 执行可执行文件优先
CMD [“param1”,“param2”] 设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数
CMD command param1"param2] 执行shell内部命令
CMD和RUN的区别,一个是在容器启动之前,一个是在容器启动之后,如果有多个CMD命令只执行最后一个
LABEL
添加元数据
LABEL multi.label1=“value1”
multi.label2=“value2”
other=“value3”
ENTRYPOINT
ENTRYPOINT是容器启动后执行的命令,不会被 docker run提供的参数覆盖,只能有一个ENTRYPOINT,但是如果docker run时使用了entrypoint选项,此选项的参数可当作要运行的程序覆盖ENTRYPOINT
例如:
FROM nginx
ENTRYPOINT [“nginx”,“-c”] 定参
CMD [“/etc/nginx/nginx.conf”] 变参
如果不传参运行docker run nginx:test 容器会默认启动 nginx -C /etc/nginx /nginx.conf
传参运行
docker run nginx :test -c /etc/nginx/new.conf
会把CMD中定义的参数覆盖掉,实际在容器中执行的会是
nginx -C /etc/nginx/new.conf
ENTRYPOINT 搭配CMD使用时一般使用CMD给ENTEYPOINT传参
ENV环境变量
ENV是给创建好的容器设置环境变量,设置好环境变量可以被RUN使用
ENV
ENV = … 可以设置多个变量
ARG 环境变量
ARG和ENV都是设置环境变量,两者的区别是,ARG是对Dockerfile内有效,就是在docker build的过程中有效,ENV是针对构建好容器的变量
ARG <参数名>[=<默认值>]
VOLUME挂载路径
VOLUME是定义匿名数据卷,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷中,作用是避免 数据丢失,或因容器重启时导致数据流失会容器慢慢变大
VOLUME [“<路径1>”,“<路径2>”…]
VOLUME <路径>
在容器启动时可以使用 -V参数修改挂载点
EXPOSE
EXPOSE申明的仅仅是端口,在镜像服务中使用随机端口做映射,也就是docker run -P时,会自动随时映射EXPOSE的端口,
EXPOSE <端口1>[<端口2>]
SHELL
覆盖用于命令的shell 形式的默认 shell。Linux 上的默认 shell 是[“/bin/sh”, “-c”],Windows 上是[“cmd”, “/S”, “/C”]
SHELL [“executable”, “parameters”]
该SHELL指令在 Windows 上特别有用,因为 Windows 有两种常用且截然不同的本机 shell:cmd和powershell,以及可用的备用 shell,包括sh。该SHELL指令可以出现多次。每条SHELL指令都会覆盖所有先前的SHELL指令,并影响所有后续指令。
WORKDIR 工作目录
用于WORKDIR指定的工作目录,会在构建镜像的每一层中都存在,WOKRDIR的工作目录必须是创建好的,dokcer build构建过程中,每一个RUN命令都是新建的一层,只有通过WORKDIR创建的目录才会
一直存在
WORKDIR <工作目录路径>
USER 用户和组
用于指定后续执行命令的用户和用户组,这里只是切换后续命令执行的用户,用户名和用户组必须提前创建好
USER <用户名>[:<用户组>]
STOPSIGNAL
设置将发送到容器退出的系统调用信号。该信号可以是与内核系统调用表中的位置匹配的有效无符号数,例如 9,或格式为 SIGNAME 的信号名称,例如 SIGKILL。
STOPSIGNAL signal
默认的 stop-signal 是 SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过–stop-signal 可以设置自己需要的signal,主要目的是为了让容器内的应用程序在接收到signal之后可以先处理一些事物,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,默认时间是10s。
HEALTHCHECK 监控服务状态
HEALTHCHECK用来指定或指定来监控docker容器服务的运行状态
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令>:这边 CMD后面跟随的命令使用,可以参考CMD的用法
ONBUILD延迟构建
ONBUILD用来延迟构建命令的执行
------测试
1、创建工作目录
mkdir nginx
2、进入nginx目录,创建nginx测试页
cd nginx/
vim index.html
<h1> docker nginx build successful from Ribou nedy.com</h1>
3、创建dockerfile文件,网络下载安装
vim Dockerfile
#基准镜像
FROM centos:7
#作者信息
MAINTAINER Ribou <[email protected]>
#工作目录
WORKDIR /usr/local/src/
#定义环境变量
ENV NG_VERSION nginx-1.21.0
#安装epel仓库
RUN yum -y install epel-release
#安装wget
RUN yum -y install wget
#下载nginx文件并解压
RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz
#安装编译依赖包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
#清理仓库
RUN yum clean all
#创建nginx用户
RUN useradd -M -s /sbin/nologin nginx
#切换工作目录
WORKDIR /usr/local/src/$NG_VERSION
#编译安装nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
#复制测试页面到容器中
ADD index.html /usr/local/nginx/html
#设置容器中要挂在到宿主机的目录
VOLUME /usr/local/nginx/html
#设置sbin环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#暴露80端口
EXPOSE 80/tcp
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
#当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g "daemon off;"而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下)
执行镜像制作
docker build ./ -t centos7_nginx:nedy #切记镜像名字不能用大写
查看镜像
[root@aliyuan-ops-01 nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7_nginx nedy f0015837b810 31 seconds ago 1.09GB
SIZE 这个有点儿大,这只是个示例, 实际生产中,选择小的基础系统镜像来制作,降低镜像占用空间大小