内容介绍:

(1) 本章目的,将一个自行开发的java程序webpay-api,制作为docker自定义镜像,并且进行部署。

(2) 实验环境:

  物理机:VMware 虚拟机 + CentOS 7.8 x64

  Docker:Docker version 20.10.17, build 100c701

(3) 基础镜像: ubuntu:latest

制作步骤:

主要是,前期程序文件准备和上传(略:java程序文件), 后续镜像文件构建,以及最后容器部署和容器检查。

步骤细节:

Part 1: 制作镜像文件

step 1:
制作镜像文件

mkdir -p /home/src/webpay-api/ubuntu-v/

cat <<EOF> /home/src/webpay-api/ubuntu-v/webpay-api.Dockerfile
FROM ubuntu:latest
MAINTAINER tian.dong <tiandong19860806@126.com>
# ============================================================================================================== # step 1: 初始化依赖环境
# RUN mkdir -p {/home/env/jdk,/home/app/webpay/webpay-api,/home/log/webpay/webpay-api} # 如果是-v参数外部挂载目录,则不需要和不能手动创建
VOLUME ["/home/env/jdk", "/home/app/webpay/webpay-api", "/home/log/webpay/webpay-api"] COPY app/* /home/app/webpay/webpay-api/
# ADD jdk/jdk-12.0.33-x64_bin.tar.gz /home/env/jdk/ RUN chmod +x /home/app/webpay/webpay-api/*.sh && \
sh -c /home/app/webpay/webpay-api/install-jdk.sh && \
sh -c /home/app/webpay/webpay-api/install-app.sh
# ============================================================================================================== # step 2: 安装和启动程序
# 开放端口
EXPOSE 9080
# 启动程序命令
ENTRYPOINT ["/bin/bash", "-c", "/home/app/webpay/webpay-api/startup.sh"]
# ==============================================================================================================
EOF

step 2:
执行构建镜像文件

cd /home/src/webpay-api/ubuntu-v/
# *.dockerfile文件路径参数,后面的"."符号一定不要忘记。
docker build -f ./webpay-api.Dockerfile . -t app-webpay-api-ubuntu:2.0.0

执行构建成功,结果输出如下:

step 3:
检查镜像文件结果

Part 2: 启动容器实例

部署容器之前,执行准备工作:比如挂载目录的创建和授权

step 1:
创建物理机本地路径:准备挂载docker容器

# 创建物理机本地路径:准备挂载docker容器上面
mkdir -p {/home/env/jdk,/home/app/webpay/webpay-api,/home/log/webpay/webpay-api}
# 授权docker账号的文件路径访问权限
chmod -R a+x /home/env/jdk && \
chown -R docker:docker /home/env/jdk
#
chmod -R a+x /home/app/webpay/webpay-api && \
chown -R docker:docker /home/app/webpay/webpay-api
#
chmod -R a+x /home/log/webpay/webpay-api && \
chown -R docker:docker /home/log/webpay/webpay-api

step 2:
查询物理机的账号docker的uid:后面启动容器要说明用户参数,必须用uid,不能使用username

cat /etc/passwd | grep docker
# 输出结果,如下:
## [root@CNT7XVM01 ~]# cat /etc/passwd | grep docker
## docker:x:1001:1001::/home/docker:/bin/bash
## [root@CNT7XVM01 ~]#

step 3:
启动容器,声明启动用户、挂载目录、命令环境
参数 -d:将容器在后台运行
参数 -t: 使用虚拟终端

# 方式1:推荐方式:指定用户 docker
docker run -td -u 1001:1001 -p 9080:9080 -v /home/env/jdk:/home/env/jdk \
-v /home/app/webpay/webpay-api:/home/app/webpay/webpay-api \
-v /home/log/webpay/webpay-api:/home/log/webpay/webpay-api \
-port 9080:9080 \
app-webpay-api-ubuntu:2.0.0 \
/bin/bash
# 或者,
# 方式2:测试方式:默认用户 docker 【不推荐】
docker run -td -p 9080:9080 -v /home/env/jdk:/home/env/jdk \
-v /home/app/webpay/webpay-api:/home/app/webpay/webpay-api \
-v /home/log/webpay/webpay-api:/home/log/webpay/webpay-api \
app-webpay-api-ubuntu:2.0.0 \
/bin/bash
#

输出结果,如下:

Part 3: 进入容器内部

step 1: 进入容器内部,检查挂载目录的文件

# 进入容器内部
docker exec -it -u 1001:1001 39d9249adda7 /bin/bash
# 或者
docker exec -it 39d9249adda7 /bin/bash

hostname
ls -al /home/env/jdk/jdk-12/
ls -al /home/app/webpay/webpay-api/
ls -al /home/log/webpay/webpay-api/

输出结果,如下:

step 2: 进入容器,查看安装的环境和应用启动情况

java --vesion
ps -ef | grep java

输出结果,如下:

step 3: 在外部测试和访问部署的应用服务

提醒,如果docker部署的虚拟机没有开放程序端口9080,记得要自己开放一下。

开放防火墙端口,命令如下:

# 开放端口 9080
firewall-cmd --zone=public --add-port=9080/tcp --permanent && \
# 保存设置:永久保存
firewall-cmd --reload && \
# 查询开放的端口
firewall-cmd --zone=public --list-ports

Step 4:

对部署的docker 应用服务,执行jemeter压力测试。

对比VM虚拟机部署和Docker方式部署(同一台机器,资源参数和应用并发参数相同),两者性能测试结果差别如下:相差10%。

(1) VM 虚拟机: TPS = 9644 / s

(2) Docker: TPS = 8671 / s

后续文档,如下:

将介绍使用不同基础镜像:centos / alphine / adobe openjdk-8 / 12 制作java程序镜像和优化镜像文件大小,以及docker-compose方式部署docker容器。

如果,大伙阅读之后,觉得有帮助,请点赞支持一下,谢谢!

 

用Dockerfile制作一个java应用镜像,ubuntu基础篇的更多相关文章

  1. Docker镜像管理基础篇

    Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...

  2. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步

    Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述     PV操作是对信号量进行的操作.     进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...

  3. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  4. 使用Dockerfile制作自己的Docker镜像

    一.背景 一直以来的开发流程都是先从Docker Hub中获取到基础镜像,之后在这个镜像的基础上做开发,以满足一定的需求或者提供某种服务,并由此产生新的镜像,然后就可以push到Docker Hub中 ...

  5. 从零开始制作一个linux iso镜像

    一.前言     对于一个极简化的linux系统而言,只需要三个部分就能组成,它们分别是一个linux内核.一个根文件系统和引导.以下是本文制作linux iso镜像所用到的系统和软件:     OS ...

  6. java类与对象基础篇

    java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...

  7. 封装win7系统、制作win7GHO镜像、制作一个自定义的镜像文件具体步骤、制作Win10镜像gho

    作者:导演你让灰太狼吃只羊 来源:CSDN 原文:https://blog.csdn.net/qq_35057426/article/details/83015516 版权声明:本文为博主原创文章,转 ...

  8. Java入门到精通——基础篇之static关键字

    一.概述        static 关键字是声明静态变量,静态方法用的.static的含义是属于类且不属于类对象的变量和函数. 二.static的产生.         在创建对象的时候除非用new ...

  9. Java入门到精通——基础篇之面向对象

    一.概述. Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性: 1)万物皆为对象. 2)程序是对象的集合. 3)每个对象都有自己的由其他对象所构成的存储 ...

  10. java开发之多线程基础篇

    首先我们先来了解下线程的生命周期上一张图: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态( ...

随机推荐

  1. 基于Netty的TCP服务框架

    19年写的一个基础的TCP服务框架,内置了一个简单IOC容器,当时的目标是一方面能作为组件供第三方集成实现TCP通讯相关功能,另一方面作为提供一种服务框架范式.所以框架核心点主要还是通过适度的封装,隐 ...

  2. TomCat之负载均衡

    TomCat之负载均衡 本文讲述了tomcat当nginx负载均衡服务器配置步骤 以下是Tomcat负载均衡配置信息 1.修改nginx的nginx.conf文件 添加如下属性:localhost是名 ...

  3. 堆内存动态分配情况和jvm调优方向

    由上图可以看出: 堆中分为新生代(占堆1/3内存)和老年代(占堆2/3内存), 新生代又分为Eden区(占新生代内存的8/10)和survivor区(占新生代内存的2/10), survivor区又分 ...

  4. Linux 下配置 hosts 并设置免密登录

    Linux 下配置 hosts 并设置免密登录 作者:Grey 原文地址: 博客园:Linux 下配置 hosts 并设置免密登录 CSDN:Linux 下配置 hosts 并设置免密登录 说明 实现 ...

  5. 驱动开发:内核特征码扫描PE代码段

    在笔者上一篇文章<驱动开发:内核特征码搜索函数封装>中为了定位特征的方便我们封装实现了一个可以传入数组实现的SearchSpecialCode定位函数,该定位函数其实还不能算的上简单,本章 ...

  6. SQL--临时表的使用

    临时表的创建 临时表分为:本地临时表和全局临时表 通俗区分: 本地临时表:只能在当前查询页面使用,新开的查询是不能使用它的     #temp 全局临时表:不管开多少查询页面都可以使用  ##temp ...

  7. UEC 利用代理/委托写一个生命组件

    首先基于ActorComponent创建一个组件 HealthComponent,将需要的变量与函数创建 #include "CoreMinimal.h" #include &qu ...

  8. JavaSPI详解

    目录 一个问题 什么是SPI API 与 SPI 一个简单的例子 SPI机制的实现 Java SPI的问题 为什么SPI机制打破了双亲委派模型 参考资料 一个问题 在项目开发中,经常会使用到数据库驱动 ...

  9. JavaScript 实现地图搜索功能

    需求:输入框输入地址点击查询,查询结果在地图定位到查询位置,显示查询位置的经纬度 <html xmlns="http://www.w3.org/1999/xhtml"> ...

  10. 2022春每日一题:Day 25

    题目:青蛙的约会 读完题,显然可以的到下同余方程:x+mk≡y+nk (mod L) 移项变成 (m-n)k+aL=y-x 只有k,L是未知的,而这题要求非负整数k的最小值,显然拓展欧几里得算法. 然 ...