到时候看看吧
一、 容器怎么加载我的 Jar 代码?(搬运工流程)
你担心的“加载”问题,其实在docker build阶段就解决了。
本地打包:你在本地 IDEA 里
mvn package得到app.jar。写 Dockerfile:里面有一行
COPY target/app.jar /app/my-project.jar。构建镜像:当你执行
docker build时,Docker 会把这个app.jar“缝”进镜像里。镜像 = 压缩包:此时,你的镜像就像一个预装了 Linux 系统、JDK 环境和你 Jar 包的“超级压缩包”。
容器运行:当你
run的时候,Docker 只是把这个压缩包解压运行。Jar 包就在容器内部的硬盘里,它当然能直接加载!
总结:代码不是运行时“塞”进去的,而是提前“打”进去的。
二、 容器互相隔离,怎么互相依赖?(网络桥梁)
你说得对,它们确实是隔离的(就像两间完全隔音的屋子)。但是,Docker 给这些屋子牵了**“内线电话”**。
1. 为什么不相互隔离了?
当你使用Docker Compose启动时,它会默认创建一个虚拟网络。所有在这个yml文件里定义的服务,都会自动加入这个网络。
2. 怎么“打电话”?
在 Java 代码里,以前你连 Redis 可能是写127.0.0.1。但在 Docker 环境里,你直接写“服务名”!
在
yml里你给 Redis 起名叫my-redis。那么在 Java 的配置文件里:
spring.redis.host = my-redis。Docker 的内部 DNS 会自动把
my-redis翻译成那个容器的内部 IP。
这就是“隔离但互通”:它们在系统层面是隔离的(安全、独立),但在网络层面是互联的。
三、 完整的“通关”步骤(实战版)
你想玩 Docker 的流程,最标准的姿势是这样的:
1. 准备阶段(本地)
写代码 $\rightarrow$
mvn package得到app.jar。在项目根目录新建
Dockerfile(把 Jar 包打成镜像的说明书)。在项目根目录新建
docker-compose.yml(指挥官的蓝图)。
2. 上传阶段
把你的整个项目文件夹(包括
jar、Dockerfile、yml)通过 FTP 工具上传到服务器(比如/opt/myapp)。
3. 运行阶段(服务器 CMD)
进入服务器的那个文件夹,执行:
Bash
# 1. 现场造镜像(根据 Dockerfile) docker-compose build # 2. 一键起飞(启动所有服务) docker-compose up -d四、 你的流程校准
买服务器:对,CentOS 是主流。
装 Docker:对。
Compose.yml:对,放在项目目录下。
怎么运行?:不用手动引入 Jar 包,而是通过
docker-compose build。它会根据Dockerfile里的COPY命令,自动把 Jar 包抓进镜像里。最后
up -d:全家桶起飞!
💡 进阶:为什么要这么麻烦?
你可能会问:我直接在服务器java -jar不行吗?
场景模拟:
明天你要给客户部署,客户环境没装 JDK,或者装的是 Java 8,而你用的是 Java 17。
没 Docker:你在客户服务器上折腾半天装 JDK、配环境变量,满头大汗。
有 Docker:你直接把镜像推送到私有仓库,在客户机器上敲一行
docker-compose up。5秒钟,项目上线,你直接下班去喝咖啡。
镜像 (Image):对!它就是“只读的模板”,像安装盘。
仓库 (Registry):对!就像 DockerHub,是下载镜像的地方。
容器 (Container):稍微修正一下。容器不是把环境重新打包,容器是**“镜像运行时的状态”**。你可以理解为:镜像 = 游戏安装包,容器 = 正在运行的游戏实例。
核心误区:你觉得一个容器里要塞进 Redis+MySQL+项目。千万别!
Docker 的哲学是:一个容器只干一件事。
你的项目 1 是一个容器,MySQL 是一个容器,Redis 也是一个容器。它们是独立的“小房间”。
2. 你的疑问:4 个项目要启动 8 次,太繁琐了?
如果你用 docker run 一个个去点,确实要把人累死。为了解决你说的这种“繁琐”,官方给出了终极方案:Docker Compose。
什么是 Docker Compose?
它是 Docker 的“总指挥部”。你不需要敲 8 次 run,你只需要写一个 .yml 格式的蓝图文件,描述清楚:我要几个 MySQL,几个项目,分别占什么端口。