Dockerfile实践

什么是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、减少层数

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dockerfile是用于构建Docker镜像的文本文件,其中包含了一系列的指令和配置。以下是一些Dockerfile的最佳实践: 1. 使用官方基础镜像:选择一个合适的官方基础镜像作为起点,例如`ubuntu`、`alpine`等。官方镜像通常经过优化和安全性验证。 2. 合理使用镜像层缓存:Docker构建镜像时,每个指令都会创建一个新的镜像层。为了提高构建速度,可以将频繁变动的指令放在后面,将不变的指令放在前面,以充分利用镜像层缓存。 3. 最小化镜像大小:避免在镜像中包含不必要的文件和依赖项。可以使用多阶段构建,将编译环境和运行环境分离,只将必要的文件复制到最终的镜像中。 4. 使用COPY而不是ADD:在复制文件到镜像时,优先使用COPY指令而不是ADD指令。COPY只复制本地文件到镜像中,而ADD还支持URL和解压缩功能,容易引入不必要的复杂性。 5. 指定工作目录:通过WORKDIR指令设置工作目录,使得后续指令的执行路径更加清晰和可预测。 6. 使用健康检查:通过HEALTHCHECK指令添加容器的健康检查机制,以确保容器的正常运行。可以使用CMD或ENTRYPOINT指令来运行健康检查脚本。 7. 清理不必要的文件和依赖项:在构建镜像时,确保删除不再需要的临时文件、缓存和安装包,以减小镜像的大小。 8. 使用环境变量:通过ENV指令设置环境变量,使得容器的配置更加灵活和可配置化。 9. 使用标签管理镜像版本:为镜像添加标签,方便管理和追踪不同版本的镜像。 10. 安全性注意事项:避免在镜像中运行特权进程,确保镜像中的软件包和依赖项是最新的,定期更新基础镜像和应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值