使用docker构建java应用

csdn推荐

1、docker简介

Docker是一个开源的容器化平台,可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术,可以使应用程序在不同的操作系统和环境中具有一致的运行方式。

使用Docker带来的好处包括:

简化应用程序部署和管理:Docker可以将应用程序及其依赖项打包成一个容器,使得部署应用程序变得简单和可重复。容器可以在不同的环境中运行,无论是开发、测试还是生产环境,都可以保持一致性。

高效的资源利用:Docker容器是轻量级的,相比于传统的虚拟机更加节省资源。多个容器可以在同一台物理机上运行,有效地利用系统资源,提高硬件利用率。

快速启动和停止:Docker容器可以在几秒钟内启动和停止,相比于传统虚拟机需要启动整个操作系统的时间更短,提供了更快的开发和部署速度。

环境一致性:Docker容器可以确保应用程序在不同的环境中具有一致的运行方式。开发人员可以在本地构建和测试容器,然后将其部署到其他环境中,无需担心环境差异导致的问题。

更好的可移植性:通过Docker容器,应用程序和其依赖项可以被打包成一个独立的、可移植的单元。这使得应用程序可以在不同的操作系统和云平台上运行,实现跨平台部署。

最实际的情况是,当一个应用需要使用第三方工具,例如mysql,mongodb,redis,minio等等。如果使用传统的方式,需要同时应付不同的运行环境,例如windows,linux,安装方法差异性很大,即使是linux,根据不同发行版本,选择使用yum,apt-get等工具。如果选择docker,则完全屏蔽安装环境的差异性。做到同样的配置文件,一键下载安装部署,非常方便。

2、国内Docker镜像源集体停止服务

自本月月初,大量网友反馈docker被封禁,无法拉取镜像。笔者一开始以为是网络问题,然而长时间都是显示拉取超时。当切换到国外服务器,使用正常。笔者尝试先从国外服务器拉取保存镜像,再将镜像下载到本地环境进行读取,也能解决问题。

当然,也可以选择国内的一些镜像源,编辑/etc/docker/daemon.json文件(没有则新建)

