写点什么

SpringBoot + Docker 实现一次构建到处运行

作者:Java你猿哥
  • 2023-05-24
    湖南
  • 本文字数:3514 字

    阅读完需:约 12 分钟

SpringBoot + Docker 实现一次构建到处运行

一、容器化部署的好处


Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

最重要的是一致的运行环境。Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而达到真正意义上的 一次构建,到处执行。

二、构建镜像

2.1、Dockerfile

接着我们开始使用 Dockerfile 来定制我们的镜像,从而达到容器化的目的。Dockerfile 的本质就是将一系列修改、安装、构建、操作的命令整合到一起,去构建一个个性化的镜像,以达到一次构建,到处运行。接下来我们就来构建自定义镜像。

在 my-project-server 模块下创建 docker 目录,在 docker 目录下创建 Dockerfile。代码如下:

FROM openjdk:8-jre
MAINTAINER Micromaple <micromaple@qq.com>
RUN mkdir /app
COPY my-project-server-1.0.0-SNAPSHOT.jar /app/app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod,druid-prod"]
EXPOSE 8899
复制代码
  • FROM:指定基础镜像,项目是使用 jdk8 开发的项目,所以我们指定的基础镜像为 openjdk:8-jre

  • MAINTAINER:项目维护人员

  • RUN:执行命令,在根目录下创建 app 目录

  • COPY:将宿主机当前目录下的 my-project-server-1.0.0-SNAPSHOT.jar 文件拷贝到 app 目录下,并重命名为 app.jar

  • ENTRYPOINT:指定容器启动程序及参数

  • EXPOSE:指定运行时容器提供服务的端口

2.2、开始构建

在虚拟机创建目录

mkdir -p /usr/local/docker/my-project/docker
复制代码

将打包后的

my-project-server-1.0.0-SNAPSHOT.jar 文件和 Dockerfile 文件上传至该目录。


执行镜像构建命令

docker build -t my-project-server:v1 .
复制代码

构建成功

$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmy-project-server   v1                  ed30386b06d2        11 seconds ago      334MBopenjdk             8-jre               26ac3f63d29f        9 months ago        273MB
复制代码

三、搭建私服

3.1、搭建 Docker Registry

创建目录

mkdir -p /usr/local/docker/registry
复制代码

在该目录下创建 Docker Registry 的 docker-compose.yml。内容如下:

cd /usr/local/docker/registry
复制代码


version: '3.1'services:  registry:    image: registry    restart: always    container_name: registry    ports:      - 5000:5000    volumes:      - ./data:/var/lib/registry
复制代码

启动容器

docker-compose up -d
复制代码

3.2、搭建 Docker Registry WebUI

创建目录

mkdir -p /usr/local/docker/docker-registry-frontend
复制代码

在该目录下创建 Docker Registry 的 docker-compose.yml。内容如下:

cd /usr/local/docker/docker-registry-frontend
复制代码


version: '3.1'services:  frontend:    image: konradkleine/docker-registry-frontend:v2    ports:      - 8080:80    volumes:      - ./certs/frontend.crt:/etc/apache2/server.crt:ro      - ./certs/frontend.key:/etc/apache2/server.key:ro    environment:      - ENV_DOCKER_REGISTRY_HOST=192.168.110.158(Docker仓库的IP)      - ENV_DOCKER_REGISTRY_PORT=5000
复制代码

需要将 ENV_DOCKER_REGISTRY_HOST 的值更改为自己搭建的 DockerRegistry 服务的 IP

启动容器

docker-compose up -d
复制代码

浏览器访问http://192.168.110.158:8080/,效果如下:


3.3、客户端配置

在需要上传 Docker 镜像的客户端需配置 daemon.json,完整路径在 /etc/docker/daemon.json

vi /etc/docker/daemon.json
复制代码

需增加如下内容:

"insecure-registries": [  "Docker仓库的IP:5000"]
复制代码

完整 daemon.json 内容:

{  "registry-mirrors": [    "https://xxx.mirror.aliyuncs.com"  ],  "insecure-registries": [    "192.168.110.158:5000"  ]}
复制代码
  • registry-mirrors:为镜像加速地址,这里为我自己申请的加速地址。大家可以自己申请一个,也可以在网上找一个。

  • insecure-registries:Docker 仓库的 IP。

