当前位置:   article > 正文

docker(安装、镜像的建立、加速和优化)_加快镜像创建的速度

加快镜像创建的速度

一、docker简介:

  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
  • 传统虚拟化与容器技术对比:
    在这里插入图片描述官网链接:点击这里

二、docker安装:

1、软件仓库部署:

部署docker仓库

[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# vim docker.repo
[root@server1 yum.repos.d]# cat docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable
gpgcheck=0

[root@server1 yum.repos.d]# yum install -y docker-ce
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

安装时出现较为复杂的依赖性,所以需要下载centos仓库:

在这里插入图片描述centos仓库部署
不同版本的可以进入aliyun镜像站下载。

[root@server1 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@server1 yum.repos.d]# ls
CentOS-Base.repo  docker.repo  dvd.repo  redhat.repo
[root@server1 yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@server1 yum.repos.d]# vim CentOS-Base.repo  #实验所用redhat企业版需要更改yum源,做如下更改。
:%s/$releasever/7/g

[root@server1 yum.repos.d]# yum install -y docker-ce #再次下载解决了依赖性
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

2、安装部署:

[root@server1 ~]# systemctl start docker.service 
[root@server1 ~]# systemctl enable docker.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@server1 ~]# docker info #查看仓库信息

远程下载镜像:
[root@server1 ~]# docker search yakexi007
NAME                 DESCRIPTION   STARS     OFFICIAL   AUTOMATED
yakexi007/game2048                 0                    
yakexi007/mario                    0                    
yakexi007/nginx                    0  
[root@server1 ~]# docker pull yakexi007/game2048
[root@server1 ~]# docker run -d --name demo -p 80:80 yakexi007/game2048 #加了地址映射后即可访问172.25.4.1玩游戏嘻嘻嘻. 因为下载速度慢,没有实际演示。
[root@server1 ~]# docker ps
[root@server1 ~]# docker rm -f demo

本地下载镜像:
[root@server1 ~]# docker load -i mario.tar
[root@server1 ~]# docker images
[root@server1 ~]# docker run -d --name demo -p 80:8080 mario
[root@server1 ~]# docker ps
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述测试:
在这里插入图片描述

3、镜像加速:

登陆阿里云进入控制台,安步骤操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
key.json
[root@server1 docker]# vim daemon.json
[root@server1 docker]# cat daemon.json
{
  "registry-mirrors": ["https://u8pcii6z.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl restart docker

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

三、docker镜像:

命令功能
docker search nginx查询nginx
docker pull nginx拉取镜像
docker history nginx查看nginx包含的镜像层
docker images查看系统中所有的镜像
docker ps查看正在运行的进程, -a 参数是显示所有的进程
docker rmi 镜像名称删除指定镜像
docker rm 容器删除指定的容器
docker commit命令将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像
docker load -i rhel7.tar用load可以加载本地的镜像
docker inspect 容器名称查看指定容器的详细信息
docker history 镜像名称查看指定镜像构造容器所经历的镜像层
ctrl + p +q将该进程打入后台

1、镜像的分层结构:

  • 共享宿主机的kernel
  • base镜像提供的是最小的Linux发行版
  • 同一docker主机支持运行多种Linux发行版
  • 采用分层结构的最大好处是:共享资源
  • Copy-on-Write 可写容器层
  • 容器层以下所有镜像层都是只读的
  • docker从上往下依次查找文件
  • 容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
  • 一个镜像最多127层

2、镜像的构建:

直接创建

[root@server1 docker]# docker pull busybox
[root@server1 docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    b97242f89c8a   10 days ago   1.23MB
[root@server1 docker]# docker run -it --name test busybox
/ # echo helloworld > testfile
[root@server1 docker]# docker commit  test test:v1
sha256:518ca9c2375bf08eef3a4d8cb98a9e6b4d21d8e15bb006a1ca98e229d3c89fac
[root@server1 docker]# docker images test:v1
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
test         v1        518ca9c2375b   6 seconds ago   1.23MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Dockerfile建立镜像

[root@server1 ~]# mkdir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN echo helloworld > testfile
[root@server1 docker]# docker build -t demo:v1 .
[root@server1 docker]# docker images
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

[root@server1 docker]# docker history demo:v1 #查看镜像分层结构
  • 1

在这里插入图片描述
镜像的缓存特性

[root@server1 docker]# vim file2
[root@server1 docker]# ls
Dockerfile  file2
[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN echo helloworld > testfile
COPY file2 /
[root@server1 docker]# docker build -t demo:v2 .
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

四、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/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指令设置镜像中的当前工作目录,如果目录不存在会自动创建
RUN在容器中运行命令并创建新的镜像层,常用于安装软件包:RUN yum install -y vim
CMD 与 ENTRYPOINT这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。docker run后面的参数可以传递给ENTRYPOINT指令当作参数。Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。

RUN、COPY:

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
[root@server1 docker]# vim index.html
[root@server1 docker]# docker build -t demo:v1 .
[root@server1 docker]# docker run -it --rm demo:v1 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
ADD

[root@server1 docker]# tar zcf test.tar.gz /etc
tar: Removing leading `/' from member names
[root@server1 docker]# ls
Dockerfile  index.html  test.tar.gz
[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
[root@server1 docker]# docker build -t demo:v2 .
[root@server1 docker]# docker run -it --rm demo:v2 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述
ENV

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
[root@server1 docker]# docker build -t demo:v3 .
[root@server1 docker]# docker run -it --rm demo:v3 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
EXPOSE:暴露容器内的应用端口(需要应用型镜像,比如nginx)

[root@server1 docker]# docker pull nginx #需要做上文的镜像加速,否则速度会很慢
[root@server1 docker]# docker images
  • 1
  • 2

在这里插入图片描述

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE  80
[root@server1 docker]# docker run -d --name demo -P nginx
aff8f3b00d28a0b47ee8516699da760589cb4c82c389002ac1d357e0509c297a
[root@server1 docker]# docker inspect demo  #查看容器的全部信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

在这里插入图片描述

VOLUME

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE  80
VOLUME ["/data"]
[root@server1 docker]# docker build -t demo:v5 .
[root@server1 docker]# docker run -it --name demo demo:v5 # 此处不要--rm参数,数据要保留
/ # cd /data
/data # touch docker1 #用ctrl+q+p挂起,不要退出容器
[root@server1 docker]# docker inspect demo

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

[root@server1 docker]# cd /var/lib/docker/volumes/cb33667630db3b2dca941de7b386b9235351cb028ea9e15cd4fa8a44404301d3/_data
[root@server1 _data]# ls
docker1
[root@server1 _data]# touch docker2
[root@server1 _data]# docker attach demo 
/data # ls
docker1  docker2
/data # 
[root@server1 _data]# docker rm demo 
demo
[root@server1 _data]# docker volume ls # 查看卷
[root@server1 _data]# docker volume prune # 删除没有被占用的卷
[root@server1 _data]# docker volume ls 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述
在这里插入图片描述
CMD和ENTRYPOINT
两者都指镜像运行时执行的命令,CMD会被覆盖,ENTRYPOINT不会被覆盖。
在这里插入图片描述
格式问题:

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE  80
VOLUME ["/data"]
CMD echo "$HOSTNAME"  
[root@server1 docker]# docker build -t demo:v6 .
[root@server1 docker]# docker run  --rm demo:v6
server1

Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而下面的exec格式不会
[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE  80
VOLUME ["/data"]
CMD ["echo", "$HOSTNAME"]
[root@server1 docker]# docker build -t demo:v7 .
[root@server1 docker]# docker run  --rm demo:v7
$HOSTNAME

改写成以下形式即可解析:
CMD ["/bin/sh", "-c", "echo $HOSTNAME"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

覆盖问题:

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE  80
VOLUME ["/data"]
ENTRYPOINT ["echo", "hello"]
CMD ["world"]
[root@server1 docker]# docker build -t demo:v8 .
[root@server1 docker]# docker run  --rm demo:v8
hello world
[root@server1 docker]# docker run  --rm demo:v8  linux    #docker run提供的参数只覆盖了CMD命令的输出‘world’
hello linux
[root@server1 docker]# docker run  --rm demo:v8  redhat
hello redhat
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

注:Exec格式时,ENTRYPOINT可以通过CMD提供额外参数,CMD的额外参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数。

ENTRYPOINT echo "hello"
CMD "world"
将Dockerfile中输出内容替换为shell格式
  • 1
  • 2
  • 3

ENTRYPOINT将会忽略一切额外参数:
在这里插入图片描述

五、镜像的优化:

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

本次实验没有用base基础包,用的是rhel7,做一个nginx镜像:

[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   # 此处为减少镜像层数将命令用&&连接,清理了gcc、make、/mnt/nginx-1.18.0这些中间产物

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;"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

又使用了base包(下载地址),需要导入 :base-debian10

[root@server1 docker]# vim 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;"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

在这里插入图片描述
手动编写的nginx镜像大小为144M,因为rhel7基础镜像大小为140M,base建立的镜像大约为31.7M。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/58030
推荐阅读
相关标签
  

闽ICP备14008679号