Dockerfile实践

本文介绍Dockerfile的基础概念及构建实例,涵盖nginx、springboot应用及tomcat+jdk环境搭建,强调最佳实践如文件顺序优化与减少镜像层数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

1、文本文件
2、文件中通过指令可以构建镜像

构建案例

我们假设您对docker基础已经有基本的了解,接下来我们通过构建案例来描述如果通过Dockerfile 去构建 docker镜像

1、构建nginx

#1、创建dockerfile文件
vim Dockerfile
#2、在文件中输入以下内容
FREOM nginx
RUN echo 'RUN指令是在构建镜像的时候执行' > /usr/share/nginx/html/index.html
#3、通过docker build 命令来构建镜像
sudo docker build -t nginx:v1 . 
#4、控制台输出
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete 
5a9f1c0027a7: Pull complete 
b5c20b2b484f: Pull complete 
166a2418f7e8: Pull complete 
1966ea362d23: Pull complete 
Digest: sha256:aeade65e99e5d5e7ce162833636f692354c227ff438556e5f3ed0335b7cc2f1b
Status: Downloaded newer image for nginx:latest
 ---> c39a868aad02
Step 2/2 : RUN echo 'RUN指令是在构建镜像的时候执行' > /usr/share/nginx/html/index.html
 ---> Running in 9832faed749d
Removing intermediate container 9832faed749d
 ---> d6ac3d3b169f
Successfully built d6ac3d3b169f
Successfully tagged nginx:v1
#5、可以看到 我们构建成功了 d6ac3d3b169f 这个是镜像id , nginx:v1 ,是镜像名称和版本
#6、创建一个容器测试以下
sudo docker run -d -p 8000:80 --name nginx-v1 nginx:v1
#7、我们通过ip访问以下看看结果如何
[wuchao@localhost nginx]$ curl http://localhost:8000/
RUN指令是在构建镜像的时候执行
#可以看到控制台输出的是 "RUN指令是在构建镜像的时候执行"。

2、构建一个springboot应用程序

#我们以一个开源项目renren-admin 为例来构建
#1、编写Dockerfile 文件
FROM java:8
RUN mkdir -p /data
## WORKDIR 指令是指定容器内部运行目录 ,在其后面的ADD , CMD 等指令在执行都是此目录下面执行
WORKDIR /data
ADD renren-admin.jar app.jar
CMD["java","-jar","app.jar"]
#2、构建镜像
sudo docker build -t renren/admin:v1 .
#3、控制台输出
Sending build context to Docker daemon   62.9MB
Step 1/5 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/5 : RUN mkdir -p /data
 ---> Running in d73d5cb18fd8
Removing intermediate container d73d5cb18fd8
 ---> 5920766e969f
Step 3/5 : WORKDIR /data
 ---> Running in 61b41eedf11f
Removing intermediate container 61b41eedf11f
 ---> 0ea38816af01
Step 4/5 : ADD renren-admin.jar app.jar
 ---> 6ec36c534c75
Step 5/5 : CMD ["java","-jar","app.jar"]
 ---> Running in fb85013168ff
Removing intermediate container fb85013168ff
 ---> 0793f2de0662
Successfully built 0793f2de0662
Successfully tagged renren/admin:v1
#4、构建容器
sudo docker run -d -p 8080:8080 --name renren-admin renren/admin:v1
#5、检查是否成功
curl http://localhost:8080/renren-admin/login.html
#6、进入容器内部发现默认目录就是 /data ,app.jar也在当前目录下
sudo docker exec -it renren-admin bash
root@6667d8f21d3d:/data# ls
app.jar
#7、传递参数运行 比如我现在想要更改容器内部项目运行端口 这个时候就要使用ENTRYPOINT指令了
#ENTRYPOINT与CMD命令都是在容器运行的时候(docker run )执行,不同的是 ENTRYPOINT可以接收 容器运行命令中的环境变量 docker引擎会把运行参数自动加载到ENTRYPOINT指令上面
#8、让我们来修改上面的Dockerfile
FROM java:8
RUN mkdir -p /data
## WORKDIR 指令是指定容器内部运行目录 ,在其后面的ADD , CMD 等指令在执行都是此目录下面执行
WORKDIR /data
ADD renren-admin.jar app.jar
ENTRYPOINT["java","-jar","app.jar"]
#9、构建镜像
sudo docker build -t renren/admin:v2 .
#10 创建容器
sudo docker run -d -p 8081:8086 -e server.port=8086 --name renren-admin-v2 renren/admin:v2
## 首先我们通过-e server.port=8086 让app.jar在容器内部以8086端口运行 然后将8086端口映射到宿主机8081端口 , 然后我们测试一下
curl http://localhost:8081/renren-admin/login.html
## ok,也是成功的,那么我们同样我们不仅可以修改端口 就springboot项目来说可以直接修改 
## spring.profiles.active=dev / spring.profiles.active=prod 这样就可以起部署多个环境的项目了 。

