dockerfile创建自定义镜像

2023-12-14 16:40:06

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指令会被覆盖

6RUN命令的优化

目的:减少镜像的层数,减小镜像,把多个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,否则本地无法访问

文章来源:https://blog.csdn.net/2303_79207100/article/details/134926113
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。