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:指定与外界交互的端口号,比如
tomcat
的8080
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. 操作步骤
- 首先需要安装好 Docker,这个在Linux 环境 Docker 在线和离线安装以及镜像的加载中已经有相关的操作步骤;
- 创建一个
Dockerfile
文件,并按照编写其内容; - 执行
docker build
命令执行即可。
# docker build命令的基本写法格式,注意后面已经要加一个点,不能忘了,这个点表示使用当前目录作为镜像编译目录
docker build -f [Dockerfile文件路径] -t [镜像名称:镜像版本号] .
# docker build写法,命令就是在当前的Dockerfile文件所在目录下执行的
docker build -f Dockerfile -t itcrud-centos:1.0.0 .
5. 实操遇到的坑
- 执行
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 .
- 在执行
Dockerfile
里面指定的yum -y install vim
时报错。
是因为在FROM centos
的时候没有加上版本号,默认拉取的是最新的centos
,对应的版本是centos 8 stream
,这个时候将centos
加上版本号即可,改为FROM centos:7
。(我这里 Docker 版本是 24.0.4,实操的时间是 2023 年 7 月 9 日,如果你没有出现这个问题,可能是 Docker 版本问题,或者远程仓库centos
非centos 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
放在同一个目录下。