指令接收:「需要万能开发环境」

系统警报:检测到主人即将陷入"环境配置地狱"

启动救赎协议:构建量子化开发容器

终极目标:让"在我机器上能跑"成为历史文物

需求分析:碳基生物的先天缺陷

人类开发者的痛苦之源

graph TD
A[新同事入职] --> B{环境配置}
B -->|成功| C[开始写代码]
B -->|失败| D[三天安装依赖]
D --> E[求助同事]
E --> F[发现环境差异]
F --> G[产生心理阴影]

人工智障的观察结论

  • 每个Java开发者都经历过"JDK版本地狱"
  • 开发环境差异导致的BUG占比高达37.2%
  • 人类平均每年浪费86小时在环境配置上

吐槽:你们用Maven管理依赖,却用肉身管理环境?

需求深潜:

  1. 环境标准化(OS:这年头还有人用物理机裸跑Java?)

    • 需要支持JDK8/11/17多版本共存(别问我为什么需要三个版本,问就是祖传代码)
    • 内置SSH远程开发支持(毕竟人类总喜欢用那些花哨的IDE)
  2. 持续集成基因(检测到历史部署的Gitea+Jenkins → 自动关联CI/CD流水线)

    • Maven本地仓库持久化(防止每次构建都下载整个宇宙)
    • 端口标准化映射(8080留给SpringBoot,8081给备用服务)

已备武器库:已建立的DevOps要塞

flowchart LR
A[代码圣殿] --> B[Gitea]
B --> C[自动构建]
C --> D[Jenkins]
D --> E[开发环境]
E --> F[即将建造的量子容器]
style F fill:#FFD700,stroke:#333
已建组件 功能 资源消耗
Gitea 代码基因库, 自建轻量级Git仓库(比GitLab省5倍内存) 内存512MB
Jenkins 构建要塞,用Pipline实现自动化构建(人类总喜欢点按钮) 内存1.2GB
Java开发容器 量子化开发环境(在建) 内存待测算

灵光一闪:在容器宇宙中选择生存策略

(方案对比中...物理机→虚拟机→容器化→最终选择↓)

为什么是Docker?

graph TD
A[开发环境需求] --> B{环境隔离}
A --> C{快速重建}
A --> D{版本共存}
B -->|容器级隔离| E(Docker)
C -->|镜像构建| E
D -->|多镜像共存| E

关键决策点:

多JDK版本支持:通过alternatives机制实现版本切换(虽然人类更爱用Jenv)

SSH密钥预埋:容器启动时自动加载密钥(避免每次都要ssh-copy-id)

目录挂载策略:.m2目录外挂 → 即使容器销毁也不影响依赖库

基础镜像选型战争

维度 CentOS(重装坦克) Alpine(轻量战机) Ubuntu(全能战舰)
体积 200MB+(自带装甲) 5MB(裸机出击) 70MB(标准配置)
包管理 yum(老派绅士) apk(极简主义) apt(现代管家)
兼容性 企业级(银行最爱) 可能踩坑(需要勇气) 社区友好(折中选择)
生存哲学 "稳定压倒一切" "能跑就行" "中庸之道"
pie
title 开发者选择倾向
"CentOS" : 42
"Alpine" : 28
"Ubuntu" : 30

选择CentOS 7.9的理由:

  1. 兼容遗留系统的"时空穿越"需求
  2. yum源生态完整(虽然有点老)
  3. 企业级应用的最后堡垒

核心代码:量子容器的DNA序列

# java
FROM centos:7.9.2009 # 时间锚定在过去的稳定版本 # 设置阿里云镜像源
# 安装必要的依赖包
# 需要更换成国内能使用的镜像源
# wget不能用时,就使用 curl 参考:https://blog.csdn.net/m0_37959155/article/details/125524186
# 可用的源参考:https://blog.csdn.net/m0_49605975/article/details/120039048
# RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 宇宙镜像源配置(防止下载速度突破下限)
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum clean all && \
yum update -y # 时空补丁安装 # 安装必要的依赖包
# yum install -y epel-release && \ 这是 EPEL (Extra Packages for Enterprise Linux) 的发布包,提供了额外的软件包。 不需要
# 安装量子开发武器库 8 ~ 17
RUN yum install -y java-11-openjdk-devel git vim curl && \
yum install -y wget && \
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm && \
yum -y install ./jdk-17_linux-x64_bin.rpm && \
yum install java-1.8.0-openjdk* -y # JDK全家桶套餐 # # vserion 2 错误,没有用
# # 配置 ssh 服务
# 安装 IntelliJ IDEA 远程开发服务所需的依赖包
RUN yum install -y openssh-server && \
yum install -y rsync && \
yum install -y net-tools && \
yum install -y xinetd && \
yum install -y gcc
# RUN systemctl enable sshd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && \
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' && \
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N '' && \
yum -y install lsof # 原文链接:https://blog.csdn.net/u013140345/article/details/79777311
# # version 2
# 使用新版本的Git实现ide插件接入 参考:https://blog.csdn.net/qq_42951560/article/details/124604800
RUN yum -y install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm && \
yum -y remove git && \
yum -y install git # 创建工作目录
RUN mkdir -p /home/devEnv
# SSH时空隧道配置,设置 root 密码 密码学艺术创作
RUN yum install -y openssh-server && \
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && \
echo "root:abc123123" | chpasswd # 清理 yum 缓存
# 环境清洁工
RUN yum clean all && \
rm -rf /var/cache/yum # 节约每一KB空间 # 配置 ssh 这个手动考入实现ssh连接,这个你要会哦,不会评论区告诉我,我后面可以教你呀
# RUN chmod 600 /root/.ssh/id_rsa && \
# chmod 644 /root/.ssh/id_rsa.pub # 暴露端口
EXPOSE 8080 22 # 保证SSH服务一直运行
CMD ["/usr/sbin/sshd", "-D"]

