Linux企业部分:Docker镜像的构建及优化

  • Docker镜像的构建及优化
  • 1.镜像的分层结构
  • 2.镜像的构建
  • (1) 拉取镜像
  • (2)用Dockerfile构建镜像
  • 3.镜像的优化


Docker镜像的构建及优化

1.镜像的分层结构

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_linux

1、共享宿主机的kernel;

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

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

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

5、Copy-on-Write 可写容器层;

6、容器层以下所有镜像层都是只读的;

7、docker从上往下依次查找文件;

8、容器层保存镜像变化的部分,并不会对镜像本身进行任何修改;

9、一个镜像最多127层。

2.镜像的构建

docker commit 构建新镜像三部曲:运行容器,修改容器,将容器保存为新的镜像。
缺点:1、效率低、可重复性弱、容易出错。2、 使用者无法对镜像进行审计,存在安全隐患

(1) 拉取镜像

docker pull busybox
docker images
docker run -it --name demo busybox
docker ps -a 
docker rm demo
docker run -it --name demo busybox

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_docker_02

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_03

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_docker_04

第一种创建镜像的方式,当删掉镜像,重启镜像时,历史记录已经不存在,那么我们需要通过容器提交镜像,查看比较busybox和demo:v1可以看到demo:v1是在busybox镜像的基础上新加了一层

docker run -it --name demo busybox   
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch file1
/ # touch file2
/ # touch file3
/ # touch file4
/ # touch file4
/ # touch file5
/ # ls
bin    dev    etc    file1  file2  file3  file4  file5  home   proc   root   sys   
docker commit demo demo:v1  #通过容器提交
docker images demo:v1
docker history busybox:latest
docker history demo:v1

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_运维_05

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_06

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_07

当删除demo镜像后,重启镜像demo:v1后,会发现原来的内容仍然存在

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_08

(2)用Dockerfile构建镜像

1、dockerfile有审计功能,每新加一层镜像都会有动作审计说明;
2、dockerfile不能放在根下,否则会把根下所有数据发送给docker引擎

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

创建docker目录,在目录中建立编辑dockerfile
cd ~

mkdir  docker
vim Dockerfile

FROM busyboxRUN touch file1RUN echo "hello world"

docker build -t demo:v1 .    #使用当前的Dockerfile,创建镜像,标签为demo:v1
docker history demo:v1   #查看指定景象的创建历史,有详细的镜像作记录

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_运维_09

Dockerfile安装nginx镜像:

lftp 172.25.254.250
cd pub/images/
> get rhel7.tar 
exit
docker load -i rhel7.tar 
cd docker/
cp /etc/yum.repos.d/dvd.repo .
lftp 172.25.254.250
/> cd pub/docs/lamp/
> get nginx-1.21.1.tar.gz
> exit

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_docker_10

vim Dockerfile

FROM rhel7COPY dvd.repo /etc/yum.repos.d/

ADD nginx-1.21.1.tar.gz /mnt

WORKDIR "/mnt/nginx-1.21.1"

RUN rpmdb --rebuilddb

RUN yum install -y gcc pcre-devel zlib-devel

RUN ./configure --prefix=/usr/local/nginx

RUN yum install -y make

RUN make

RUN makexinstall

EXPOSE 80

VOLUME ["/usr/local/nginx/html"]

CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

在当前目录使用Dockerfile

docker build -t nginx:v1 .

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_11

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_运维_12

此时nginx镜像的大小为346mb,再看一下直接pull下来的镜像

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_13

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_14

此时nginx镜像的大小为346mb,再看一下直接pull下来的镜像

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_运维_15

直接拉取的nginx镜像为133mb,相比之下dockerfile安装的更占内存,因此需要做镜像优化,选择最精简的基础镜像。

3.镜像的优化

docker load -i base-debian10.tar #安装外网的镜像压缩库

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_linux_16

mkdir new
cd new/

vim Dockerfile
///
FROM nginx as base

ARG Asia/Shanghai

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 build -t webserver:v1 . ##使用当前环境下的Dockerfile

查看优化后的镜像大小:

docker images

Dockerfile 对jar构建镜像一直增加 docker commit构建镜像的优缺点_nginx_17

发现只有32M,占用的内存资源更小。