目录
MAINTANIER(depreacted)已经替换为LABEL
有些镜像不能满足我们的生产环境的需要就需要自己来制作镜像;制作镜像有两种方式:
1、基于镜像【修改容器: 自定义容器】
缺点所有的配置都是写死的不能灵活配置【假设我们需要三个镜像:测试,开发,线上配置都是不相同,实现起来配置是很麻烦的,都需要重新制作】;
事实上docker在配置文件山解决方案是:
nginx这个镜像启动为容器后只做一件事情,配置一个虚拟主机,提供一个虚拟Server,它所服务主机名、家目录、监听的端口,文档根目录,在什么时候?由于配置的环境影响可能可不一样,当时它的配置文件格式是相同的,那么我们就可以走把配置文件生成类似于模板一样放在特定地方
为了文件生成起来更加简单我们对内部增加接受变量,变量替换
server.conf /etc/nginx/conf.d/
{
server_name $NGX_SERVER_NAME;
lister $NGX_IP:$NGINX_PORT;
root $DOC_ROOT;
}
在容器内部的主进程启动之前先启动别的程序,这个程序根据镜像中的文件,以及镜像启动时向容器传递的环境变量【参数】,这个程序把用户传进来的环境变量【参数】进行替换并保存在/etc/nginx/conf.d/ 下,保存完了由这个程序在启动主进程【由一个程序启动另一个程序,并替换当前进程:exec】;这种过程从某种意义来说更加复杂了,因为配置过程都是看不见的
LInux的哲学思想用文本文件保存程序配置文件,用文本编辑器就可以做到配置所有的容器;在容器化的时候这种已经被颠覆了,不建议该配置文件,而是通过环境变量来配置文件
2、基于Dockerfile
Dockerfile是什么?其实是用来构建Docker镜像的源码【仅仅是一些文本指令】,调用一些命令生成一个image,所以从这个角度来说dockerfile就是一个纯文本文件里面包含了一些指令而已,在制作dockerfile中规定的所支持的命令【一二十个指令】堆叠起来
Dockerfile的语法格式
#:开头 | 注释 |
指令(大写:不区分大小写,但建议大写)+参数 | 一行一个指令 |
顺序执行指令,但是整个Dockerfile文件第一个非注释行,必须是From基于某个已存在的基础镜像来做 |
1、Dockerfile制作时:必须在某一个特定的目录,Dockerfile文件首字母必须大写;必须有Dockerflile文件;要打包镜像的文件打包好后必须放在该目录下;Dockrfile还支持隐藏文件【.dockeringore】在该文件中路径中,打包过程中都不包含该路径下的文件;
Dockerfile 指令和环境变量的应用
制作dockerfile文件命令是docker build;docker build制作的基础是基于底层镜像所提供给我们的命令
1、引用环境变量:$variable_name 或${variable_name}
2、引用环境变量:${variable: - word}:如果这个变量不存在或空,就引用是用word这个变量的值
3、引用环境变量:${variable: + word}:如果变量存在显示word,不存在显示空
FROM 指令
1、FROM指令是最重的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为印象文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境
2、事件中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker 主机上查找指定的镜像文件,在其不存在时,则会从Dockers Hub Registry上拉取所需的镜像文件【如果找不到指定的镜像文件,docker build会返回一个错误信息】
语法(Syntax)
- FROM <repository> [:<tag>] 或 FROM <repository>@