dockerfile构建docker镜像
dockerfile介绍
在一些情况下,我们需要自己来构建镜像,而构建镜像一般是通过dockerfile来完成的
dockerfile是一个文本文件,其中包含构建镜像所用的基础镜像及各种指令,应用启动命令
dockerfile组成
名称 | 说明 | 示例 |
|---|---|---|
| FROM | 基础镜像,一切从这里开始构建 | centos:7 alpine:3.18 |
| MAINTAINER | 镜像是谁写的,姓名+邮箱 | |
| RUN | 镜像构建的时候需要运行的命令,如果命令有误则会推出dockerfile | RUN yum -y install gcc-c+ RUN 【command】 || echo "error" 表示执行错误只输出"error"不退出 |
| ENV | 构建的时候设置环境遍量 | ENV va1 test1 |
| ADD | 将本地文件拷贝到容器中 格式: 本地文件路径可以是文件/目录,也可以是一个url:远程下载文件到容器内; | ADD test.sh /opt |
| COPY | 类似ADD,将本地文件拷贝到镜像中 与ADD不同: | |
| WORKDIR | 镜像的工作目录,进入容器时,自动切换的目录路径,可以看作是linux的家目录 | WORKDIR /tomcat |
| VOLUME | 挂载数据卷的目录,如果指定了这个配置项,那么指定的目录在创建容器时会自动挂载到数据卷上 | VOLUME /var/lib/mysql |
| EXPOSE | 声明暴露的端口,只是告知该镜像中的应用暴露出来的端口,并非设置容器内应用的端口 | EXPOSE 8080 |
| CMD | 定义容器启动时要执行的命令及参数,可以被覆盖,如果指定了多个CMD,那么只有最后一个会生效,可被替代 | CMD ["sbin/nginx", "-g", "daemon off;"] CMD ["bash", "-c", "redis/script/redis_start.sh && tail -f redis/log/redis.log"] |
| ENTRYPOINT | 容器启动时要执行的命令和参数,不可被覆盖,可以追加命令 CMD执行的命令会作为参数传递给ENTRYPOINT | Entrypoint": ["docker-entrypoint.sh"] |
| ONBUILD | 当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令 |
dockerfile执行
命令格式:
docker build -f 【执行的dockerfile】 -t 【构建的docker images 名称】:【镜像TAG】 【构建的上下文位置】
注意:
构建上下文位置:构建过程可以引用上下文中的任何文件,构建可以使用COPY或ADD指令来引用上下文中的文件,通俗来说,就是构建镜像开始的相对路径
"."表示从当前路径开始构建
docker build命令参数
参数 | 说明 |
|---|---|
| -t | 指定新镜像的名称及标签信息 |
| -f | 指定Dockerfile文件的路径和文件名 |
| --build-arg | 定义构建时传递给Dockerfile的参数 |
| --no-cache | 在构建过程中不使用缓存 |
| --pull | 在构建过程中拉取最新的镜像 |
| --compress | 使用zlib算法对镜像进行压缩 |
| --squash | 将镜像的历史记录压缩为一个层,减小镜像大小 |
| --target | 从Dockerfile中指定的某个阶段开始构建镜像 |
例:执行dockerfile文件doctest来构建镜像,从本机的docfile目录下开始构建,镜像名称testimage,TAG为1.0
docker build -f doctest -t testimage:1.0 docfile/
docker镜像构建时,会按照dockerfile的内容,依次执行构建命令,"RUN" 中执行的命令有误,那么会退出dockerfile的执行,如果想要忽略错误继续执行,可以指定 "RUN command || echo error"
dockerfile示例
构建nginx镜像
dockerfile1
FROM centos:7
ENV TZ=Asia/Shanghai appv=1.22.1 nginx_dir=/nginx
WORKDIR ${nginx_dir}
##配置yum源
RUN rm -rf /etc/yum.repos.d/*
ADD http://172.25.230.47:19010/file/system/yum/CentOS-Base.repo /etc/yum.repos.d/
ADD http://172.25.230.47:19010/file/system/yum/epel.repo /etc/yum.repos.d/
RUN yum clean all && yum makecache
##下载安装,运行所需插件
RUN yum -y install vim ntpdate ntp net-tools \
wget tree iproute || echo "error"
RUN yum -y install gcc-c++ make
ADD nginx-${appv}.tar.gz /nginx
##建立nginx用户;进入nginx源码包;解压编译所需依赖包
RUN useradd nginx && cd nginx-${appv} && \
tar xvf pcre-8.45.tar.gz && \
tar xvf openssl-1.1.1b.tar.gz && \
tar xvf zlib-1.2.11.tar.gz
##进行nginx编译
RUN cd nginx-${appv} && ./configure \
--prefix=${nginx_dir} \
--sbin-path=${nginx_dir}/sbin/nginx \
--modules-path=${nginx_dir}/modules \
--conf-path=${nginx_dir}/conf/nginx.conf \
--error-log-path=${nginx_dir}/log/error.log \
--http-log-path=${nginx_dir}/log/access.log \
--pid-path=${nginx_dir}/nginx.pid \
--lock-path=$DIR/nginx.lock \
--http-client-body-temp-path=${nginx_dir}/client_temp \
--http-proxy-temp-path=${nginx_dir}/proxy_temp \
--http-fastcgi-temp-path=${nginx_dir}/fastcgi_temp \
--http-uwsgi-temp-path=${nginx_dir}/uwsgi_temp \
--http-scgi-temp-path=${nginx_dir}/scgi_temp \
--with-compat \
--user=nginx \
--group=nginx \
--with-openssl=openssl-1.1.1b \
--with-pcre=pcre-8.45/ \
--with-zlib=zlib-1.2.11/ \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module
##进行make安装
RUN cd nginx-${appv} && make && make install
RUN mkdir -p ${nginx_dir}/conf/vhosts
##复制nginx.conf文件到容器路径下
ADD nginx.conf ${nginx_dir}/conf
##标示对外服务端口为18080
EXPOSE 18080
##指定nginx运行命令
CMD ["/nginx/sbin/nginx", "-g", "daemon off;"]dockerfile2
FROM centos:7
ENV TZ=Asia/Shanghai appv=1.22.1 nginx_dir=/nginx
##提前将nginx编译安装成二进制包,直接将nginx二进制包放到镜像中
ADD docnginx-${appv}.tar.gz /
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN useradd nginx
WORKDIR ${nginx_dir}
EXPOSE 18080
CMD ["sbin/nginx", "-g", "daemon off;"]可以发现,第二种方式构建的镜像比第一种方式构建的镜像要小很多,这样不但占用主机磁盘空间少,创建容器,启停也迅速的多
构建tomcat镜像
FROM centos:7
ENV TZ=Asia/Shanghai appv=8.5.89 tomcat_dir=/tomcat
WORKDIR $tomcat_dir
RUN rm -rf /etc/yum.repos/*
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
ADD tomcat-${appv}.tar.gz /
RUN useradd tomcat && chmod 600 ${tomcat_dir}/bin/{jmxremote.access,jmxremote.password}
CMD ["bin/catalina.sh", "run"]构建redis镜像
FROM centos:7
ENV TZ=Asia/Shanghai appv=6.0.19 redis_dir=/redis
WORKDIR $redis_dir
ADD redis-${appv}.tar.gz /
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN useradd redis && chmod +x redis/script/* && touch redis/log/redis.log
EXPOSE 16379
CMD ["bash", "-c", "redis/script/redis_start.sh && tail -f redis/log/redis.log"]轻量级docker镜像
使用centos或者Ubuntu作为基础镜像进行构建会有一个问题,就是构建后的镜像会很大,这样会过多的占用磁盘空间,不符合docker镜像轻量级的原则。在构建镜像时,镜像越小越好
可以使用alpine作为基础镜像来进行构建,alpine是一个轻量级的linux发行版本,大小只有几MB,适合来构建镜像
