用Dockerfile制作一个java应用镜像,ubuntu基础篇
内容介绍:
(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:
制作镜像文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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:
执行构建镜像文件
1 2 3 | 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容器
1 2 3 4 5 6 7 8 9 10 11 | # 创建物理机本地路径:准备挂载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
1 2 3 4 5 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 | # 方式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 \<br> -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 # |
输出结果,如下:
Part 3: 进入容器内部
step 1: 进入容器内部,检查挂载目录的文件
1 2 3 4 | # 进入容器内部 docker exec -it -u 1001:1001 39d9249adda7 /bin/bash # 或者 docker exec -it 39d9249adda7 /bin/bash <br><br> hostname <br> ls -al /home/env/jdk/jdk-12/ <br> ls -al /home/app/webpay/webpay-api/ <br> ls -al /home/log/webpay/webpay-api/ |
输出结果,如下:
step 2: 进入容器,查看安装的环境和应用启动情况
1 2 | java --vesion ps -ef | grep java |
输出结果,如下:
step 3: 在外部测试和访问部署的应用服务
提醒,如果docker部署的虚拟机没有开放程序端口9080,记得要自己开放一下。
开放防火墙端口,命令如下:
1 2 3 4 5 6 | # 开放端口 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容器。
如果,大伙阅读之后,觉得有帮助,请点赞支持一下,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!