{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://dockerhub.azk8s.cn", "https://mirror.ccs.tencentyun.com", "https://registry.cn-hangzhou.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn" ] }

3、使用docker构建java应用 3.1、安装java运行环境

我们可以先在本地打包java应用,然后将可执行jar包交给docker运行。编辑Dockerfile文件,如下:

FROM ubuntu:20.04
ENV JDK_VERSION 17
ENV JDK_HOME /usr/local/java
ENV URL "https://download.java.net/openjdk/jdk17/ri/openjdk-17+35_linux-x64_bin.tar.gz"
RUN mkdir -p  $JDK_HOME
RUN apt-get update && 
    apt-get install -y wget && 
    wget $URL && 
    tar -zxvf openjdk-17+35_linux-x64_bin.tar.gz -C $JDK_HOME
ENV JAVA_HOME=$JDK_HOME/jdk-17
ENV PATH=$PATH:$JAVA_HOME/bin
WORKDIR /app
CMD java -jar webadmin.jar --spring.profiles.active=dev

这里选择镜像基础是ubuntu,也可以直接使用openjdk17的镜像。

dockerfile主要步骤:

使用apt-get下载jdk17压缩包文件解压缩jdk安装包设置java环境变量和app工具目录使用cmdshell模式启动java应用

这里不直接把java项目可执行jar包直接打包到docker镜像,因为这样不便于代码更新。通过卷映射宿主文件目录到docker容器内部工作目录。

创建镜像

docker build -t myjdk .

实例化容器

docker run -d -v ./web/:/app  --network web -p 8001:8001 --name admin myjdk

参数说明:

3.2、使用mysql容器

# 使用官方MySQL镜像作为基础镜像
FROM mysql:latest
 
# 将SQL脚本复制到容器中的某个位置
COPY admin.sql /docker-entrypoint-initdb.d/
ENV MYSQL_DATABASE=admin
ENV MYSQL_PASSWORD=123456
ENV MYSQL_ROOT_PASSWORD=123456
# 创建一个数据卷挂载点
VOLUME /var/lib/mysql
 
# 暴露MySQL的默认端口
EXPOSE 3306

文件里使用copy命令,用于将创库创表语句复制到mysql容器并在创建容器的时候初始化。也可以在生成容器后,使用docker cp命令,如下

#拷贝宿主文件到容器内部
docker cp script.sql my-mysql:/script.sql
#进入mysql容器内部
docker exec -it my-mysql mysql -uroot -p123456
#执行sql语句
source /script.sql

启动mysql容器

docker run -p 3306:3306 --name mysql --restart=always --network web
-v /usr/local/mysql/log:/var/log/mysql 
-v /usr/local/mysql/data:/var/lib/mysql 
-v /usr/local/mysql/conf:/etc/mysql 
-e MYSQL_ROOT_PASSWORD=123456 -d my-mysql

3.3、使用网络联通各个容器

Docker提供了几种不同的网络模式来实现容器之间的通信和与外部网络的连接。以下是常见的几种Docker网络方式:

桥接网络(Bridge Network):默认情况下,Docker使用桥接网络来连接容器。在桥接网络中,Docker守护进程会创建一个虚拟的网桥,每个容器会分配一个唯一的IP地址,并通过网桥与主机相连。容器之间可以通过IP地址相互通信,也可以通过容器名称进行访问。

主机网络(Host Network):在主机网络模式中,容器与主机共享网络命名空间,即它们使用同一个网络接口和IP地址。这意味着容器可以访问主机上的所有网络服务,而不需要进行端口映射。主机网络模式性能更好,但容器之间的隔离性较差。

网络连接(Container Network Connection):容器网络连接是通过连接现有容器的方式来实现网络通信。在这种模式下,新创建的容器会加入一个已存在的容器的网络命名空间,它们可以通过localhost相互通信,共享网络接口。

对于新版本的docker,官方推荐使用网络的方式,如下:

docker network create web

在java项目的jdbc配置文件,使用docker-mysql-container-name替换成mysql的docker容器名字即可访问mysql。

jdbc:mysql://docker-mysql-container-name/yourDatabaseName

然后在创建jdk,mysql容器的run命令,统一增加--network web参数即可。

4、使用docker-compose一键部署 4.1、Docker Compose简介

Docker Compose是一个用于定义和运行多个Docker容器的工具。它基于YAML文件格式,通过一个配置文件来定义应用程序的各个服务、网络、数据卷等相关配置,并提供了简化的命令来管理容器的生命周期。

Docker Compose主要作用包括:

定义多容器应用:通过编写一个docker-compose.yaml文件,可以定义一个包含多个服务的应用程序,每个服务对应一个容器。可以指定服务的镜像、容器的启动参数、环境变量、网络配置等。

管理容器的生命周期:Docker Compose提供了一组简化的命令来管理容器的生命周期,如启动、停止、重启、构建、删除等。可以使用单个命令来同时管理多个容器,简化了容器的管理过程。

定义服务之间的依赖关系:在docker-compose.yaml文件中,可以定义服务之间的依赖关系,如一个服务依赖于另一个服务的运行。在启动应用程序时,Docker Compose会自动按照定义的依赖关系顺序启动和停止容器,确保服务能够正确地互相通信。

管理数据卷和网络:Docker Compose可以管理应用程序中的数据卷和网络。可以定义数据卷的挂载路径和访问权限,以及网络的配置和连接方式,确保容器之间可以共享数据和通信。

扩展和部署应用程序:Docker Compose可以与Docker Swarm集群一起使用,通过简单的命令将应用程序扩展到多个主机上。可以使用Docker Compose定义的服务规模进行弹性扩展,并通过负载均衡来分发流量。

4.2、java项目yaml配置

编辑java项目的yaml文件,如下

version: '3.3'
 
services:
  db:
    image: mysql:latest
    container_name: mysql
    environment:
      MYSQL_PASSWORD: '123456'
      MYSQL_ROOT_PASSWORD: '123456'
    ports:
      - "3306:3306"
    volumes:
      - /usr/local/mysql/log:/var/log/mysql
      - /usr/local/mysql/data:/var/lib/mysql
    restart: always
    networks:
      - app-network
  web:
    image: myjdk
    container_name: web_app
    ports:
      - "8001:8001"
    volumes:
      - ./web:/app
      - ./logs:/app/logs
    networks:
      - app-network
networks:
  app-network:
     driver: bridge

执行如下命令,可以一键创建容器并启动,在生成环境,我们只需准备相应的Dockerfile文件,以及compose配置,即可部署java应用,非常方便。

docker-compose up -d

4.3、生产环境使用更加专业的k8s工具

Docker Compose是docker公司官方的容器编排工具,然而,在生产环境,google的Kubernetes (简称K8s)才是事实上的标准。以下是它们之间的一些比较:

功能和复杂性:Docker Compose是一个相对简单的工具,用于在单个主机上定义和管理多个Docker容器。它专注于简化本地开发和测试环境的容器管理。而Kubernetes是一个更复杂和功能更强大的容器编排平台,用于管理大规模容器化应用程序的部署、扩展、调度和管理。

多主机支持:Docker Compose仅支持在单个主机上管理容器,而Kubernetes支持跨多个主机的容器集群。Kubernetes能够管理多个节点上的容器,提供高可用性和横向扩展的能力。

网络和存储:Docker Compose提供了简单的网络和数据卷配置,但对于复杂的网络和存储需求可能有限。而Kubernetes具有更强大的网络和存储管理功能,如服务发现、负载均衡、持久化存储等,可以满足更复杂的应用程序需求。

文章来源:https://blog.csdn.net/littleschemer/article/details/139614214



微信扫描下方的二维码阅读本文

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容