Dockerfile构建镜像

1.Dockerfile简介

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

1.1为何使用Dockerfile构建镜像

例如我们通过镜像部署一个nginx容器,部署完以后,通常运行在默认配置下
可生产环境中默认配置并不能满足我们的需求,此时我们就需要不停的修改nginx的配置
之前的几种修改方式:
1.通过docker exec进入容器内修改
2.通过挂载存储卷,在宿主机内修改,同步容器内nginx的配置
3.在宿主机拷贝nginx配置文件模板,通过docker cp传入nginx容器内并覆盖
4.建立模板nginx容器,每次修改完将该容器提交为新的镜像,利用新镜像重新搭建一个nginx服务
缺点:
1.每次有环境更新,需要修改配置时,都要一遍遍的手动修改,维护复杂
2.修改后的配置文件不一定能直接生效,还需要重启服务
使用Dockerfile构建镜像
dockerfile,相当于是一个文档,我们可以基于dockerfile生成新的容器
dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指令进行自动构建容器,这样只需个性化的修改dockerfile文件然后生成新容器就可以,方便维护
基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成,因此,层越多,效率越低,创建镜像,层越少越好。因此能在一个指令完成的动作尽量通过一个指令定义。

1.2Dcokerfile工作逻辑

首先需要有一个制作镜像的目录,该目录下有个文件,名称必须为Dockerfile,Dockerfile有指定的格式,#号开头为注释,,指令默认用大写字母来表示,以区分指令和参数,docker build读取Dockerfile是按顺序依次Dockerfile里的配置,且第一条非注释指令必须是FROM 开头,表示基于哪个基础镜像来构建新镜像。可以根据已存在的任意镜像来制作新镜像。
Dockerfile可以使用环境变量,用ENV来定义环境变量,变量名支持bash的变量替换,如${variable:-word},表示如果variable变量值存在,就使用原来的变量,变量为空时,就使用word作为变量的值

1.3Dockerfile常用指令

Dockerfile常用指令作用
FROM 指定 base 镜像
MAINTAINER 设置镜像的作者,可以是任意字符串
COPY 将文件从 build context 复制到镜像
ADD与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到目标路径
ENV 设置环境变量,环境变量可被后面的指令使用
EXPOSE 指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来
VOLUME将文件或目录声明为 volume,即将宿主机的目录挂载到容器上,可指定挂载的容器目录位置,但不可指定宿主机目录位置,宿主机目录位于/var/lib/docker/volumes下
WORKDIR为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录
RUN 在容器中运行指定的命令
CMD 容器启动时运行指定的命令,会被启动容器命令run后的参数覆盖掉
ENTRYPOINT 设置容器启动时运行的命令,优先级高于CMD

2.Dockerfile构建镜像实战

2.1构建带完整操作系统的nginx服务

FROM centos:7		#容器搭建为centos7
MAINTAINER Q		#作者为Q
RUN yum -y update		#更新yum仓库所有软件
RUN yum -y install gcc gcc-c++ make pcre-devel zlib-devel	
RUN useradd -M -s /sbin/nologin nginx		
ADD nginx-1.12.2.tar.gz /usr/local/src		#将宿主机本地的该文件导入容器内,ADD会自动解压归档文件,COPY不会
WORKDIR /usr/local/src/nginx-1.12.2		#指定下面的工作目录
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
RUN cp /usr/local/nginx/sbin/* /usr/local/bin
EXPOSE 80			#将80端口暴露出来
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf		#关闭nginx的守护进程,否则会和容器的守护进程冲突
VOLUME ["/usr/local/nginx/html/"]		#将nginx的网页目录挂载到宿主机来,以便写入内容,通过docker volume ls可查看宿主机目录名称及挂载信息
ENTRYPOINT ["nginx"]			#当容器启动时第一时间启动nginx

docker build -t nginx:n1 .		#构建镜像,.代表上下文路径,即当前目录下,Dockerfile文件和需要的文件需在此目录下,或者用-f选项指定Dockerfile文件位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值