内容介绍:

(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

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

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

 

step 3:
检查镜像文件结果

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

 

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:测试方式:默认用户 root【不推荐】 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 #

输出结果,如下: 

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

 

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/

 输出结果,如下:

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

 

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

java --vesion
ps -ef | grep java

输出结果,如下:

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

 

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

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

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

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

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

 

 

Step 4:

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

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

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

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

 (2) Docker: TPS = 8671 / s

用Dockerfile制作一个java应用镜像,ubuntu基础篇

 

后续文档,如下:

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

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