当前位置: 代码网 > 服务器>服务器>云虚拟主机 > docker封装镜像及优化方式

docker封装镜像及优化方式

2024年07月05日 云虚拟主机 我要评论
镜像分层结构1.共享宿主机的kernel2.base镜像提供的是最小的linux发行版3.同一docker主机支持运行多种linux发行版4.采用分层结构的最大好处是:共享资源比如当你已经拉取ngin

镜像分层结构

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;"]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com