Dockerfile的核心指令和编写案例


1. 概述

从项目编译打包成jar或者是war,到部署环境的依赖,如jdk,再到部署时文件存储的位置,进入容器默认进入的目录。都可以通过Dockerfile文件来实现,也就是在构建部署的时候,在Dockerfile文件中指定每一步的操作,最终形成镜像文件。

2. Dockerfile 文件的常用指令

  • FROM:指定父镜像,局域哪个镜像来构建,这个镜像可以从远程仓库中拉取,也可以是本地镜像库中某个镜像
# 默认会从远程仓库中拉取centos镜像,并将此镜像存入本地镜像库
# 作为新镜像生成的基础镜像
FROM centos:7
  • MAINTAINER:维护者,比如这个容器或者项目是由程序猿洞晓维护,就可以指定程序猿洞晓
MAINTAINER itcrud.github.io
  • RUN:容器创建的时候执行一段命令,比如安装vim插件等
# 更新yum
RUN yum -y update
# 安装vim插件
RUN yum -y install vim
# 安装net-tools插件
RUN yum -y install net-tools
# 下载文件
RUN wget http://tool.iweek.com/file/xxx.txt
  • ADD:将本地文件添加到容器中,tar类型文件会自动解压,网络压缩类型资源不会被解压,类似wget
ADD xxx.tar
  • COPY:功能类似于 ADD,但是此命令不会自动执行解压动作
# 拷贝xxx.jar文件,并将其更名为yyy.jar
COPY xxx.jar yyy.jar
  • CMD:构建容器后调用,也就是容器启动时才会进行调用
# 表示构建容器后,自动进入到容器内
CMD /bin/bash
  • ENV:环境变量的配置,比如配置 JDK 的基础目录
# 创建一个环境变量,变量名是:ENVNAME,对应的变量值是:/usr/local/
ENV ENVNAME /usr/local/
  • EXPOSE:指定与外界交互的端口号,比如tomcat8080
EXPOSE 10010
  • WORKDIR:设置进入容器时的目录访问路径,比如我们在连接centos虚拟机,默认进入的是根目录
# $ENVNAME表示应用环境变量中的ENVNAME
WORKDIR $ENVNAME
  • VOLUME:数据卷的挂载,用来保存数据和持久化工作,实现宿主机和容器共享的目录
# 宿主机和容器共享目录,将宿主机的/usr/local/data映射到容器的/usr/local/container/data
VOLUME /usr/local/data:/usr/local/container/data

3. Dockerfile 文件案例

案例如下:

FROM  centos:7
MAINTAINER itcrud.github.io
ENV  MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 8080
CMD /bin/bash

这个案例主要是实现构建一个镜像文件,这个镜像文件拥有vim插件,进入容器后,默认进入的目录是/usr/local,对外暴露的端口是8080,容器构建结束,自动进入到容器中。

4. 操作步骤

  1. 首先需要安装好 Docker,这个在Linux 环境 Docker 在线和离线安装以及镜像的加载中已经有相关的操作步骤;
  2. 创建一个Dockerfile文件,并按照编写其内容;
  3. 执行docker build命令执行即可。
# docker build命令的基本写法格式,注意后面已经要加一个点,不能忘了,这个点表示使用当前目录作为镜像编译目录
docker build -f [Dockerfile文件路径] -t [镜像名称:镜像版本号] .
# docker build写法,命令就是在当前的Dockerfile文件所在目录下执行的
docker build -f Dockerfile -t itcrud-centos:1.0.0 .

5. 实操遇到的坑

  1. 执行docker build命令的时候报错,报错信息如下:
ERROR:"docker buildx build" requires exactly 1 argument.
See 'docker buildx build --help'.
usage: docker buildx build [OPTIONS] PATH | URL | -

这个错误有点低级,就是在执行docker build命令的时候,最后没有加上.导致的。

# 会报错的命令
docker build -f Dockerfile -t itcrud-centos:1.0.0
# 正常的命令
docker build -f Dockerfile -t itcrud-centos:1.0.0 .
  1. 在执行Dockerfile里面指定的yum -y install vim时报错。

是因为在FROM centos的时候没有加上版本号,默认拉取的是最新的centos,对应的版本是centos 8 stream,这个时候将centos加上版本号即可,改为FROM centos:7。(我这里 Docker 版本是 24.0.4,实操的时间是 2023 年 7 月 9 日,如果你没有出现这个问题,可能是 Docker 版本问题,或者远程仓库centoscentos 8 stream,此错误随缘)

6. springBoot 项目的 Dockerfile 模板

# 集成java8这个镜像,这个镜像需要提前就构建好放在本地仓库
FROM centos-jdk8
# 作者
MAINTAINER itcrud
# 设置环境变量
ENV MYPATH /usr/local
ENV TZ=Asia/Shanghai
# 设置进入容器时的默认目录
WORKDIR $MYPATH
# 时区写入到系统文件
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 容器数据卷挂载
VOLUME /usr/local/itcrud
# 将宿主机中jar包copy到容器中的/usr/local/server目录,并改名为docker-server.jar
COPY itcrud-server.jar /usr/local/server/docker-server.jar
# 报错端口
EXPOSE 10034
# 容器启动后执行命令,启动springBoot项目,这里同样可以使用CMD
ENTRYPOINT ["java","-jar","Xms1024m","Xmx1024m","/usr/local/server/docker-server.jar"]
# 容器启动结束,自动进入容器内
CMD /bin/bash

以上模板可以作为一个很好的参考,一般项目打完包后,Dockerfile文件会和项目的jar放在同一个目录下。


文章作者: 程序猿洞晓
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 程序猿洞晓 !
评论
 上一篇
Docker的可视化工具portainer Docker的可视化工具portainer
Docker实际包含多少镜像,包含多少容器,通过命令行查看首先是不够直观,再次就是比较麻烦,此时可以使用Docker可视化工具portainer就可以解决这个问题。
2023-07-10
下一篇 
单库分库分表后的数据迁移问题解决方案 单库分库分表后的数据迁移问题解决方案
随着公司业务的不断地扩展,数据会越来越多,当超过单数据库瓶颈的时候,就要考虑分库分表,但是这个时候就会涉及单表的数据如何按照分库分表分配到目前库表,并且保证数据的准确性。
2023-07-06
  目录