Docker容器:封装镜像+优化

Posted Tuki_a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器:封装镜像+优化相关的知识,希望对你有一定的参考价值。

Docker基础知识

可以参考之前的文章Docker基础知识

Docker的基本使用方法

可以参考之前的文章Docker基本使用
里边包含创建镜像的两种方法,第二种方法Dockerfile是下面涉及到的,建议把链接的文章看一下

自己创建一个nginx的镜像

自己编写Dockerfile通过原始的安装编译的方法打包一个nginx的镜像

[root@server1 docker]# pwd
/root/docker/
[root@server1 docker]# vim 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			#非0退出会终止运行,所以要重建
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;"]

编写完文件后创建镜像-运行容器 -查看容器详细信息得到ip和分配的地址

[root@server1 docker]# docker build -t rhel7:v1 .
[root@server1 docker]# docker run -d --rm rhel7:v1
19d2cf9bcad38671f3466317a5e0ba1e0bdf742e8e2742fe320fd742497edecc
[root@server1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
19d2cf9bcad3        rhel7:v1            "/usr/local/nginx/sb…"   8 seconds ago       Up 7 seconds        80/tcp              sleepy_payne
[root@server1 docker]# docker inspect 19d2cf9bcad3

"Source": "/var/lib/docker/volumes/9db302d4232ebcdbb66574dc9114b1dec43d0b8a2210b4116693af1291e816ed/_data",	#这是nginx源地址,需要在这里编写一个index.html,否则可能会出现403错误

"IPAddress": "172.17.0.2",	#后边会显示访问nginx的ip

在这里插入图片描述
去源地址加index.html文件,然后curl ip访问,如果显示我们编辑的页面内容即访问成功。

[root@server1 docker]# cd /var/lib/docker/volumes/9db302d4232ebcdbb66574dc9114b1dec43d0b8a2210b4116693af1291e816ed/_data
[root@server1 _data]# ls
[root@server1 _data]# echo www.hello.org > index.html
[root@server1 _data]# curl 172.17.0.2
www.hello.org
#访问成功!

至此初始镜像制作成功!大小是303MB
在这里插入图片描述

在初始镜像的基础上进行优化

修改我们上面编辑的Dockerfile文件
把RUN命令都合到一起,因为RUN命令每运行一次都会增加一层镜像层,所以我们用&&(如果执行成功就执行下一条命令)把他们连接起来

[root@server1 _data]# cd -
/root/docker
[root@server1 docker]# ls
Dockerfile  dvd.repo  index.html  nginx-1.20.1.tar.gz  rhel7.tar
[root@server1 docker]# vim Dockerfile 
#修改后的文件内容如下
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 -fr /mnt/nginx-1.20.1 /var/cache/*

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

在这里插入图片描述创建新的镜像-运行容器

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

[root@server1 docker]docker run -d --rm rhel7:v2
8a9f00388f769907385210efe8a39df17d5a04ef3f80066fc9b5a4bbcaca47c2

在这里插入图片描述

查看容器详细信息得到ip和分配的地址并curl访问

[root@server1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
8a9f00388f76        rhel7:v2            "/usr/local/nginx/sb…"   26 seconds ago      Up 26 seconds                           gallant_leakey
19d2cf9bcad3        rhel7:v1            "/usr/local/nginx/sb…"   About an hour ago   Up About an hour    80/tcp              sleepy_payne
[root@server1 docker]# docker inspect 8a9f00388f76

[root@server1 docker]# curl 172.17.0.3

在这里插入图片描述
查看首次优化后的大小为141M,相比原始的303已经小了很多,但还不够
#rhel:v2是在下图none的基础上建成的,因为我们在Dockerfile文件中写了是基于创建好的又进行优化的
在这里插入图片描述

进一步优化

我们上面用的baseimage都是rhel7镜像,比较大,他里边有很多模块是我们用不到的。我们可以把需要的依赖项拷下来,这样一来就可以省掉很多空间。
按照这个思路先换个baseimage,我换为了debian10镜像

[root@server1 docker]# cd 
[root@server1 ~]# ls
anaconda-ks.cfg  base-debian10.tar  docker
[root@server1 ~]# docker load -i base-debian10.tar		#载入debian10镜像
de1602ca36c9: Loading layer  3.041MB/3.041MB
1d3b68b6972f: Loading layer  17.77MB/17.77MB
Loaded image: gcr.io/distroless/base-debian10:latest

在这里插入图片描述重新写一个Dockerfile文件,把需要的依赖项都拷下来放到一个目录下

[root@server1 ~]# vim 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;"]

创建镜像

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

使用镜像运行容器

[root@server1 ~]# docker run -d --rm rhel7:v3
9f97e2c8ef38f808bb4e6bce964be7887d80fc6094ca903d9b52102389a39761
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9f97e2c8ef38        rhel7:v3            "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp, 443/tcp     friendly_kowalevski
8a9f00388f76        rhel7:v2            "/usr/local/nginx/sb…"   55 minutes ago      Up 55 minutes                           gallant_leakey
19d2cf9bcad3        rhel7:v1            "/usr/local/nginx/sb…"   2 hours ago         Up 2 hours          80/tcp              sleepy_payne

在这里插入图片描述
查看大小,可以看到是31.6M,已经很小了

[root@server1 ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
rhel7                             v3                  6980ac3cc586        8 seconds ago       31.6MB
<none>                            <none>              bb19467e5054        9 seconds ago       145MB
<none>                            <none>              1e4b9ae5243f        24 minutes ago      255MB

在这里插入图片描述
查看容器详细信息得到给nginx分配的ip

[root@server1 ~]# docker inspect 9f97e2c8ef38	#容器id,docker ps可以得到

在这里插入图片描述

curl访问成功!
在这里插入图片描述
优化成功!

以上是关于Docker容器:封装镜像+优化的主要内容,如果未能解决你的问题,请参考以下文章

10.Docker-----安装初步使用镜像Dockerfile常用指令通过Dockerfile文件封装nginx镜像并优化

docker----安装初步使用构建镜像Dockerfile编写通过Dockerfile文件封装nginx镜像并优化

运维实操——docker容器镜像大小优化

Docker-容器介绍与配置镜像分层部署nginx优化镜像

Docker架构镜像及容器的基本操作

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段