Docker与Java开发 中篇

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

在开发过程中使用Docker的承诺是提供一个一致的测试环境,跨开发者机器和使用中的各种环境(如QA和生产)。困难在于,Docker容器引入了一个额外的抽象层,开发人员必须在编码期间进行管理。

Docker使得应用程序代码可以与系统需求定义捆绑在一个跨平台、可运行的包中。这是一个优雅的抽象,解决了部署和管理软件运行时的基本需求,但它引入了一个额外的间接层,当程序员在做他们所做的事情时,必须处理好这个问题:反复修改和测试软件的内部及其依赖关系。

创建一个URL

只需添加一个用于测试的快速端点。使用visrc/main/java/com/example/javadocker/DemoApplication.java(或者你选择的编辑器),将主类修改成清单1的样子。

清单 1. 添加一个端点

import org.springframework.boot.SpringApplication。
import org.springframework.boot.autoconfigure.SpringBootApplication。
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController。

@SpringBootApplication
@RestController
public class DemoApplication {
  @RequestMapping("/")
    public String home() {
         return "Hello World!";
      }
public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args)。
  }
}
复制代码

现在你可以用Ctrl-c停止Tomcat,并通过输入以下内容重建/重新启动。

mvnw spring-boot:run。
复制代码

如果你在浏览器中导航到该应用程序,你会看到简单的 "Hello World "响应。

Dockerize项目

首先按照Debian官方的Docker说明安装Docker。依次输入以下每个命令。

sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources. list. d/docker. list > /dev/null
sudo apt-get update 
sudo apt-get install docker-ce docker-ce-cli containerd. io
复制代码

创建一个Docker文件

创建Docker文件有多种方法,包括使用Maven插件。 在这个项目中,我们将手工建立一个简单的Docker文件,以了解它的情况。 使用编辑器创建一个名为dockerfile的文件,添加清单2的内容。

清单2.一个基本的Java/Spring Docker文件

# syntax=docker/dockerfile:1

FROM openjdk:16-alpine3.13

WorkKDIR /app

COPY . mvn/ . mvn
COPY mvnw pom. xml ./
RUN ./mvnw dependency:go-offline

COPY src ./src

CMD ["./mvnw", "spring-boot:run"]
复制代码

为了简单起见,我们在这里忽略了组和用户,但在现实世界中,你将需要处理这些问题。

这个Docker文件使用OpenJDK作为基础层,然后我们移到/app工作目录。

接下来我们引入所有Maven文件,并以离线模式运行Maven。(这样我们就可以避免以后重新下载依赖项。)然后Dockerfile将应用源复制过来,并运行spring-boot:run命令。

请注意,我们要做的是开发用的镜像,而不是生产用的。你不会在生产中使用spring-boot:run。 如果正在运行的应用程序仍在运行,就停止它。

现在我们来构建和运行这个。 首先运行docker build命令。

sudo docker build --tag idg-java-docker
复制代码

等待构建,然后用docker run跟随。

sudo docker run -d -p 8080:8080 idg-java-docker
复制代码

这将建立你的Docker镜像,然后在一个新容器中启动它。当你调用运行命令时,它将吐出一个UID,例如(在我的例子中)。

d98e4d19dab71fa69b2331485b70b5c87f20de864238e5798ad3aa8c5b576014
复制代码

你可以再次用浏览器访问该应用,仔细检查该应用是否在运行,并且在8080端口可用。

你可以用sudo docker ps检查运行中的容器。你应该看到相同的UID正在运行。用sudo docker kill来停止它。注意,你只需要输入足够的UID就可以了(类似于Git的签入ID),所以在我的例子中,

sudo docker kill d98
复制代码

这个Docker文件是运行应用程序的一个合理的开端(接下来是用户和层),但是请停一下,考虑一下你需要做什么来更新运行中的应用程序。 为了改变简单的问候语,你需要改变代码,停止运行中的Docker容器,用docker build构建镜像,然后用docker run启动容器。 我们怎样才能改善这种状况?

感谢观看,如果您有兴趣,可以关注一下我,方便查看后续文章,一起学习,共同进步,不胜感激!

猜你喜欢

转载自juejin.im/post/7034685556760150053