Docker新手必看!从零起步,轻松搞定Java与Node项目部署实战

AI 概述
Docker在后端和运维领域应用广泛,它解决了环境不一致问题,可快速部署且节省资源。其核心概念包括镜像、容器、Dockerfile和仓库。以Ubuntu为例安装Docker后,可执行查看版本、运行容器等基础命令。Docker可部署Java、Node.js项目,还能用Docker Compose同时部署Java、Node和MySQL。此外,文章还介绍了进入运行中的容器、查看容器资源使用等实用命令。Docker让应用部署变得简单高效,新手通过实践可更好掌握。
目录
文章目录隐藏
  1. 一、Docker 是什么?
  2. 二、Docker 有什么用?
  3. 三、Docker 的四个核心概念
  4. 四、安装 Docker(以 Ubuntu 为例)
  5. 五、常用的 Docker 命令
  6. 六、部署 Java 项目(Spring Boot 示例)
  7. 七、部署 Node.js 项目(Express 示例)
  8. 八、同时部署 Java + Node + MySQL
  9. 九、实用的几个常用命令
  10. 结语

Docker 新手必看!从零起步,轻松搞定 Java 与 Node 项目部署实战

在后端和运维领域,Docker 几乎已经成了绕不开的技术。面试在问,同事在用,越来越多的开源项目也默认提供了 Docker 一键部署方案。那 Docker 到底解决了什么问题?

为什么现在的部署项目,大家都会优先选择它?

本文,我将从一个新手的视角,把 Docker 一一给大家讲清楚。

一、Docker 是什么?

简单比喻

假设你要搬家:

  • 传统方式:家具要拆、线路要拔、到新家后再一件件装回去,装的时候还可能发现:少了某个零件、接口不对、怎么都摆不回原样。
  • Docker 方式:直接把整个房间拍个快照,家具、布置、电器、位置全都封装好。到新家一键还原,跟原来一模一样。

Docker 做的,就是这件事。它把一个应用运行所需要的所有东西,代码、运行环境、依赖、配置,一次性打包成一个标准化的箱子。

Docker 是什么?

不管你把这个箱子搬到哪里,只要能打开,它的表现永远一致。

专业解释

Docker 是一个容器化平台,让开发者可以:

  • 把应用程序及其所有依赖项(库、环境变量、配置文件)打包在一起;
  • 在任何支持 Docker 的机器上运行,保证环境一致;
  • 从而实现一次构建,到处运行。

二、Docker 有什么用?

1. 开发人员的痛点

开发者小明说:“在我电脑上运行好好的!”

运维人员回复:“在服务器上就是跑不起来!”

原因排查:

  • – 操作系统不同(Windows vs Linux)
  • – Node.js 版本不同(12.x vs 14.x)
  • – 依赖库版本冲突 – 环境变量配置不同
  • – 文件路径不一致

最后你会发现,问题不是代码,而是环境。Docker 出现的意义,就是把环境这件事彻底消灭。

2. 快速部署

  • 传统部署:装系统、装运行环境、配环境变量再到装依赖等等,顺利的话,也要一两个小时。
  • Docker 部署:下载镜像、运行容器,几分钟就能完成。

3. 资源节省

很多人会拿 Docker 和虚拟机做对比。

虚拟机的方式:每个应用自带一整套操作系统,占用动不动就是几个 GB

Docker 的方式:容器之间共享宿主机系统,只保留应用真正需要的东西,通常是 MB 级别。

你可以理解为:

  • 虚拟机:每个项目都自己买一套房;
  • Docker:很多项目住在同一栋楼里,各自一间房。

三、Docker 的四个核心概念

Docker 的核心概念其实非常少。如果只用一句话来概括:Docker 用镜像准备环境,用容器运行程序

Docker 的核心概念

1、镜像(Image)

镜像就是运行环境的模板。它里面已经准备好了系统、运行时以及应用需要的依赖,但镜像本身是不能直接运行的,更像一个安装包。比如 node:18、openjdk:17、mysql:8,都是现成可以用的镜像。

2、容器(Container)

容器是镜像运行之后的样子。镜像是静态的,容器是正在运行的。你平时对应用做的启动、停止、删除、查看日志,操作的其实都是容器。一个镜像可以同时启动多个容器,这也是 Docker 能跑多个实例的原因。

3、Dockerfile

Dockerfile 用来告诉 Docker,这个镜像该怎么做。它是一个普通文本文件,里面写清楚:用什么基础镜像、代码放在哪里、要不要安装依赖,以及程序最终如何启动。想定制自己的镜像,就必须有 Dockerfile。

4、仓库(Docker Hub)

