docker镜像优化

基础镜像制作

        环境目录

[root@server1 docker]# ls
Dockerfile  dvd.repo  index.html  nginx-1.19.1.tar.gz  rhel7.tar
[root@server1 docker]# pwd
/root/docker

        导入rhel7镜像

[root@server1 docker]# docker load -i rhel7.tar 
[root@server1 docker]# docker images
rhel7                             latest                           0a3eb3fde7fd        7 years ago         140MB

 

创建交互式容器,用于测试命令

[root@server1 docker]# docker run -it --name demo4 rhel7 bash
bash-4.2# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
bash-4.2# 

        删除demo4

[root@server1 docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
9d08c4f92a80        rhel7               "bash"              About a minute ago   Exited (0) 45 seconds ago                       demo4
58d3a3966918        busybox             "sh"                3 hours ago          Up 3 hours                                      demo2
846785f0e9d3        busybox             "sh"                46 hours ago         Up 46 hours                                     demo
[root@server1 docker]# docker rm -f demo4
demo4

创建dockerfile文件

[root@server1 docker]# cat dockerfile 
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD  nginx-1.20.1.tar.gz  /mnt
RUN  rpmdb --rebuilddb
RUN  yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@server1 docker]# pwd
/root/docker

        生成镜像,如果遇到错误进行修改,不修改中断内容之上的部分,则再次built会在上次基础上运行

[root@server1 docker]# docker build -t rhel7:v1 .

##docker build 命令用于使用 Dockerfile 创建镜像。

         创建容器demo_rhel7

[root@server1 docker]# docker run -d --name demo_rhel7 rhel7:v1
dfe850790ccabb8b78887309fc6119e7e259a979dbb2028c0c62fda1b030de0a

         查看demo_rhel7 容器信息

        

[root@server1 docker]# docker inspect  demo_rhel7 


###docker inspect : 获取容器/镜像的元数据。

访问docker给nginx分配的ip

[root@server1 docker]# curl 172.17.0.4

 是由于数据挂载在真实主机路径上,真实路径上没有数据,无法访问到内容

进入真实路径创建index.html

[root@server1 docker]# cd /var/lib/docker/volumes/7fb5d3088952e81dc7268a521e7b913875930ffd71b75bf3781decb3617c7aa5/_data
[root@server1 _data]# echo "hello server1" > index.html

 由此获取到的镜像可以在任何一台主机上使用,因为已经具备封装好的环境及软件        但是rhel7:v1 比原镜像大了一倍多.不符合轻量化的原则,因此需要进行优化

[root@server1 _data]# docker images 
REPOSITORY                        TAG                              IMAGE ID            CREATED             SIZE
rhel7                             v1                               fa7157d77d25        20 minutes ago      303MB
rhel7                             latest                           0a3eb3fde7fd        7 years ago         140MB

层级结构优化及空间清理

        在脚本中每一行都会是一层结构,最有效的方法是把 命令撮合到一起没有冗余 来减少结构层数

[root@server1 docker]# cat Dockerfile 
FROM rhel7 
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD  nginx-1.20.1.tar.gz  /mnt
WORKDIR /mnt/nginx-1.20.1
RUN  rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null &&  make &> /dev/null &&  make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

优化脚本

清除系统缓存及nginx编译目录

rm -rf /mnt/nginx-1.20.1 /var/cache/*

生成rhel7:v2镜像

 查看 rhel7:v1   与 rhel7:v2   大小     缩小了50M左右

迁移源镜像

通过v2配置参数修改镜像,此时镜像内的环境除了nginx的运行环境还包括为了编译nginx而部署的环境,待nginx部署完毕,将该镜像上的nginx移植到只用运行环境的rhel7源镜像,从而达到节省空间目的。

FROM rhel7 as build
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD  nginx-1.20.1.tar.gz  /mnt
WORKDIR /mnt/nginx-1.20.1
RUN  rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null &&  make &> /dev/null &&  make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

FROM rhel7
COPY --from=build /usr/local/nginx  /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

制作 rhel7:v3镜像

[root@server1 docker]# docker build -t rhel7:v3 .

 docker images 查看镜像大小变化

 使用最精简的镜像

        

[root@server1 docker]# docker run -it --rm rhel7:v3 bash

 准备base-debian10.tar

[root@server1 docker]# ls
base-debian10.tar  Dockerfile  dvd.repo  index.html  nginx-1.20.1.tar.gz  rhel7.tar

编写脚本 Dockerfile

准备 文件 base-debian10.tar

指定文件生成镜像   脚本编写要用

[root@server1 ~]# ls
base-debian10.tar  busybox.tar  docker  game2048.tar  harbor-offline-installer-v1.10.1.tgz  mario.tar
[root@server1 ~]# docker load -i base-debian10.tar
de1602ca36c9: Loading layer [==================================================>]  3.041MB/3.041MB
1d3b68b6972f: Loading layer [==================================================>]  17.77MB/17.77MB
Loaded image: gcr.io/distroless/base-debian10:latest


[root@server1 docker]# docker images 
REPOSITORY                        TAG                              IMAGE ID            CREATED             SIZE

gcr.io/distroless/base-debian10   latest                           d48fcdd54946        51 years ago        19.2MB
[root@server1 docker]# cat Dockerfile 
FROM nginx:latest as base

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

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

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

倒数第四行FROM 修改为你刚刚创建的镜像的 REPOSITORY  名称

 执行完成  docker images 查看rhel7 4类型的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值