dockerfile创建自定义镜像
1、作用
创建自定义的镜像,包含配置文件、挂载点、对外暴露的端口、设置环境变量等
2、docker创建镜像的方式
(1)基于已有镜像创建
根据官方提供的镜像源创建镜像,拉取容器,但空空如也,只能提供基础功能,扩展性功能还需要自定义(进入容器进行操作)
(2)基于模板创建https://download.openvz.org/template/precreated/
(3)dockerfile创建(生产中使用)
①定义:联合文件系统(UnionFS),docker镜像的基础
②特性:镜像通过分层进行集成,一次同时加载多个文件系统,但从用户角度来说,就是一个文件系统
③docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS,每一层都是一个layers,每一层都包含文件系统的一部分,这些层次叠加在一起最终形成rootfs
bootfs:宿主机提供的内核和引导程序
rootfs:容器的操作系统,在dockerfile中可以自己指定。是多个基础镜像和应用镜像结合起来的只读层,实际上,镜像就是一个只读文件,容器基于镜像实例,运行起来后,容器变成一个可读可写层
注意:
①在dockerfile中,每创建一个指令都是一个镜像层
②镜像层会被缓存和复用。一旦有一层镜像失败,所有的镜像层都会失败,镜像也不会创建
举例:镜像总共1-6层
若1-4层失败,直接完成,继续运行5-6层
整个镜像失败
③镜像层是不可变的,在某一层中添加一个新的命令,但在下一层删除此指令,镜像中基于此命令创建的文件依然存在,但在容器中看不见
举例:第一层执行touch 123
第二层执行rm -rf 123
整个容器中没有123
3、dockerfile核心
用户个性化定制docker镜像
4、dockerfile结构
(1)基础镜像信息
(2)维护者信息
(3)镜像的操作指令
(4)容器启动时执行的命令
5、dockerfile语法(所有语法都是大写)
★代表必须要加的
(1)★FROM:指定基础镜像信息(指定容器的操作系统)
(2)MAINTAINER:指定维护者信息(可有可无)
(3)★RUN:在基础镜像信息上执行的命令。每个RUN代表一层,RUN越多,分层越多,镜像越大
(4)★ENTRYPOINT:设置容器运行时的默认命令(容器内部运行的主程序)【面试题】
(5)★CMD:指定容器运行时的默认命令(docker run加上后面其他命令,例如:/bin/bash,cmd指令将会被覆盖)【面试题】
(6)EXPOSE:暴露端口(指定容器的运行端口)
(7)ENV:设置环境变量。环境变量可以被RUN命令使用(声明容器运行时需要的环境变量)
(8)ADD:复制、解压(不支持.zip和.tar,只支持tar.gz、tar.bz2、url地址解压)。ADD主要作用是解压,官方推荐用copy复制
(9)COPY:复制本地文件(文件要和dockerfile在一个目录才能复制)
(10)VOLUME:创建容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载(可有可无)
(11)USER:设置运行镜像时使用的用户或者UID(可有可无)
(12)WORKDIR:为后续指令(ENTRYPOINT和CMD)设置的工作目录
(13)ONBUILD:这个镜像可以被其他镜像引用,就需要这个命令(可有可无)
(14)ARG:用于创建容器时传递参数(可有可无)
CMD和ENTRYPOINT的区别【面试题】
(1)共同点:①都可以作为容器启动时的默认命令
②ENTRYPOINT和CMD指令在容器启动时执行,都会成为容器的主进程,主进程负责接收信号,处理容器的生命周期,主进程退出,容器将终止运行
(2)不同点:①CMD可以把参数传给ENTRYPOINT
②多个ENTRYPOINT和多个CMD,只会运行最后一个(一般Dockerfile中只有一个ENTRYPOINT和CMD)
③在docker run后面加上输出,ENTRYPOINT指令不会被覆盖,CMD指令会被覆盖
创建基础镜像
①CMD可以把参数传给ENTRYPOINT
创建镜像Dockerfile
(每个都命名为Dockerfile,每个Dockerfile都是单独目录)
构建镜像docker build -t centos7:test .
.表示使用当前目录下的Dockerfile
创建容器docker run --name centos1 centos7:test
②多个ENTRYPOINT和多个CMD,只会运行最后一个(一般Dockerfile中只有一个ENTRYPOINT和CMD)
③在docker run后面加上输出,ENTRYPOINT指令不会被覆盖,CMD指令会被覆盖
6、RUN命令的优化
目的:减少镜像的层数,减小镜像,把多个RUN命令写在一起
操作:①&&符号(前一个命令执行成功才会执行下一个命令)
RUN yum -y install nginx&&make -j 4&&make install
②;符号(不管前一个命令是否成功,后面的命令都会执行)(不推荐)
RUN yum -y install nginx;make -j 4;make install
③||符号—或(前面的命令执行失败,才会执行后面的命令)(不推荐)
RUN yum -y install nginx||make -j 4||make install
④\—换行。可读性更高
RUN yum -y install nginx\
&&make -j 4\
&&make install
7、COPY和ADD区别
(1)共同点:COPY和ADD都可以把本地文件复制到镜像中,但官方推荐复制使用COPY
(2)不同点:ADD可以解压。若是一个压缩文件,ADD在复制后会自动解压(只支持tar.gz和tar.bz2);支持URL下载源文件,不能解压,通过URL拷贝的文件无法自动解压
COPY只能复制本地文件,不能解压,不支持URL路径
8、基于centos7构建一个apache的dockerfile(编译安装)
(1)环境准备
(2)创建基础镜像Dockerfile
MAINTAINER声明作者
-D指定运行方式
FOREGROUND前台运行
如果yum安装报错,重启docker
(3)创建容器
9、基于镜像的二次构建(很少用)
10、基于centos7构建一个nginx的dockerfile(编译安装)
(1)创建基础镜像Dockerfile
mkdir nginx
vim Dockerfile
(2)构建镜像
docker build -t nginx:1.22.0 .
(3)创建容器
docker run -itd --name nginx -p 80:80 nginx:1.22.0
注意:一定要指定端口-p 80:80,否则本地无法访问
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!