文章目录

  • 前言
  • 一、docker镜像优化
  • 二、Docker仓库
  • 配置镜像加速器
  • 搭建私有仓库并添加证书加密


前言

由于我们使用dockerfile进行镜像的构建虽然可以正常使用,但是相比于官方镜像还是过于冗杂,所以我们要进行镜像的优化

一、docker镜像优化

我们首先优化镜像可以减少它的层数,也就是将原来的几个层用&&连接来变成一个层,在编译完成之后可以删除yum缓存,以及镜像包,从而达到优化镜像的目的,我们可以看到经过这样的操作,比之前我们的478M减少了不少,说明达到了目的

[root@docker1 docker]# docker images nginx
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        v1        3a67b9aaf157   34 seconds ago   317MB
nginx        latest    51086ed63d8c   2 weeks ago      142MB
[root@docker1 docker]# cat Dockerfile 
FROM centos:7
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR	/mnt/nginx-1.21.6
RUN yum install -y gcc openssl-devel pcre-devel make && 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 -fr /mnt/nginx-1.21.6
COPY index.html /usr/local/nginx/html
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

我们也可以采用多阶段构建来达到优化镜像的目的,可以看到v2比v1小了100
M左右,说明达到了目的

[root@docker1 docker]# docker images nginx
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        v2        c777c8120e74   3 seconds ago   205MB
nginx        v1        3a67b9aaf157   9 minutes ago   317MB
nginx        latest    51086ed63d8c   2 weeks ago     142MB
[root@docker1 docker]# cat Dockerfile 
FROM centos:7 as build
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR	/mnt/nginx-1.21.6
RUN yum install -y gcc openssl-devel pcre-devel make && 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 -fr /mnt/nginx-1.21.6

FROM centos:7
COPY --from=build /usr/local/nginx /usr/local/nginx
COPY index.html /usr/local/nginx/html
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

当然,我们想更大程度的优化,就需要找到更加小的底层base,比如下面这个镜像,封装完成就只有33MB,足够的小,而且能够成功运行,达到了我们的优化目标

[root@docker1 new]# docker images
REPOSITORY                        TAG       IMAGE ID       CREATED          SIZE
nginx                             v4        5efc50772cb8   24 seconds ago   33.8MB
<none>                            <none>    20f4365b8b21   25 seconds ago   155MB
nginx                             v3        0be1cbf8ecd3   21 hours ago     78.8MB
ubuntu                            latest    cdb68b455a14   36 hours ago     77.8MB
nginx                             v2        c777c8120e74   2 days ago       205MB
nginx                             v1        3a67b9aaf157   2 days ago       317MB
<none>                            <none>    a36ad28b53f0   4 days ago       475MB
<none>                            <none>    b871d85284df   4 days ago       474MB
nginx                             latest    51086ed63d8c   3 weeks ago      142MB
busybox                           latest    ff4a8eb070e1   3 weeks ago      1.24MB
centos                            7         eeb6ee3f44bd   13 months ago    204MB
yakexi007/game2048                latest    19299002fdbe   5 years ago      55.5MB
gcr.io/distroless/base-debian11   latest    24787c1cd2e4   52 years ago     20.3MB
Successfully built 93c9043dd3fe
Successfully tagged nginx:v4
[root@docker1 new]# docker run -d --name demo nginx:v4
4ced6090dc2244e18f204aec18bb93823d85eb2444f15759e35e580682991e55
[root@docker1 new]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS     NAMES
4ced6090dc22   nginx:v4   "/docker-entrypoint.…"   5 seconds ago   Up 3 seconds   80/tcp    demo
[root@docker1 new]# 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 /usr/lib/x86_64-linux-gnu/libpcre* /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

二、Docker仓库

可以用下面这个方式将我们刚刚封装好的镜像输出为tar包,如果系统上暂时没有这个镜像,那我们可以使用docker load -i将tar包导入

**[root@docker1 ~]# docker save -o nginx-v4.tar nginx:v4
[root@docker1 ~]# ls
anaconda-ks.cfg  base-debian11.tar  docker  nginx-v4.tar
**

配置镜像加速器

首先在阿里云上复制自己的镜像加速器地址,然后写入文件,重启docker就完成了配置

[root@docker1 ~]# systemctl daemon-reload 
[root@docker1 ~]# systemctl restart docker
[root@docker1 ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors":["https://lrt6zeoe.mirror.aliyuncs.com"]
}

搭建私有仓库并添加证书加密

我们搭建私有仓库的原因是docker hub虽然很方便,但是存在很多限制,比如需要互联网的连接,速度慢,所有人都可以访问,不安全,而且会由于安全原因企业不允许将镜像放到外网。所以我们需要搭建私有仓库
首先拉取registry