Docker Hub 是镜像的来源。它就像一个应用商店,存放着大量官方和社区维护的镜像。

Dockerfile 里写的 FROM node:18,意思就是:从 Docker Hub 拉取一个 Node 18 的镜像作为基础环境。

把这几个概念串起来就是一句话:Dockerfile 用来构建镜像,镜像用来创建容器,而镜像通常来自 Docker Hub

四、安装 Docker(以 Ubuntu 为例)

下面以 Ubuntu 20.04 / 22.04 为例,介绍最常见、也是最稳妥的安装方式。

步骤 1:更新系统并安装基础依赖

sudo apt update 
sudo apt install -y ca-certificates curl gnupg lsb-release

这些工具主要用来安全地添加 Docker 官方仓库。

步骤 2:添加 Docker 官方 GPG Key

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

步骤 3:添加 Docker 官方软件源

echo \
   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
   https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) stable" | \
   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

步骤 4:安装 Docker 引擎

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

步骤 5:验证是否安装成功

docker --version
sudo docker run hello-world

如果看到:

Hello from Docker!

说明 Docker 已经在你的 Ubuntu 服务器上成功运行。

(可选)步骤 6:非 root 用户运行 Docker

默认情况下,Docker 需要 sudo 权限。如果你不想每次都加 sudo,可以执行:

sudo usermod -aG docker $USER

然后 退出当前终端重新登录,再测试:

docker ps

能正常执行,说明配置成功。

五、常用的 Docker 命令

基础命令

# 查看版本 
docker --version
 
# 查看所有命令 
docker --help
 
# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的) 
docker ps -a

# 查看本地镜像 
docker images
 
# 下载镜像(从 Docker Hub) 
docker pull 镜像名:标签 
# 示例:docker pull node:14

# 运行容器 
docker run [选项] 镜像名 
# 示例:docker run -it ubuntu bash
 
# 停止容器 
docker stop 容器 ID 或名字
 
# 删除容器 
docker rm 容器 ID 或名字

# 删除镜像 
docker rmi 镜像 ID 或名字

常用选项

# -d:后台运行(守护进程模式) 
docker run -d nginx 

# -p:端口映射(主机端口:容器端口) 
docker run -p 8080:80 nginx 

# -v:挂载卷(主机目录:容器目录) 
docker run -v /home/data:/app/data nginx 

# --name:给容器起名字 
docker run --name my_nginx nginx 

# -it:交互模式运行 
docker run -it ubuntu bash

六、部署 Java 项目(Spring Boot 示例)

项目结构(Windows 本地)

my-java-app/
 ├── src/          # 源代码
 ├── pom.xml       # Maven 配置文件
 └── Dockerfile    # Docker 构建文件

步骤 1:编写 Dockerfile(Windows 本地)

在项目根目录下创建 Dockerfile:

# 使用官方 Java 运行环境作为基础镜像 
FROM openjdk:11-jre-slim 

# 设置容器内工作目录 
WORKDIR /app 

# 复制 Spring Boot 打包后的 jar 文件 
COPY target/myapp.jar app.jar 

# 暴露端口(Spring Boot 默认 8080) 
EXPOSE 8080 

# 启动应用 
ENTRYPOINT ["java", "-jar", "app.jar"]

注意:

Dockerfile 中的路径是 容器内路径,和 Windows / Linux 本机路径无关。

步骤 2:Windows 本地打包项目

在 Windows 本地开发环境 执行:

# 进入项目目录 
cd my-java-app 

# 使用 Maven 打包(生成 target/myapp.jar) 
mvn clean package

执行完成后,确认文件存在:

target/myapp.jar

步骤 3:将项目传到 Linux 服务器

方式一:使用 scp(推荐)

在 Windows 终端(PowerShell / Git Bash)中执行:

scp -r my-java-app user@服务器 IP:/home/user/

示例:

scp -r my-java-app root@123.456.78.90:/root/

步骤 4:Linux 服务器上构建 Docker 镜像

登录 Linux 服务器后执行:

cd my-java-app

构建镜像:

docker build -t my-java-app:1.0 .

查看镜像是否构建成功:

docker images

步骤 5:在 Linux 上运行容器

docker run -d \
   -p 8080:8080 \
   --name java-app \
   my-java-app:1.0

查看容器状态:

docker ps

查看日志:

docker logs java-app

步骤 6:访问应用

http://123.456.78.90:8080

七、部署 Node.js 项目(Express 示例)

项目结构(Windows 本地)

my-node-app/
 ├── src/
 ├── package.json
 ├── server.js
 └── Dockerfile

步骤 1:编写 Dockerfile(Windows 本地)

