什么是Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
Dockerfile结构大概分为四个部分
- 基础镜像信息
- 维护者纳西
- 镜像操作指令
- 容器启动时执行指令
扩展:
1,实现多条命令可以使用:封号“;”(封号不管前一条命令是否运行成功)或者使用&&(&&会在前一条命令运行成功之后才运行下一条命令)
2,容器删除重启之后,里面的数据也会消失;可以使用容器持久化,做数据卷,将容器挂载到宿主机上。
3,数据库一般单独运行,并不会放在容器中。
4,容器数据分层中,只要有一层镜像变了,上面的其他镜像都会改变。
5,镜像层是不可变的。
复制代码
Dockerfile常用指令
FROM + 镜像
指定新镜像所基于的基础镜像,第一条指令必须为from指令,没创建一个镜像就需要一条from指令
复制代码
MAINTAINER + 名字
说明新建镜像的维护人信息
复制代码
RUN + 命令
镜像构建的时候被需要运行的命令
复制代码
ENPRYPOINT ["运行的程序","参数1","参数2"]
设定容器启动时第一个运行的命令及其参数。
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。
复制代码
CMD ["要运行的程序", "参数1", "参数2"]
用于指定默认的容器主进程的启动命令的(就是开启容器时候,就运行指定的命令)
exec形式:
CMD ["要运行的程序", "参数1", "参数2"]
shell形式:
CMD 命令 参数1 参数2
启动容器时默认执行的命令或者脚本,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
复制代码
EXPOSE + 端口号
指定新镜像加载到 Docker 时要开启的端口
复制代码
AGE
EVN + 环境变量 + 变量值
ENV的级别最高,以ENV的值为最终值
设置一个环境变量,让后面是RUN使用
例:
linxu PATH=$PATH:/opt
ENV PATH $PATH:/opt
复制代码
ADD + 源文件/目录 + 目标文件/目录
与cp一样具有复制特性,但是不同于cp
将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL
注意事项:
1,源路径是个文件,并且目标路径以/结尾,目标路径才会被docker当成目录,将源文件拷贝到目标目录下;
2,如果源路径是个文件,且目标路径是不以 / 结尾,则docker会把目标路径当作一个文件
3,如果源文件是个目录,目标路径不存在,docker会以目标路径自动创建一个目录,把源路径目录下的文件拷贝进来;
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下
4,如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。
复制代码
COPY + 源文件/目录 + 目标文件/目录
只复制本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中
复制代码
**VOLUME + [“目录”] **
在容器中创建一个挂载点
复制代码
USER + 用户名/UID
指定运行容器时的用户
复制代码
WORKDIR + 路径
为后续的 RUN、CMD、ENTRYPOINT 指定工作目录
复制代码
ONBUILD + 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令
(将生成的镜像作为一个基础镜像生成新的镜像时使用)
复制代码
HEALTHCHECK
健康检查
复制代码
ADD与copy的区别
两者都可以复制本地目录或文件到镜像中
注意:URL与解压特性不能一起使用(表示通过URL在线下载的安装包,在dockerfile中不会自动解压)
ADD | copy |
---|---|
支持URL在线下载ADD | 不支持URL |
支持本地tar包解压 | 不支持 |
copy还支持配合--from=选项实现多阶段构建 |
ENTRYPOINT与CMD的区别
安装容器启动时执行命令的优先级:
docker run --entrypoint > entrypoint [...] > docker run 镜像 ... > cmd [...]
#当默认没有其他指定启动命令时候,默认使用cmd
复制代码
当entrypoint与cmd一起出现在dockerfile里面时
1,entrypoint优先级大于cmd
2,cmd的所有命令都是在为entrypoint提供参数(服务)
复制代码
Dockerfile搭建镜像的步骤
- 先用FROM指令指定基础镜像
- 再用MAINTAINER指定维护人信息
- 然后再用RUN,EXPOSE,ADD,USER,WORKDIR等指令编写构建镜像的过程
- 最后使用CMD或ENTPYPOINT指令指定启动容器的命令
Dockerfile示例
构建nginx镜像
老样子关闭防火墙与增强功能
systemctl stop filewalld
setenforce 0
复制代码
建立工作目录
[root@localhost ~]# mkdir /opt/nginx
[root@localhost ~]# cd /opt/nginx/
下载需要的安装包到创建的目录下
复制代码
编辑Dockerfile
注意:Dockerfile的指令一定要大写(不然会报错),并且编辑的Dockerfile首字母也要大写
[root@localhost nginx]# vim Dockerfile
编写内容
FROM centos:7
#设置基于centos:7为基础镜像去创建nginx镜像
MAINTAINER Helloween <zly>
#设置维护人信息
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
#添加环境依赖包
RUN useradd -M -s /sbin/nologin nginx
#创建用户,不允许登陆系统
ADD nginx-1.12.2.tar.gz /opt/
#上传nginx软件压缩包(这边会自动解压;目标目录最后一定要带上/)
WORKDIR /opt/nginx-1.12.2
#指定运行的工作目录
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
#运行检测环境
ENV PATH /usr/local/nginx/sbin:SPATH
#设置环境变量
EXPOSE 80
EXPOSE 443
#指定http和HTTPS的端口
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#将关闭守护进程重定向到nginx.conf配置文件的末尾处运行(镜像需要前台运行)
ADD run.sh /run.sh
#将宿主机里面的run.sh添加到容器run.sh里面
RUN chmod 755 /run.sh
#给容器里面的run.sh权限
CMD ["/run.sh"]
#指定容器开启时候就运行/run.sh
扩展:
最后一行也可以修改为
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"
#表示前台运行nginx,这样就不需要在编辑一个run.sh的运行脚本了
[root@localhost nginx]# vim Dockerfile
FROM centos:7
MAINTAINER helloween <zly>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /opt/
WORKDIR /opt/nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin/:$PATH
EXPOSE 80
EXPOSE 443
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
复制代码
编辑运行脚本run.sh
[root@localhost nginx]# vim run.sh
编写内容
#!/bin/bash
/usr/local/nginx/sbin/nginx
#表示运行脚本时候,开启nginx
复制代码
创建并运行新镜像
[root@localhost nginx]# docker build -t nginx:centos.
#末尾有个“.”不能忘记,表示在当前目录
[root@localhost nginx]# docker run -d -P nginx:centos
#运行并且随机分配端口映射
[root@localhost nginx]# docker ps -a
复制代码
验证
访问http://192.168.42.17:32769 验证是否成功,后面的端口号,是docker ps -a可以查看到的
作者:夏威夷果陆胖胖
链接:https://juejin.cn/post/7194628361501540412
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。