docker封装镜像及优化方式

 更新时间:2024年06月11日 10:53:28   作者:weixin_43635039  
这篇文章主要介绍了docker封装镜像及优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

镜像分层结构

1.共享宿主机的kernel

2.base镜像提供的是最小的Linux发行版

3.同一docker主机支持运行多种Linux发行版

4.采用分层结构的最大好处是:共享资源

比如当你已经拉取Nginx 1.17版本的镜像之后,若再次拉取Nginx 1.16 版本时,只需要下载不同的层即可,相同的层可以共享使用,这样就可以节省资源和网络带宽。

当你删除其中某个镜像版本时,也只会删除掉不一样的层,因为其中共享的层另一个版本需要使用。

镜像的构建

运行容器+修改容器+将容器保存为新的镜像

缺点:

  • 效率低、可重复性弱、容易出错
  • 使用者无法对镜像进行审计,存在安全隐患

交互式运行此镜像

-it交互式

删除

docker rm -f 删除正在运行的镜像

运行

新建三个文件

docker ps -a 显示已经停掉的镜像

封装镜像

把刚才创建的三个文件封装到v1,如果只退出docker,不会被删

多加了一层,目前所在的操作都在demo里,而不是busybox

–rm 退出时,自动删除,回收

之前的只封装在最上面一层,删除时也只删除了一层

rmi 是删除镜像

Dockfile

和之前的commit是一一对应的

定制一个首页,放进目录路径里

后面的.代表,从各处寻找文件,建立

会找到之前创建的dockerfile

missing代表在官方构建的,而不是本机执行

相对路径,不能把文件放在根底下,最好创建一个空的文件夹比如/docker

换一个centos镜像

如果直接ctrl+d就会删除,ctrl+q+p之后,就会暂时保存。attach又会恢复

dockerfile常用命令

FROM

  • 指定base镜像
  • 如果本地不存在会从远程仓库下载

MAINTAINER

  • 设置镜像的作者

COPY

  • 把文件从build context复制到镜像
  • 支持两种形式:COPY src dest 和 COPY [“src”, “dest”]

ADD

  • 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到
  • dest,也可以自动下载URL并拷贝到镜像:
ADD html.tar /var/www
ADD http://ip/html.tar /var/www

ENV

  • 设置环境变量,变量可以被后续的指令使用:
ENV HOSTNAME sevrer1.example.com

EXPOSE

  • 如果容器中运行应用服务,可以把服务端口 暴露出去:
  • EXPOSE 80

VOLUME

  • 申明数据卷,通常指定的是应用的数据挂在点:
VOLUME [“/var/www/html”]

WORKDIR

  • 为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当
  • 前工作目录,如果目录不存在会自动创建。

在宿主机自动创建目录,挂载在容器内

删除之后还在,卷的目的就是持久化

在centos7中创建

shell和exec的区别

cmd可以被覆盖

做一个完整的nginx封装

FROM centos:7
ADD nginx-1.21.1.tar.gz /mnt
RUN yum install -y gcc make pcre-devel openssl-devel
WORKDIR /mnt/nginx-1.21.1
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
COPY index.html /usr/local/nginx/html
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

镜像的优化

太大了,开始优化

减少镜像层

FROM centos:7
ADD nginx-1.21.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.1
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc &&  ./configure --with-http_ssl_module --with-http_stub_status_module &&  make &&  make install && yum clean all  && rm -rf /mnt/nginx-1.21.1
COPY index.html /usr/local/nginx/html
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

报错

添加:net.ipv4.ip_forward=1

多阶段构建

FROM centos:7 as build
ADD nginx-1.21.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.1
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc &&  ./configure --with-http_ssl_module --with-http_stub_status_module &&  make &&  make install && yum clean all  && rm -rf /mnt/nginx-1.21.1
FROM centos:7
COPY --from=build  /usr/local/nginx /usr/local/nginx
COPY index.html /usr/local/nginx/html
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

选择更加精简的基础镜像

FROM nginx:latest as base

ARG TIME_ZONE
RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /usr/sbin/nginx-debug /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base-debian10

COPY --from=base /opt /

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Docker搭建私有GitLab的两种方案

    使用Docker搭建私有GitLab的两种方案

    本文给大家分享两种Docker搭建私有GitLab的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • docker打包golang应用的过程分析

    docker打包golang应用的过程分析

    这篇文章主要介绍了docker打包golang应用的过程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 阿里云服务器部署 Docker Swarm集群

    阿里云服务器部署 Docker Swarm集群

    这篇文章主要介绍了阿里云服务器部署 Docker Swarm集群,Docker Swarm 的作用就是用来管理Docker集群的平台,本文给大家介绍了Docker Swarm的基本概念和Docker Swarm 和 k8s的区别,需要的朋友可以参考下
    2022-07-07
  • 聊聊kubernetes1.20用containerd替换docker(shim)的问题

    聊聊kubernetes1.20用containerd替换docker(shim)的问题

    这篇文章主要介绍了kubernetes1.20用containerd替换docker(shim),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Docker没有启动环境变量的问题解决

    Docker没有启动环境变量的问题解决

    在使用Docker容器时,有时候我们会遇到一个问题,就是在容器中没有启动环境变量,本文主要介绍了Docker没有启动环境变量的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 详解Docker创建php开发环境遇到的权限问题解决方案

    详解Docker创建php开发环境遇到的权限问题解决方案

    本篇文章主要介绍了Docker创建php开发环境遇到的权限问题解决方案,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Jenkins Docker静态agent节点的构建过程

    Jenkins Docker静态agent节点的构建过程

    这篇文章主要介绍了Jenkins Docker静态agent节点的构建,静态节点就是通过java -jar这条命令去启动起来就可以了,本文通过图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • 详解使用docker搭建kafka环境

    详解使用docker搭建kafka环境

    本篇文章主要介绍了详解使用docker搭建kafka环境 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Docker 数据管理Named volume详解

    Docker 数据管理Named volume详解

    这篇文章主要介绍了Docker 数据管理Named volume详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 详解制作各种docker镜像

    详解制作各种docker镜像

    本篇文章主要介绍了制作各种docker镜像,详解的介绍了各种制作的docker镜像的方法,有兴趣的可以了解一下
    2017-05-05

最新评论