3、构建一个tomcat9-jdk8

# 准备工作 :我们假设 你已经下载好 一个 tomcat9 和jdk1.8了
# 1、编写Dockerfile
FROM centos
RUN mkdir /datia
WORKDIR /data
# 2、将文件拷贝到镜像文件
COPY jdk1.8.0_221  jdk1.8.0_221
COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
RUN chmod -R 777  /data
# 3、设置jdk环境变量
ENV JAVA_HOME=/data/jdk1.8.0_221 
ENV JRE_HOME=$JAVA_HOME/jre 
ENVPATH=$JAVA_HOME/bin:$PATH
#4、配置容器启动命令
CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]
#5、构建镜像
sudo docker build -t tomcat9-jdk8 .
#看一下控制台输出
Sending build context to Docker daemon  445.7MB
Step 1/10 : FROM centos
 ---> 0d120b6ccaa8
Step 2/10 : RUN mkdir /datia
 ---> Running in dcba1c472d42
Removing intermediate container dcba1c472d42
 ---> 39b3a1b8397e
Step 3/10 : WORKDIR /data
 ---> Running in 16e7d8c8846d
Removing intermediate container 16e7d8c8846d
 ---> 1c9679073a45
Step 4/10 : COPY jdk1.8.0_221  jdk1.8.0_221
 ---> 4e69f9a3373d
Step 5/10 : COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
 ---> 69a379c19c68
Step 6/10 : RUN chmod -R 777  /data
 ---> Running in f01b57e178cc
Removing intermediate container f01b57e178cc
 ---> 42d0527e9bf3
Step 7/10 : ENV JAVA_HOME=/data/jdk1.8.0_221
 ---> Running in 4db81db20eec
Removing intermediate container 4db81db20eec
 ---> c3e146d35d6a
Step 8/10 : ENV JRE_HOME=$JAVA_HOME/jre
 ---> Running in 9ec15a7b5a10
Removing intermediate container 9ec15a7b5a10
 ---> cc269643fe26
Step 9/10 : ENV PATH=$JAVA_HOME/bin:$PATH
 ---> Running in d21e3867682e
Removing intermediate container d21e3867682e
 ---> 94716e568d22
Step 10/10 : CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]
 ---> Running in 6915576643fe
Removing intermediate container 6915576643fe
 ---> 74b12995702b
Successfully built 74b12995702b
Successfully tagged tomcat9-jdk8:latest
#6、创建成功了 我们运行一下容器
sudo docker run -d -p 8080:8080  --name tomcat tomcat9-jdk8:latest
#7、检查容器运行成功没有

在这里插入图片描述

优化

1、文件最后执行

如果我们需要用指令 ADD/COPY拷贝文件,那么尽可能地将 拷贝文件指定放到最后执行,因为在每一个指令都会在镜像新建一层,如果在第一个指令拷贝文件那么每一层都会有文件,将导致镜像非常的大,例如前面那个构建tomcat的DockerFile:

# 1、编写Dockerfile
FROM centos
RUN mkdir /datia
WORKDIR /data
# 2、将文件拷贝到镜像文件
COPY jdk1.8.0_221  jdk1.8.0_221
COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
RUN chmod -R 777  /data
# 3、设置jdk环境变量
ENV JAVA_HOME=/data/jdk1.8.0_221 
ENV JRE_HOME=$JAVA_HOME/jre 
ENVPATH=$JAVA_HOME/bin:$PATH
#4、配置容器启动命令
CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]

这个Dockerfile 构建之后 镜像大小是1.1G,如果我们改成这样

# 1、编写Dockerfile
FROM centos
RUN mkdir /datia
WORKDIR /data
RUN chmod -R 777  /data
# 3、设置jdk环境变量
ENV JAVA_HOME=/data/jdk1.8.0_221
ENV JRE_HOME=$JAVA_HOME/jre
ENV PATH=$JAVA_HOME/bin:$PATH
COPY jdk1.8.0_221  jdk1.8.0_221
COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
#4、配置容器启动命令
CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]

这个镜像大小只有600M

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
tomcat9-jdk8                   v2                  e4105a22f08c        6 minutes ago       659MB
tomcat9-jdk8                   latest              74b12995702b        16 minutes ago      1.1GB

2、减少层数

尽可能的合并使用指令,每一个指令都新建一层的哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值