docker镜像的构建及Dockerfile的详解应用,镜像加速器,镜像优化

1.镜像的构建

1.1创建一个Dockerfile

在这里插入图片描述
在这里插入图片描述

1.2构建镜像

[root@server1 docker]#docker build -t demo:v1 /root/docker/Dockerfile

在这里插入图片描述

1.3查看镜像的分层结构

docker history demo:v1
在这里插入图片描述

1.4镜像的缓存特性

在这里插入图片描述

2.Dockerfile详解

官方文档帮助
https://github.com/kyos0109/nginx-distroless/blob/master/Dockerfile

dockerfile的常用指令

FROM 指定base镜像,如果本地不存在会从远程仓库下载
MAINTAINER 设置镜像的作者,比如用户邮箱等
COPY 把文件从build context复制到镜像支持两种形式:COPY src dest 和 COPY [“src”, “dest”],src必须指定build context中的文件或目录
ADD 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:ADD html.tar /var/wwwADD 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指令设置镜像中的当前工作目录,如果目录不存在会自动创建
RUN 在容器中运行命令并创建新的镜像层,常用于安装软件包:RUN yum install -y vim
CMD 与 ENTRYPOINT 这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,ENTRYPOINT不会被忽略,一定会被执行。````docker run后面的参数可以传递给ENTRYPOINT指令当作参数。Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。

ADD
在这里插入图片描述

[root@server1 docker]# cat Dockerfile
FROM busybox
ADD test.tar.gz /mnt 当包传上去之后会自动解压

docker build -t demo:v3 .

-it 交互式
–name指定名字
demo:v3镜像
在这里插入图片描述
ENV
[root@server1 docker]# cat Dockerfile
FROM busybox
ENV HOSTNAME server1
docker build -t demo:v4 .
在这里插入图片描述
CMD
在这里插入图片描述
CMD ENTRYPOINT
在这里插入图片描述
在这里插入图片描述
ctrl+d 退出交互式环境,直接结束进程
crtl+p+q 退出交互式环境,让其在后台运行 ,
在这里插入图片描述
VOLUME
[root@server1 docker]# cat Dockerfile
FROM busybox
VOLUME ["/data"]

在这里插入图片描述
[root@server1 docker]# docker volume ls
DRIVER VOLUME NAME
local df16795ac170396bc2ca2f954ed05a72877ff81e3b984a368b0917e3ecaa55ce
[root@server1 docker]# docker volume prune 没用的进行回收

[root@server1 docker]# cd /var/lib/docker/volumes/
[root@server1 volumes]# ls
backingFsBlockDev metadata.db

docker run -it --rm nginx bash

3.镜像加速器

在网络镜像库中下载镜像时,使用镜像加速器大大提高了速度

注册阿里云,—控制台—产品与服务----镜像站服务—镜像加速器

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
在这里插入图片描述
根据帮助文档操作
在这里插入图片描述

4.镜像优化

1.选择最精简的基础镜像
2.减少镜像的层数
3.清理镜像构建的中间产物
4.注意优化网络请求
5.尽量去用构建缓存
6.使用多阶段构建镜像

eg:

优化nginx镜像库

帮助文档

https://github.com/kyos0109/nginx-distroless/blob/master/Dockerfile

[root@server1 docker]# cat Dockerfile 
FROM nginx:1.18.0 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;"]

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方案二.清理镜像构建的中间产物,使用多阶段构建镜像,选择最精简的基础镜像

[root@server1 docker]# cat Dockerfile 
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.18.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.18.0
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make &&  yum clean all

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

5.镜像常用子命令

images 显示镜像列表
history 显示镜像构建历史
commit 从容器创建镜像
build 从Dockerfile构建镜像
tag 给镜像打标签
search 搜索镜像
pull 从仓库拉取镜像
push 上传镜像到仓库
rmi 删除镜像

猜你喜欢

转载自blog.csdn.net/ninimino/article/details/113145015