案例一:
使用Dockerfile构建tomcat镜像
cd /opt
mkdir tomcat
cd tomcat/
上传tomcat所需的依赖包
使用tar xf 解压三个压缩包
vim Dockerfile
FROM centos:7
LABEL function="tomcat image" author="tc" createtime="2024-07-16"
ADD jdk-8u391-linux-x64.tar.gz /opt/
ENV JAVA_HOME=/opt/jdk1.8.0_391
ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
ADD apache-tomcat-9.0.16.tar.gz /opt/
EXPOSE 8080
CMD ["/opt/apache-tomcat-9.0.16/bin/catalina.sh", "run"]
docker build -t tomcat:9.0 . #构建镜像
docker images #查看镜像
docker run -d --name tomcat1 -p 666:8080 tomcat:9.0 #启动容器
登录网页查看
通过ARG传参构建不同版本的tomcat
以上述构建的tomcat镜像为基础
cd /opt/tomcat
vim Dockerfile
FROM centos:7
LABEL function="tomcat image" author="tc" createtime="2024-07-16"
ADD jdk-8u391-linux-x64.tar.gz /opt/
ENV JAVA_HOME=/opt/jdk1.8.0_391
ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
ARG VER
ADD $VER /opt/tomcat
EXPOSE 8080
CMD ["/opt/tomcat/bin/catalina.sh", "run"]
docker build --build-arg VER=apache-tomcat-8.5.16 -t tomcat:8.5 . #构建8.5版本tomcat镜像
docker build --build-arg VER=apache-tomcat-9.0.16 -t tomcat:9.0 . #构建9.0版本tomcat镜像
验证:
案例二:缩小镜像的体积
方法一:使用较小体积的基础镜像
以上述实验为基础
cd /opt/tomcat
mv Dockerfile Dockerfile.bak
vim Dockerfile
FROM openjdk:8-jdk-alpine
ARG VER
COPY $VER /opt/tomcat/
CMD ["/opt/tomcat/bin/catalina.sh", "run"]
docker build --build-arg VER=apache-tomcat-9.0.16 -t tomcat:9 . #构建镜像
docker run -d --name a3 -p 1313:8080 tomcat:9
测试访问
方法二:多级构建减少体积
1、先源码编译nginx
cd /opt
mkdir nginx_bian
cd nginx_bian/
上传nginx压缩包
cd /etc/yum.repos.d/
cp CentOS-Base.repo /opt/nginx_bian/
cd /opt/nginx_bian/
vim Dockerfile
FROM centos:7
LABEL author="ikun" createtim="2024-07-15" usage="nginx image"
ADD nginx-1.26.1.tar.gz /opt/
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make && \
useradd -M -s /sbin/nologin nginx && \
cd /opt/nginx-1.26.1/ && \
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \
make && \
make install
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
docker build -t nginxsrc:v1 .
docker run -id nginx:v1
docker ps -a
cd /opt/nginx
cp -r html /opt/nginx_bian/
docker run -id --name aaa -p 123:80 -v /opt/nginx_bian/html/:/usr/local/nginx/html/ nginx:v1
docker ps -a
2、多级构建减小体积
vim Dockerfile
FROM centos:7 as first #为第一级构建镜像设置别名
ADD nginx-1.26.1.tar.gz /opt/
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make && \
useradd -M -s /sbin/nologin nginx && \
cd /opt/nginx-1.26.0/ && \
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \
make && \
make install
FROM centos:7 #开启第二级构建
COPY --from=first /usr/local/nginx/ /usr/local/nginx/ #copy --from 从其他构建阶级中复制源文件
RUN useradd -M -s /sbin/nologin nginx #运行用户必要命令
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
docker build -t nginx:v2 .
docker images
docker run -d --name mmm -p 80:80 nginx:v2
docker ps -a
浏览器访问测试:http://192.168.10.101:10
总结:
如何缩小镜像的体积大小?
1)尽可能的使用较小体积的基础镜像(推荐使用 alpine 镜像)
2)尽可能的减少Dockerfile中的指令数量,从而减少镜像的层数
3)在RUN指令结尾添加清空安装软件的缓存和软件包的命令
4)使用 .dockerignore 文件,添加不需要复制到镜像里的文件名或子目录名
5)容器镜像里一般只运行单个应用
6)使用多阶段构建的方法
FROM 第一构建阶段的基础镜像 as 阶段别名 #在第一阶段,安装依赖项并构建项目
....
FROM 第二构建阶段的基础镜像 #在第二阶段,复制上一阶段构建产物的文件或目录,并使用它来运行应用程序,这样最终的镜像中就不会有不必要的依赖和代码
COPY --from=第一构建阶段的别名 第一构建阶段的项目文件或目录 当前阶段的路径
....
CMD或ENTRYPOINT 指定容器启动命令