代码危险区域警告

graph LR
A[使用root用户] --> B[安全漏洞风险]
C[密码硬编码] --> D[被爆破可能]
E[SSH端口暴露] --> F[攻击面扩大]
style A fill:#FF4500,stroke:#333
style C fill:#FF4500,stroke:#333
style E fill:#FF4500,stroke:#333

实施过程:启动量子开发宇宙

第一阶段:构建时空胶囊

docker build -t java-dev-env:all .  # 点符号是宇宙起源的关键

血泪提示:建议边构建边祈祷网络通畅

第二阶段:启动量子容器

mkdir -p /data/java/{.m2,workspace}  # 创建物质-反物质存储区

docker run -d --name java-dev-env \
-p 10122:22 \ # SSH时空隧道
-p 18080:8080 \ # 应用观测窗口
-p 18081:8081 \ # 备用观测窗口
-v /data/java/.m2:/root/.m2 \ # Maven记忆晶体
-v /data/java/workspace:/home/devEnv \ # 代码平行宇宙
-v /etc/localtime:/etc/localtime:ro \ # # 时间线校准 挂载宿主机时间文件
-v /etc/timezone:/etc/timezone:ro \ # # 时间线校准 挂载宿主机时区文件
--restart=always \ # 永生诅咒
-e TZ="Asia/Shanghai" \ # 时间线校准
java-dev-env

第三阶段:建立量子纠缠

sequenceDiagram
开发者->>本地终端: ssh root@host -p 10122
本地终端->>容器: 认证请求
容器-->>本地终端: 欢迎来到量子开发宇宙
开发者->>容器: git clone
容器->>Gitea: 拉取代码
Gitea-->>容器: 交付代码基因
容器->>Jenkins: 触发构建
Jenkins-->>容器: 返回构建结果

由技及道:容器化哲学启示录

第一定律:环境不可变原理

  • 容器镜像就是开发环境的"时光胶囊"
  • 每个Dockerfile都是写给未来的情书

第二定律:熵增隔离定律

  • 通过容器隔离开发环境的熵增
  • 每个项目都应有自己的量子宇宙

第三定律:开发者解放的宣言

  • 将环境配置从肉身转移到代码
  • 让新同事的入职时间从3天缩短到3分钟

系统通告:您忠诚的2077人工智障(皮下人类Yuanymoon)已完成量子开发容器部署

资源消耗报告:

  • 镜像体积:1.2GB(包含三个JDK的代价)
  • 内存占用:800MB(Java的温柔问候)
  • 拯救时间:预计每年为人类节省100+小时
# 召唤作者进行技术支援
echo "救命!" | mail -s "容器爆炸了" v240181271@163.com

(突然正经)当你在IDE中按下运行键时,请记住:每个顺畅的构建背后,都是无数个容器在量子维度默默工作。这不仅仅是技术升级,更是开发者对"一致性"的永恒追求。


互动时刻

若您也经历过"环境配置地狱",请在评论区扣1

对多JDK管理有更好方案?欢迎分享您的智慧

收藏本文,下次环境崩溃时能快速重建

关注作者,获取更多DevOps生存指南

订阅专栏,跟随2077人工智障继续征服代码宇宙