[root@docker1 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete 
0d96da54f60b: Pull complete 
5b27040df4a2: Pull complete 
e2ead8259a04: Pull complete 
3790aef225b9: Pull complete 
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

做一个端口映射,并且挂载宿主机的一个目录

[root@docker1 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
c1a3b20fe38dfcb4f5e2c4e01923c6f5eea20d2dc7650c4a9c5def9ec4d7ca2f

首先上传一个镜像到我们的私有仓库

[root@docker1 ~]# docker tag yakexi007/game2048:latest localhost:5000/game2048:latest
[root@docker1 ~]# docker push localhost:5000/game2048
Using default tag: latest
The push refers to repository [localhost:5000/game2048]
88fca8ae768a: Pushed 
6d7504772167: Pushed 
192e9fad2abc: Pushed 
36e9226e74f8: Pushed 
011b303988d2: Pushed 
latest: digest: sha256:8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390 size: 1364

我们使用tree命令就可以查看我们的镜像层

.
└── registry
    └── v2
        ├── blobs
        │   └── sha256
        │       ├── 19
        │       │   └── 19299002fdbedc133c625488318ba5106b8a76ca6e34a6a8fec681fb54f5e4c7
        │       │       └── data
        │       ├── 3f
        │       │   └── 3f120f6a2bf86552ccf8aeff9ea5f3b1e79047656cdc636bf58d1f3ca0ea1cab
        │       │       └── data
        │       ├── 4b
        │       │   └── 4ba4e6930ea5b57ba9d06cb23105f37de40f2678c385db1cddee560b47a1a4b9
        │       │       └── data
        │       ├── 53
        │       │   └── 534e72e7cedcc7f1a7643fa9ec34706f32de866e663874a1f58bdd059ccd859d
        │       │       └── data
        │       ├── 8a
        │       │   └── 8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390
        │       │       └── data
        │       ├── f6
        │       │   └── f62e2f6dfeef60a2983e8794e3de4f369de740d6cea09f72647988edf287c49d
        │       │       └── data
        │       └── fe
        │           └── fe7db6293242e96deb130e0cd1d729ac3f94ed086fc9e414587f369b81c42580
        │               └── data
        └── repositories
            └── game2048
                ├── _layers
                │   └── sha256
                │       ├── 19299002fdbedc133c625488318ba5106b8a76ca6e34a6a8fec681fb54f5e4c7
                │       │   └── link
                │       ├── 3f120f6a2bf86552ccf8aeff9ea5f3b1e79047656cdc636bf58d1f3ca0ea1cab
                │       │   └── link
                │       ├── 4ba4e6930ea5b57ba9d06cb23105f37de40f2678c385db1cddee560b47a1a4b9
                │       │   └── link
                │       ├── 534e72e7cedcc7f1a7643fa9ec34706f32de866e663874a1f58bdd059ccd859d
                │       │   └── link
                │       ├── f62e2f6dfeef60a2983e8794e3de4f369de740d6cea09f72647988edf287c49d
                │       │   └── link
                │       └── fe7db6293242e96deb130e0cd1d729ac3f94ed086fc9e414587f369b81c42580
                │           └── link
                ├── _manifests
                │   ├── revisions
                │   │   └── sha256
                │   │       └── 8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390
                │   │           └── link
                │   └── tags
                │       └── latest
                │           ├── current
                │           │   └── link
                │           └── index
                │               └── sha256
                │                   └── 8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390
                │                       └── link
                └── _uploads

39 directories, 16 files
[root@docker2 ~]# vim /etc/yum.conf 
[root@docker2 ~]# cat /etc/yum.conf 
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1             保留rpm包的缓存
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3

为docker仓库添加证书加密功能,生成证书

[root@docker1 ~]# openssl11 req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -addext "subjectAltName = DNS:reg.westos.org" -x509 -days 365 -out certs/westos.org.crt
Can't load /root/.rnd into RNG
139795939268416:error:2406F079:random number generator:RAND_load_file:Cannot open file:crypto/rand/randfile.c:98:Filename=/root/.rnd
Generating a RSA private key
.............................++++
.........................++++
writing new private key to 'certs/westos.org.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:shaanxi          
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:westos
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:reg.westos.org
Email Address []:root@westos.org

重建registry容器

[root@docker1 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key -p 443:443 registry
13b3fb9f6ccb1a3bd103ff4b32d67b46e97932e96f4b9f36a0eb080c394c0d93
[root@docker1 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                                                              NAMES
13b3fb9f6ccb   registry   "/entrypoint.sh /etc…"   6 seconds ago   Up 4 seconds   0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

上传镜像,并且查看确保上传成功

[root@docker1 ~]# docker tag nginx:latest reg.westos.org/nginx:latest
[root@docker1 reg.westos.org]# docker push reg.westos.org/nginx:latest 
The push refers to repository [reg.westos.org/nginx]
d6a3537fc36a: Pushed 
819eb3a45632: Pushed 
5eda6fa69be4: Pushed 
6f4f3ce1dca0: Pushed 
58a06a0d345c: Pushed 
fe7b1e9bf792: Pushed 
latest: digest: sha256:bab399017a659799204147065aab53838ca6f5aeed88cf7d329bc4fda1d2bac7 size: 1570
[root@docker1 reg.westos.org]# curl -k https://localhost/v2/_catalog
{"repositories":["game2048","nginx"]}

在另一台主机上配置好docker容器平台后,通过私有仓库拉取镜像就会比通过外网拉取镜像快的多

[root@docker2 ~]# docker pull reg.westos.org/nginx:latest
latest: Pulling from nginx
bd159e379b3b: Pull complete 
8d634ce99fb9: Pull complete 
98b0bbcc0ec6: Pull complete 
6ab6a6301bde: Pull complete 
f5d8edcd47b1: Pull complete 
fe24ce36f968: Pull complete 
Digest: sha256:bab399017a659799204147065aab53838ca6f5aeed88cf7d329bc4fda1d2bac7
Status: Downloaded newer image for reg.westos.org/nginx:latest
reg.westos.org/nginx:latest