重新启动服务

systemctl daemon-reloadsystemctl restart docker
复制代码

3.4、上传私服

搭建以及配置完成后,需要将我们之前构建的镜像上传至我们自己的 Docker 仓库。

查看镜像

$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmy-project-server   v1                  6af7d633afb7        5 seconds ago       334MBopenjdk             8-jre               26ac3f63d29f        9 months ago        273MB
复制代码

1)、镜像标记

使用 docker tag 将 my-project-server:v1 这个镜像标记为 192.168.110.158:5000/my-project-server:v1。

192.168.110.158 为我的 Docker 仓库的 IP。

格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

命令如下:

docker tag my-project-server:v1 192.168.110.158:5000/my-project-server:v1
复制代码

标记后,查看镜像

$ docker imagesREPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE192.168.110.158:5000/my-project-server   v1                  6af7d633afb7        3 minutes ago       334MBmy-project-server                        v1                  6af7d633afb7        3 minutes ago       334MBopenjdk                                  8-jre               26ac3f63d29f        9 months ago        273MB
复制代码

2)、镜像上传

使用 docker push 上传镜像。

$ docker push 192.168.110.158:5000/my-project-serverThe push refers to repository [192.168.110.158:5000/my-project-server]5b9e874b9f9c: Pushed e87c042d22f8: Pushed b4cfcb8385a8: Pushed 2b730cf18c09: Pushed edeaba958753: Pushed 8bf42db0de72: Pushed 31892cc314cb: Pushed 11936051f93b: Pushed v1: digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40 size: 2000
复制代码

3)、查看镜像

使用 curl 查看 192.168.110.158:5000/v2/_catalog 地址,可以看到上传成功的镜像

$ curl 192.168.110.158:5000/v2/_catalog{"repositories":["my-project-server"]}
复制代码

这里我们可以成功的看到我们上传的镜像。

我们也可以在我们刚刚搭建的 WebUI 上可视化的查看我们的镜像。效果图如下:


4)、验证

此时我们将本地镜像删除,尝试从私有仓库下载这个镜像

先删除已有镜像

docker rmi my-project-server:v1 192.168.110.158:5000/my-project-server:v1
复制代码

下载镜像

docker pull 192.168.110.158:5000/my-project-server:v1
复制代码


$ docker pull 192.168.110.158:5000/my-project-server:v1v1: Pulling from my-project-server0e29546d541c: Already exists 9b829c73b52b: Already exists cb5b7ae36172: Already exists 99ce012bef04: Already exists 22dc2a72d098: Already exists 9c69a57e10d9: Already exists 776f54050ab5: Pull complete 65a83a9a7871: Pull complete Digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40Status: Downloaded newer image for 192.168.110.158:5000/my-project-server:v1192.168.110.158:5000/my-project-server:v1$ docker imagesREPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE192.168.110.158:5000/my-project-server   v1                  6af7d633afb7        15 minutes ago      334MBopenjdk                                  8-jre               26ac3f63d29f        9 months ago        273MB
复制代码

我们可以看到可以正常拉取。

四、容器启动

镜像构建并上传至完成后,可以直接使用 Docker Compose 来启动容器。实现一次构建到处运行。

创建目录

mkdir -p /usr/local/docker/my-project
复制代码

在该目录下创建 Docker Registry 的 docker-compose.yml。内容如下:

cd /usr/local/docker/my-project
复制代码


version: '3.1'services:  my_project_server:    image: 192.168.110.158:5000/my-project-server:v1    container_name: my-project-server    restart: always    ports:      - 8899:8899    volumes:      - ./logs:/logs    environment:      TZ: Asia/Shanghai
复制代码

启动容器

docker-compose up -d
复制代码

查看容器启动状态

docker ps -a
复制代码

访问查询所有用户接口

http://ip:8899/sys-user/get/all


用户头像

Java你猿哥

关注

一只在编程路上渐行渐远的程序猿 2023-03-09 加入

关注我,了解更多Java、架构、Spring等知识

评论

发布
暂无评论
SpringBoot + Docker 实现一次构建到处运行_Java_Java你猿哥_InfoQ写作社区