Docker 镜像创建及发布

Docker 镜像创建及发布

Docker 是一款开源平台,用于构建、部署、运行和管理容器化的应用程序。它将代码和所有依赖项打包成标准化单元,使其能够轻松地在不同环境中运行,提高了开发、部署和管理应用程序的效率。简单来说,Docker 是一个用于打包和运行应用程序的工具,它使应用程序更易于移植、更可靠、更可扩展且更有效。

在这里我就介绍一下如何用Docker构建一个Java应用的镜像,以及部署容器来运行这个Java应用.

下载Docker Desktop和注册Docker账号

首先先到https://www.docker.com/products/docker-desktop/上,下载Docker Desktop并安装到本地电脑上,我的是Mac所以选择了Mac的下载安装包.

安装完成后,请到https://hub.docker.com/signup 注册一个账号,可以使用你已有的Github账号进行联登.

注册好账号之后,打开安装好的Docker Desktop,并点击右上角的Sign in按钮, 这时候会跳转到浏览器,根据提示登录即可.

(注意⚠️:以上的步骤,需要魔法上网)

准备Dockerfile和compose.yaml文件

要打包镜像和创建容器运行程序,就需要有Dockerfile对程序所需的运行环境,依赖等进行打包到一个镜像里面,然后用compose.yaml文件指导Docker如何创建一个容器来运行这个程序

Docker提供了比较简便的方法创建这些文件, 根据https://docs.docker.com/language/java/containerize/ 上的介绍,可以在你的程序根目录上,运行”docker init”指令,让Docker帮你初始化这些文件,你只需要回答几个简单的问题就可以了

docker init
Welcome to the Docker Init CLI!

This utility will walk you through creating the following files with sensible defaults for your project:
  - .dockerignore
  - Dockerfile
  - compose.yaml
  - README.Docker.md

Let's get started!

WARNING: The following Docker files already exist in this directory:
  - docker-compose.yml
? Do you want to overwrite them? Yes
? What application platform does your project use? Java
? What's the relative directory (with a leading .) for your app? ./src
? What version of Java do you want to use? 21
? What port does your server listen on? 8081

运行结束后,你就会看到这些文件都被创建好,并已经有基本的设置了. 但这些初始化的设置可能是不足够创建镜像文件以及运行容器的,所以还要根据自身程序的情况,进行适当的调整

比如我的程序需要一个config的文件夹,以便存放额外的配置文件,默认的Dockerfile是不知道有这个设置的,所以需要自己在Dockerfile里面,在适当的位置(“WORKDIR /” 这一行下面)增加”RUN mkdir -p config”的指令

在compose.yaml文件里面,也需要配置好程序在容器运行时候的所有细节

创建镜像文件以及构建容器

在进行之前,需要设置好本地的运行环境和参数

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
MAVEN_HOME=/Dev/apache-maven-3.9.6
export PATH=$PATH:/opt/gradle/gradle-8.7/bin:$JAVA_HOME/bin:$MAVEN_HOME/bin
export DOCKER_DEFAULT_PLATFORM=linux/amd64

以上是~/.zshrc文件里面的部分内容, 除了基本的程序运行所需的JAVA_HOME, Maven之外,还需要变更”DOCKER_DEFAULT_PLATFORM”的值,这个值不改的话,虽然在本地的Docker Desktop上运行没有影响, 但后面发布到Docker Hub上,镜像无法正常在其他的Docker上运行. 所以一了百了,直接用这个来打包镜像比较安全.

设置后之后,不要忘记运行 一下”source ~/.zshrc”命令加载配置,或者开个新的窗口也会自动加载

检查应用程序状态

我们还是要养成良好的习惯,应用程序如果有任何的改动和代码变更,都要首先自测和检查一下是否达到运行的标准再进行Docker的操作

所有的东西准备就绪之后,首选要先确保你的程序是可以运行的,不然打包和构建容器之后才发现你的程序有问题,那就白搞了,我一般在做所有Docker相关的操作之前,先检查一下程序的状态.以上是我直接运行”mvn clean package”的命令的结果,可以看到编译,测试用例以及启动都没问题,这样我们就可以安心的开始打包了.

创建镜像和容器

当一切准备就绪后,就可以使用

docker compose up --build -d

来创建镜像和容器了, 这里的”-d”参数的意思是创建好的容器会在后台运行, 如果你想持续观察容器的运行状态和日志,可以把这个参数去掉.

当你运行这个指令之后,Docker就会自动的去下载相关容器所需的环境和依赖,第一次运行的话时间会比较久(毕竟有27个步骤),需要耐心等待,等运行结束后,可以看到”Started”的字眼,就代表镜像已经打包好,并且容器也正常运行了

回到Docker Desktop的Images标签,可以看到创建好的镜像

在Containers标签里面,也可以看到正在运行的容器

点击容器(或者点后面的”…”)进入到容器的详细操作页面,在Logs这里可以看到容器运行的状态以及日志

在Console上面,也可以用”docker ps”查看到运行的容器,用”docker images”可以看到创建的镜像

上传镜像到Docker Hub

到这里,镜像文件以及容器都正常被创建和运行,可以发布到Docker Hub让其他人也使用了.

先用”docker login”确保你的登录状态没有问题

用下面的命令对刚刚创建好的镜像打个tag

docker tag <Image name> <Docker login>/<Published imagename>:<tag name>

注意: <Docker login> 必须是你在Docker注册时候的名字,不记得的可以回去https://hub.docker.com/ 登录后进入Repositories看看

比如我刚刚打包创建出来的镜像名字通过”docker images”看到是叫generativeai-server, 然后我Docker的用户名是myDockerUserName, 那我就可以用下面的命令来给这个镜像打个tag

docker tag generativeai-server myDockerUserName/generativeai:v1.0

建议可以用同样的镜像再创建一个latest的tag, 因为一般我们”docker pull <镜像>”时,如果不指定tag就默认使用latest

这样我们再用”docker images”就可以看到latest和v1.0的tag都打好了

这时候可以使用下面的命令发布刚刚创建好的镜像

docker push myDockerUserName/generativeai:v1.0

或者用Docker Desktop来操作也可以

回到Docker Desktop的Images标签,就可以看到这两个打好tag的镜像了,这时候可以点击这个镜像右边的”…”然后选择”Push to Hub”就可以了

上传结束后,来到https://hub.docker.com/的Repostories下面,就可以看到你发布的镜像了!!!

发布到Docker Hub之后,你的镜像就可以在上面被其他人搜索并下载使用,当然具体的compose.yaml文件内容,需要你提供一下,让小伙伴们知道如何运行容器

NAS Container Manager

在NAS的Container Manager里面,点击注册表标签,点击设置,新增一个Docker来源, 注册表URL为: https://index.docker.io

然后就可以在NAS的Container Manager注册表里面搜索刚刚发布的镜像,也就是说这个镜像可以在NAS的Contianer Manager下载和构建容器运行哦

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注