内容介绍:

(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. TCP与UDP的联系与区别

    TCP(Transmission Control Protocol,传输控制协议) 他是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接. 这说明TCP连接是一个非常复杂的过程,需 ...

  2. 编写HelloWorld并运行

    1在任意地方右键点新建 2创建一个文本文档 3修改名字,改为HelloWorld.java 4打开文件扩展名,查看后缀 打开后再去看文件名后缀有没有.txt,如果有的话就不是java文件,把后缀的.t ...

  3. SQL生成脚本

    右键要生成脚本的数据库 选择task 选择Generate script 选择需要生成脚本的table.view.procedure

  4. KNN算法之集美大学

     在本篇文章中,我即将以在集美大学收集到的一些数据集为基础,使用KNN算法进行一系列的操作 一.KNN算法 首先,什么是KNN算法呢,这得用到老祖宗说的一句话"近朱者赤近墨者黑", ...

  5. SpringBoot 常用注解的原理和使用

    @AutoConfiguration 读取所有jar包下的 /META-INF/spring.factories 并追加到一个 LinkedMultiValueMap 中.每一个url中记录的文件路径 ...

  6. springboot项目整合-注册功能模块开发

    工程简介 准备工作:项目所用到的html界面以及sql文件链接如下:链接: https://pan.baidu.com/s/18loHJiKRC6FI6XkoANMSJg?pwd=nkz2 提取码: ...

  7. 有依赖的背包问题(Acwing 10)

    1 # include<iostream> 2 # include<cstring> 3 # include<algorithm> 4 using namespac ...

  8. Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo

    前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli,但在中大型的企业级项目中,通 ...

  9. EXCEL_BASIC

    公式类 比较大小 A1单元格的值大于B1单元格时为"A",小于时为"a",等于时为"e" =IF(A1>B1,"A" ...

  10. Java8新特性—四大内置函数式接口

    Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...