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,适合来构建镜像