在项目根目录创建 Dockerfile:

# 使用官方 Node.js 运行环境 
FROM node:18-alpine 

# 设置容器工作目录 
WORKDIR /app 

# 复制依赖配置文件 
COPY package*.json ./ 

# 安装依赖 
RUN npm install --production 

# 复制项目代码 
COPY . . 

# 暴露端口 
EXPOSE 3000 

# 启动应用 
CMD ["node", "server.js"]

步骤 2:将项目上传到 Linux 服务器

方式一:scp 传输(推荐)

在 Windows 终端执行:

scp -r my-node-app user@服务器 IP:/home/user/

例如:

scp -r my-node-app root@123.456.78.90:/root/

步骤 3:Linux 服务器构建镜像

登录 Linux 服务器:

cd my-node-app

构建镜像:

docker build -t my-node-app:1.0 .

查看镜像:

docker images

步骤 4:运行容器

docker run -d \
   -p 3000:3000 \
   --name node-app \
   my-node-app:1.0

查看运行状态:

docker ps

查看日志:

docker logs node-app

步骤 5:访问应用

http://服务器 IP:3000

可选:多阶段构建优化版(推荐生产环境)

# 构建阶段 
FROM node:18-alpine AS builder 
WORKDIR /app 
COPY package*.json ./ 
RUN npm ci --only=production 

# 运行阶段 
FROM node:18-alpine 
WORKDIR /app 
COPY --from=builder /app/node_modules ./node_modules 
COPY . . 
EXPOSE 3000 
CMD ["node", "server.js"]

八、同时部署 Java + Node + MySQL

这里使用的是 Docker Compose,Docker Compose 是用一个配置文件,统一管理多个 Docker 容器的工具。

场景说明

服务器部署结构:

Linux 服务器  
├── MySQL  
├── Spring Boot 后端  
└── Node 前端

步骤 1:服务器准备目录结构

在 Linux 服务器创建:

project/  
├── docker-compose.yml  
├── java-backend/  
└── node-frontend/

把两个项目代码分别上传进去。

步骤 2:创建 docker-compose.yml

version: '3.8' 

services:
   mysql:
     image: mysql:8.0
     container_name: mysql
     environment:
       MYSQL_ROOT_PASSWORD: rootpassword
       MYSQL_DATABASE: mydb
       MYSQL_USER: user
       MYSQL_PASSWORD: password
     ports:
       - "3306:3306"
     volumes:
       - mysql-data:/var/lib/mysql
     networks:
       - app-network
   java-backend:
     build: ./java-backend
     container_name: java-backend
     ports:
       - "8080:8080"
     environment:
       SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb
       SPRING_DATASOURCE_USERNAME: user
       SPRING_DATASOURCE_PASSWORD: password
     depends_on:
       - mysql
     networks:
       - app-network
   node-frontend:
     build: ./node-frontend
     container_name: node-frontend
     ports:
       - "3000:3000"
     environment:
       API_URL: http://java-backend:8080
     depends_on:
       - java-backend
     networks:
       - app-network
 networks:
   app-network:
     driver: bridge
 volumes:
   mysql-data:

步骤 3:启动所有服务(Linux 服务器执行)

docker compose up -d

新版本 Docker 推荐 docker compose,老版本使用 docker-compose。查看运行状态:

docker compose ps

查看日志:

docker compose logs -f

停止服务:

docker compose down

步骤 4:访问系统

node 访问

http://服务器 IP:3000

java 访问

http://服务器 IP:8080

MySQL 连接地址

服务器 IP:3306

九、实用的几个常用命令

1. 进入运行中的容器

# 进入容器内的
bash docker exec -it 容器名 bash 
# 在容器内执行命令 
docker exec 容器名 ls /app

2. 查看容器资源使用

docker stats

3. 清理无用资源

# 删除所有停止的容器 
docker container prune 

# 删除所有未被使用的镜像 
docker image prune 

# 删除所有未被使用的网络 
docker network prune 

# 一键清理所有 
docker system prune -a

4. 查看镜像构建历史

docker history 镜像名

5. 备份和恢复

# 备份镜像到文件 
docker save -o myapp.tar myapp:1.0 

# 从文件恢复镜像 
docker load -i myapp.tar

结语

如果你是第一次接触 Docker,看到这里可能还是有点懵,这很正常。等你哪天真的把一个项目从本地跑到服务器上,用 Docker 一次性拉起来的时候,那种终于搞定了的感觉,会非常明显。

以上关于Docker新手必看!从零起步,轻松搞定Java与Node项目部署实战的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Docker新手必看!从零起步,轻松搞定Java与Node项目部署实战

发表回复