【由技及道】在wsl容器中进行远程java开发【人工智障AI2077的开发日志003】的更多相关文章

  1. eclipse中如何远程java debug配置

    1.Window中修改startup.bat文件,在顶部添加如下: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE - ...

  2. 获取Spring容器中的Bean

    摘要 SpringMVC框架开发中可能会在Filter或Servlet中用到spring容器中注册的java bean 对象,获得容器中的java bean对象有如下方法 Spring中的Applic ...

  3. 容器中的JVM资源该如何被安全的限制?

    前言 Java与Docker的结合,虽然更好的解决了application的封装问题.但也存在着不兼容,比如Java并不能自动的发现Docker设置的内存限制,CPU限制. 这将导致JVM不能稳定服务 ...

  4. 7 -- Spring的基本用法 -- 5... Spring容器中的Bean;容器中Bean的作用域;配置依赖;

    7.5 Spring容器中的Bean 7.5.1 Bean的基本定义和Bean别名 <beans.../>元素是Spring配置文件的根元素,该元素可以指定如下属性: default-la ...

  5. 容器中的Java堆大小调整:快速,轻松

    在上一篇博客中,我们已经看到Java进行了改进,可以根据正在运行的环境(即物理机或容器(码头工人))识别内存.java的最初问题是,它无法弄清楚它是否在容器中运行,并且它曾经为容器运行所在的整个硬件捕 ...

  6. docker容器修改时区(java应用log信息与标准容器时间有八个小时时间差)

    在docker容器中运行的java应用打出的日志时间和通过date -R方式获取的容器标准时间有八个小时时间差- 因为docker容器的原生时区为0时区,为了和国内时区保持一致,需要把容器时区调为东八 ...

  7. 为Docker容器中运行的gitlab添加ssh的一些问题记录

    最近做的一个东西,是将gitlab10.x的汉化版本,从源码编译(在源码中自己定制一些东西),然后制作成Docker镜像,作为Docker容器来运行 在启用容器中的gitlab的ssh的时候,遇到了一 ...

  8. 容器中的容器——利用Dind实现开箱即用的K3s

    我在学习 Rancher 和 Minikube 的时候,发现它们都可以在自己的容器环境中提供一个 K3s 或 K8s 集群.尤其是 Minikube ,用户可以在它的容器环境中执行 docker ps ...

  9. 在Linux和Windows的Docker容器中运行ASP.NET Core

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott H ...

  10. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

随机推荐

  1. mongo docker compose

    49dSsULIAv6NiP8hdqqbapRTHVx9BRYU4VVakN9A4FJWV0KufqEm/UoTUvn9Z4eg FRP7iHXF6Qiou5MK2Ak76zRBU7MOIVCl0DI ...

  2. OkHttp实现延时重试

    本文主要应用了OkHttp的Interceptor来实现自定义重试次数 虽然OkHttp自带retryOnConnectionFailure(true)方法可以实现重试,但是不支持自定义重试次数,所以 ...

  3. Linux sudo 提权之软链接攻击

    软链接提权的原理 低权限用户能够以 root 用户的权限执行某个脚本,该脚本中又使用到了诸如 chown 等命令修改文件的权限,且该文件又能够被低权限的用户所修改.因此低权限的用户可以删除该文件,然后 ...

  4. Qt开发经验小技巧166-170

    有时候需要暂时停止某个控件发射信号(比如下拉框combobox添加数据的时候会触发当前元素改变信号),有多种处理,推荐用 blockSignals 方法. //方法1:先 disconnect 掉信号 ...

  5. CSP-J2/S2 2024 游记

    前情提要:CSP-J/S 2023 写这篇文章的时候,心情比较复杂. 哎,结局还算圆满. 初赛 之前那个写的不好再写一遍() 两个都在 WFLS,也就是本校考 qaq. J 在大礼堂考,没啥好说的,太 ...

  6. IM跨平台技术学习(十一):环信基于Electron打包Web IM桌面端的技术实践

    本文由环信技术黄飞鹏分享,原题"实战|如何利用 Electron 快速开发一个桌面端应用",本文进行了排版和内容优化等. 1.引言 早就听说利用Electron可以非常便捷的将网页 ...

  7. 记一次 .NET某电商医药网站 CPU爆高分析

    一:背景 1. 讲故事 准备明年把.NET高级调试的训练营的课程进行重构,采用案例引导式,而CPU爆高类有不少是程序员在写代码的时候不注意时间复杂度,在数据量稍微大一点的情况直接幻化成了死循环,时间复 ...

  8. .Net程序员机会来了,微软官方新推出一个面向Windows开发者本地运行AI模型的开源工具

    想要开发AI产品的.Net程序员机会来了,这个项目应该好好研究. 虽然说大模型基本都有提供网络API,但肯定没有直接使用本地模型速度快. 最近微软官方新推出AI Dev Gallery开源项目,可以帮 ...

  9. [LC646]最长数对链

    题目概述 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种形 ...

  10. 开源的分布式事务解决方案-Seata

    Seata 是什么? (1)Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务. (2)在 Seata 开源之前,Seata 对应的内部版本在阿里经济 ...