Docker容器技术 第三节 --- 构建一个完整的、可定制的nginx Web服务器Docker镜像;镜像优化;多阶段构建Dockerfile
·
一、构建一个完整的、可定制的nginx Web服务器Docker镜像
本次实验将了解nginx从源码到服务的完整流程,学习Linux软件编译安装。掌握Docker最佳实践(镜像分层优化、最小化镜像体积)
- 第一阶段:准备环境
mdkir docker #创建专用目录,隔离工作环境
cd docker/ #进入工作目录

- 第二阶段:编写Dockerfile
Dockerfile
镜像层(Image Layer)是构成 Docker 镜像的基本单位。每个镜像都是由一系列只读的层叠加而成的。这些层中的每一层都代表了文件系统的一个增量变更。当创建一个新的镜像时,Docker 会基于基础镜像添加新的层,每一层包含了对文件系统的修改,如添加、删除或修改文件。
vim Dockerfile
FROM centos:7 #基于centos 7基础镜像
RUN rm -f /etc/yum.repos.d/* #清空系统默认yum源
COPY CentOS-Base.repo /etc/yum.repos.d/ #替换为国内镜像源
ADD nginx-1.28.0.tar.gz /mnt #解压nginx源码包到/mnt目录
WORKDIR /mnt/nginx-1.28.0 #切换到源码目录
RUN yum install -y gcc make pcre-devel openssl-devel #安装编译依赖
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc #调试信息,减少体积
RUN ./configure --with-http_ssl_module --with-http_stub_status_module #配置nginx,启用SSL和状态监控
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] #前台运行nginx

因为在这里我们用到了国内镜像源CentOS-Base.repo和nginx源码包,因此要将这两个资源包和Dockerfile放置同一个目录

- 第三阶段:构建镜像
docker build -t webserver:v1 . #给镜像命名webserver

- 第四阶段:验证镜像
docker images webserver #查看镜像列表

docker history webserver:v1 #查看镜像构建历史

- 第五阶段:启动容器
docker container prune #清理所有停止的容器

docker run -d --name web1 webserver:v1 #启动容器

docker inspect web1 #查看容器详情

自动分配的ip

访问容器 curl 172.17.0.2

在这里,我们已经成功构建了一个完整的nginx Web服务器实现了环境一致、快速部署以及数据持久化。
二、镜像优化
- 缩减镜像层
vim Dockerfile
FROM centos:7
RUN rm -f /etc/yum.repos.d/*
COPY CentOS-Base.repo /etc/yum.repos.d/
ADD nginx-1.28.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.28.0
RUN yum install -y gcc make pcre-devel openssl-devel && 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 && cd .. && rm -fr nginx-1.28.0 && yum clean all
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

2. 构建命令与镜像结果解析
docker build -t webserver:v2 .

docker images webserver

三、多阶段构建Dockerfile
- 编译镜像层
vim Dockerfile
FROM centos:7 as build
RUN rm -f /etc/yum.repos.d/*
COPY CentOS-Base.repo /etc/yum.repos.d/
ADD nginx-1.28.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.28.0
RUN yum install -y gcc make pcre-devel openssl-devel && 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 && cd .. && rm -fr nginx-1.28.0 && yum clean all
FROM centos:7
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;"]

- 构建命令与镜像结果解析
docker build -t webserver:v3 .

docker images webserver

成功!
更多推荐


所有评论(0)