前言

在平时编写代码时,我们可以在本地跑通的项目有时候在别人那里就是出现各种莫名其妙的错误,从而产生了“调试环境”的时间,而解决环境问题所需要的时间也说不定,轻则几分钟,重则以天计单位。但这个时候如果让别人直接用我们“现成”的环境就可以直接解决。这个就是Docker镜像的作用之一,但别人要用我们的镜像,我们就需要先把自己的镜像经过打包、构建、发布等一系列操作才行。

Dockerfile编写规则

首先我们来看一下编写Dockerfile的各种命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 设置基础镜像
FROM openjdk:17-oracle

# 添加元数据到镜像
LABEL author="Sora33"

# 设置环境变量
ENV APP_HOME /app

# 创建应用目录
RUN mkdir $APP_HOME

# 设置工作目录
WORKDIR $APP_HOME

# 复制文件到镜像
COPY ./target/xxx.jar $APP_HOME

# 安装依赖
RUN apt-get update && apt-get install -y python3 python3-pip

# 暴露端口
EXPOSE 8080

# 启动容器时运行的命令
CMD ["java", "-jar", "xxx.jar"]

以上面这份示例来做一个解释:

  1. FROM:构建新镜像所基于的基础镜像,这里我使用oracle 的 OpenJDK 17 镜像作为基础镜像。
  2. LABEL:添加元数据到镜像内,格式为键值对
  3. ENV:设置环境变量
  4. RUN:在镜像内执行命令,PS:每执行一个RUN命令都会在镜像内新建一层,所以尽可能使用**&&**来连接多个RUN命令
  5. WORKDIR:设置工作目录,之后所有操作都会在这个目录下执行
  6. COPY:将本地的文件拷贝到镜像内的指定位置
  7. EXPOSE:声明镜像暴露的端口,多个端口使用则可再起一行用EXPOSE指定 PS:该指令仅仅是声明端口,使Dockerfile更文档化,并没有实际的操作。
  8. CMD:指定容器启动时运行的命令和参数。每个 Dockerfile 只能有一个 CMD 指令!

编写项目Dockerfile

Dockerfile文件的名字必须为Dockerfile!!!注意区分大小写!放在项目的根目录:

image-20240606153601658

以我的项目为例,我的Dockerfile如下:

因为我项目是Java17,所以使用17作为基础镜像,同时指定了工作目录为**/usr/local**,并将本地的jar包添加到工作目录内,标注一些作者信息到镜像内,同时声明端口为1234,最后启动

1
2
3
4
5
6
FROM openjdk:17-oracle
WORKDIR /usr/local
ADD ./target/dockerTest.jar .
LABEL author=sora33
EXPOSE 1234
CMD ["java","-jar","dockerTest.jar"]

推送到仓库

推送到仓库我们需要有自己的docker账号,没有的记得提前注册一个。Docker Hub

  1. 首先我们需要进入Dockerfile所在的目录,通过docker image build来构建镜像,配合-t参数指定镜像的标签。以下面的命令为例,sora33一般为作者名,dockertest为镜像名,v1.0则是版本号。最后的 . 表示构建上下文的路径,Docker会把该路径下的所有文件扫描到,之后通过Dockerfile的命令便可拿到这些文件,.表示当前路径

​ PS:可以继续使用--platform=linux/amd64来指定构建后镜像所适用的平台版本,如 docker image build -t sora33/dockertest:v1.0 –platform=linux/amd64 .

1
docker image build -t sora33/dockertest:v1.0 .
  1. 构建完成后,我们需要登陆docker的账号,使用下面命令进行登陆
1
docker login
  1. 最后使用push命令进行推送,如果推送失败请检查自己的网络,可能需要🪜
1
docker push sora33/dockertest:v1.0

之后进入Docker Hub自己的仓库页面,便可看到刚刚推送的仓库,可以继续编辑描述与类别等

image-20240606152944079

拉取镜像

随后我们可以通过docker pull命令来拉去我们刚刚推送到仓库的镜像

1
docker pull sora33/dockertest:v1.0

使用docker run启动容器

1
docker run -p 1234:1234 sora33/dockertest:v1.0

容器启动成功,接口也成功响应

image-20240606153900959

结束语

到这里,最基本的Dockerfile的使用及推送也就完成了,但这都是针对单一的项目,没有任何中间件的项目。如果需要更复杂的多容器启动则需要使用Docker Compose,这个会在下一期进行介绍。