本地项目打包成镜像并上传到docker仓库
前言
在平时编写代码时,我们可以在本地跑通的项目有时候在别人那里就是出现各种莫名其妙的错误,从而产生了“调试环境”的时间,而解决环境问题所需要的时间也说不定,轻则几分钟,重则以天计单位。但这个时候如果让别人直接用我们“现成”的环境就可以直接解决。这个就是Docker镜像的作用之一,但别人要用我们的镜像,我们就需要先把自己的镜像经过打包、构建、发布等一系列操作才行。
Dockerfile编写规则
首先我们来看一下编写Dockerfile的各种命令
1 | 设置基础镜像 |
以上面这份示例来做一个解释:
- FROM:构建新镜像所基于的基础镜像,这里我使用oracle 的 OpenJDK 17 镜像作为基础镜像。
- LABEL:添加元数据到镜像内,格式为键值对
- ENV:设置环境变量
- RUN:在镜像内执行命令,PS:每执行一个RUN命令都会在镜像内新建一层,所以尽可能使用**&&**来连接多个RUN命令
- WORKDIR:设置工作目录,之后所有操作都会在这个目录下执行
- COPY:将本地的文件拷贝到镜像内的指定位置
- EXPOSE:声明镜像暴露的端口,多个端口使用则可再起一行用EXPOSE指定 PS:该指令仅仅是声明端口,使Dockerfile更文档化,并没有实际的操作。
- CMD:指定容器启动时运行的命令和参数。每个 Dockerfile 只能有一个
CMD
指令!
编写项目Dockerfile
Dockerfile文件的名字必须为Dockerfile!!!注意区分大小写!放在项目的根目录:
以我的项目为例,我的Dockerfile如下:
因为我项目是Java17,所以使用17作为基础镜像,同时指定了工作目录为**/usr/local**,并将本地的jar包添加到工作目录内,标注一些作者信息到镜像内,同时声明端口为1234,最后启动
1 | FROM openjdk:17-oracle |
推送到仓库
推送到仓库我们需要有自己的docker账号,没有的记得提前注册一个。Docker Hub
- 首先我们需要进入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 . |
- 构建完成后,我们需要登陆docker的账号,使用下面命令进行登陆
1 | docker login |
- 最后使用
push
命令进行推送,如果推送失败请检查自己的网络,可能需要🪜
1 | docker push sora33/dockertest:v1.0 |
之后进入Docker Hub自己的仓库页面,便可看到刚刚推送的仓库,可以继续编辑描述与类别等
拉取镜像
随后我们可以通过docker pull
命令来拉去我们刚刚推送到仓库的镜像
1 | docker pull sora33/dockertest:v1.0 |
使用docker run
启动容器
1 | docker run -p 1234:1234 sora33/dockertest:v1.0 |
容器启动成功,接口也成功响应
结束语
到这里,最基本的Dockerfile的使用及推送也就完成了,但这都是针对单一的项目,没有任何中间件的项目。如果需要更复杂的多容器启动则需要使用Docker Compose,这个会在下一期进行介绍。