【黑马JavaWeb+AI知识梳理】Web部署02 - Docker

Docker 知识笔记

Docker 概述

  • 定义:一款快速构建、运行、管理应用的工具,解决"在我机器上能运行"的问题
  • 核心价值
    • 环境一致性:开发、测试、生产环境一致
    • 快速部署:一键部署应用,无需手动配置环境
    • 资源隔离:容器间相互隔离,互不影响
    • 轻量级:比虚拟机更轻量,启动更快

Docker 核心概念

镜像与容器

概念说明作用
镜像(Image)只读模板,包含应用程序及其依赖构建容器的基础
容器(Container)镜像的运行实例,可理解为一个轻量级虚拟机运行应用程序的环境
💡 关键点:镜像类似于"类",容器是"实例"容器是镜像的运行时表现

镜像仓库

  • Docker Hub:Docker官方公共仓库(hub.docker.com)
  • 私有仓库:企业可搭建私有镜像仓库(如Harbor)
  • 镜像命名格式Repository:TAG(如nginx:alpine

数据卷(Volume)

  • 定义:虚拟目录,用于在宿主机和容器之间映射数据
  • 作用
    • 持久化容器产生的数据(避免容器删除导致数据丢失)
    • 共享数据给多个容器
    • 方便修改容器内文件(无需进入容器)
💡 数据卷 vs 本地目录挂载数据卷:由Docker管理,路径在/var/lib/docker/volumes/,适合生产环境本地目录:直接挂载宿主机路径,适合开发调试

Docker 常用命令

镜像操作

命令说明示例
docker pull从镜像仓库拉取镜像docker pull nginx:alpine
docker images列出本地镜像docker images
docker build通过Dockerfile构建镜像docker build -t myapp:1.0 .
docker rmi删除本地镜像docker rmi nginx:alpine

容器操作

命令说明示例
docker run创建并启动容器docker run -d -p 8080:80 nginx
docker ps列出运行中的容器docker ps
docker stop停止容器docker stop nginx-container
docker start启动已停止的容器docker start nginx-container
docker rm删除容器docker rm nginx-container
docker exec进入运行中的容器docker exec -it nginx-container bash

数据卷操作

命令说明示例
docker volume ls列出所有数据卷docker volume ls
docker volume create创建数据卷docker volume create mysql-data
docker volume inspect查看数据卷详情docker volume inspect mysql-data
docker volume rm删除数据卷docker volume rm mysql-data

Docker 网络

默认网络模式

网络模式说明适用场景
bridgeDocker默认网络,容器间通过IP通信单个容器部署
host使用宿主机网络,容器与宿主机共享网络高性能网络应用
none容器没有网络安全性要求高的场景

自定义网络

  • 创建网络docker network create my-network
  • 容器连接网络docker network connect my-network container-name
  • 优势:容器可以通过容器名互相访问(如mysqlapp
💡 关键点:自定义网络是实现多容器应用通信的最佳实践默认bridge网络中,容器只能通过IP通信,不推荐使用

Docker 项目部署

前端部署(Nginx)

部署步骤
  1. 上传前端资源
    • 将打包后的前端静态资源放入/root/tlias-nginx/html
    • 将Nginx配置文件放入/root/tlias-nginx/conf

启动Nginx容器

docker run -d \ --name tlias-nginx \ -p 80:80 \ -v /root/tlias-nginx/html:/usr/share/nginx/html \ -v /root/tlias-nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ nginx:alpine 

创建数据卷/本地目录

mkdir -p /root/tlias-nginx/html mkdir -p /root/tlias-nginx/conf 
Nginx 配置示例(nginx.conf
server { listen 80; server_name localhost; client_max_body_size 10m; location / { root html; index index.html index.htm; try_files $uri $uri/ /index.html; } location ^~ /api/ { rewrite ^/api/(.*) $1 break; proxy_pass http://backend:8080; } } 

后端部署(Java应用)

部署步骤
  1. 准备Java应用
    • 修改配置文件(数据库地址、日志路径等)
    • 打包为JAR文件(如tlias-web-management.jar

启动容器

docker run -d \ --name tlias-backend \ --network my-network \ -p 8080:8080 \ -v /root/tlias-backend/logs:/app/logs \ tlias-backend:1.0 

构建镜像

docker build -t tlias-backend:1.0 .

编写Dockerfile

# 基础镜像 FROM openjdk:17 # 设置环境变量 ENV APP_HOME=/app # 创建应用目录 RUN mkdir -p $APP_HOME # 复制JAR文件 COPY tlias-web-management.jar $APP_HOME/app.jar # 设置工作目录 WORKDIR $APP_HOME # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"] 

数据库部署(MySQL)

部署步骤

启动MySQL容器

docker run -d \ --name mysql \ --network my-network \ -p 3307:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123\ -v mysql-data:/var/lib/mysql \ mysql:8 

创建数据卷

docker volume create mysql-data 
💡 关键点:通过--network my-network将MySQL容器加入自定义网络通过-v mysql-data:/var/lib/mysql持久化数据库数据通过--name mysql使其他容器能通过mysql域名访问

Docker Compose

什么是 Docker Compose?

  • 定义:使用一个YAML文件(docker-compose.yml)定义和运行多容器应用
  • 优势
    • 简化多容器应用的部署和管理
    • 一个命令启动/停止整个应用
    • 便于版本控制和团队协作

Docker Compose 文件结构

version:'3.8'# Compose文件版本services:# 定义服务backend:build: ./backend # 构建上下文ports:-"8080:8080"networks:- my-network volumes:- ./backend/logs:/app/logs frontend:image: nginx:alpine ports:-"80:80"networks:- my-network volumes:- ./frontend/html:/usr/share/nginx/html - ./frontend/conf/nginx.conf:/etc/nginx/nginx.conf mysql:image: mysql:8ports:-"3307:3306"environment:- TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=123 volumes:- mysql-data:/var/lib/mysql networks:- my-network volumes:# 定义数据卷mysql-data:networks:# 定义网络my-network:driver: bridge 

Docker Compose 命令

命令说明
docker-compose up -d启动所有服务(后台运行)
docker-compose down停止并删除所有服务
docker-compose build重新构建所有服务
docker-compose logs查看所有服务日志
docker-compose ps查看所有服务状态

补充章节:Docker 面试核心知识点

1. Docker 与虚拟机的区别

特性Docker虚拟机
隔离级别进程级隔离硬件级隔离
资源占用几MB-几十MB几GB
启动速度秒级分钟级
依赖依赖宿主机内核依赖完整操作系统
适用场景应用部署、微服务需要完整操作系统的场景
💡 面试要点:Docker是容器化技术,基于Linux内核的cgroups和namespaces实现,比虚拟机更轻量、启动更快。

2. Docker 镜像的分层结构

  • 分层原理:镜像由多层组成,每层对应Dockerfile中的一条指令
  • 优势
    • 共享层:多个镜像可以共享相同的基础层
    • 快速构建:修改后只需重新构建变化的层
    • 节省空间:只存储变化的部分
💡 示例
FROM centos:7 → 1层
RUN yum install -y java → 2层
COPY app.jar /app → 3层

3. Dockerfile 最佳实践

最佳实践说明示例
最小化镜像使用最小基础镜像FROM alpine(而非FROM ubuntu
多阶段构建分离构建和运行阶段FROM maven AS buildFROM openjdk AS runtime
使用 .dockerignore排除不需要的文件避免将.git、.env等敏感文件打包进镜像
避免安装不必要的包减少镜像大小RUN apt-get install -y --no-install-recommends java
设置工作目录提高可读性WORKDIR /app
使用非root用户提高安全性RUN useradd -m appuserUSER appuser

4. Docker 网络模式对比

网络模式通信方式适用场景安全性
bridgeIP通信单个容器
host共享宿主机网络高性能网络应用
none无网络安全性要求高的应用
自定义网络容器名通信多容器应用
💡 面试要点:在微服务架构中,自定义网络是容器间通信的最佳实践,避免了IP依赖问题。

5. Docker 数据卷的使用场景

场景说明优势
数据库持久化保存数据库数据避免容器删除导致数据丢失
日志持久化保存应用日志方便日志分析和排查问题
配置文件共享共享配置文件避免在容器内修改配置
文件共享共享文件给多个容器例如:前端资源给Nginx容器

6. Docker Compose 与 Kubernetes 对比

特性Docker ComposeKubernetes
复杂度
适用场景开发环境、小型应用生产环境、大型微服务
管理能力单机管理集群管理
自动扩展不支持支持
服务发现基于容器名基于DNS
学习曲线简单复杂
💡 面试要点:Docker Compose适合开发和测试环境,Kubernetes适合生产环境的集群管理。

7. Docker 安全最佳实践

  1. 避免使用root用户:在Dockerfile中使用非root用户运行应用
  2. 最小化镜像:只包含必要的组件
  3. 定期更新基础镜像:修复安全漏洞
  4. 限制容器权限:使用--cap-drop--read-only等参数
  5. 使用安全扫描工具:如Trivy、Clair扫描镜像漏洞
  6. 限制网络访问:通过防火墙和网络策略限制容器间通信
💡 面试高频问题:为什么Docker容器不建议使用root用户运行?Docker镜像分层结构对安全有什么影响?如何防止Docker容器被攻击?为什么说Docker是安全的?(需结合具体场景回答)

Read more

【GitHub项目推荐--Shannon:AI驱动的自动化渗透测试平台】⭐⭐

简介 Shannon 是由Keygraph开发的一款革命性的AI渗透测试工具,它通过结合白盒源代码分析和动态漏洞利用,为Web应用程序和API提供完全自动化的安全测试。在当今快速迭代的开发环境中,传统的一年一次或季度性的渗透测试已经无法跟上代码发布的速度,这导致了巨大的安全缺口。Shannon的出现正是为了解决这一矛盾——它能够在每次构建或发布时自动运行,像一名永不疲倦的安全专家一样持续守护你的应用程序安全。 技术定位:Shannon不仅仅是一个漏洞扫描器,而是一个真正的AI渗透测试工程师。它采用多智能体架构,能够分析应用程序源代码,识别潜在的攻击向量,然后通过浏览器自动化和命令行工具执行真实的漏洞利用。与传统的黑盒扫描器不同,Shannon能够理解代码上下文,这使得它的攻击更加精准,误报率极低。项目采用“无漏洞利用,不报告”的原则,确保最终报告中的每一个发现都有可复现的漏洞证明。 核心价值:Shannon的核心价值在于其完全自动化和白盒感知的能力。它能够处理复杂的身份验证流程,包括2FA/TOTP登录(甚至SSO),自动进行浏览器导航、漏洞利用和报告生成,无需人工干预。对于开发

【Unity-AI开发篇】| Unity-MCP最新指南:让AI接管游戏开发

【Unity-AI开发篇】| Unity-MCP最新指南:让AI接管游戏开发

* 前言 * 【Unity-AI开发篇】| Unity-MCP最新指南:让AI接管游戏开发 * 一、🧐 MCP是什么? * 1.1 MCP介绍 * 1.2 为什么要配置MCP? * 1.3 效果展示 * 1.4 使用说明及下载 * 二、🚀MCP安装步骤 * 2.1 前提条件 * 2.2 安装 Unity-MCP包(桥接组件) * 2.2 MCP配置 * 三、🎈Trae配置 * 3.1 添加MCP配置 * 3.2 创建一个智能体并添加Unity-MCP * 3.3 使用AI开发功能 * 总结 前言 * 在人工智能飞速发展的今天,大语言模型早已不仅限于聊天和文本生成。 * 它们开始能够使用工具,与环境进行交互,从而执行复杂任务。 * 对于广大游戏开发者而言,

AI辅助编程入门:大模型写代码靠谱吗

AI辅助编程入门:大模型写代码靠谱吗

AI辅助编程入门:大模型写代码靠谱吗 📝 本章学习目标:通过本章学习,你将全面掌握"AI辅助编程入门:大模型写代码靠谱吗"这一核心主题,建立系统性认知。 一、引言:为什么这个话题如此重要 在人工智能快速发展的今天,AI辅助编程入门:大模型写代码靠谱吗已经成为每个AI从业者和爱好者必须了解的核心知识。无论你是技术背景还是非技术背景,理解这一概念都将帮助你更好地把握AI时代的机遇。 1.1 背景与意义 💡 核心认知:大模型技术正在深刻改变我们的工作和生活方式。作为这一变革的见证者和参与者,我们需要系统性地理解其背后的原理和应用。 从2022年ChatGPT的横空出世,到如今百花齐放的大模型生态,短短几年间,AI技术已经渗透到各行各业。根据最新统计,全球大模型市场规模已突破千亿美元,年增长率超过50%。这一数字背后,是无数企业和个人正在经历的数字化转型。 1.2 本章结构概览 为了帮助读者系统性地掌握本章内容,我将从以下几个维度展开: 📊 理论基础 → 核心概念 → 技术原理 → 实践应用 → 案例分析 → 总结展望 二、核心概念解析 2.1

告别手动改配置!CC-Switch:你的AI编码助手“万能遥控器”

告别手动改配置!CC-Switch:你的AI编码助手“万能遥控器”

作为一名天天和代码打交道的开发者,你一定没少用 Claude Code、Codex 或 Gemini CLI 这些 AI 编码助手。它们确实能让你效率飞起,但有一个问题,简直让人抓狂——配置管理。 想象一下这个场景:你在 A 项目用 Anthropic 官方接口,B 项目用代理中转,C 项目想试试某家“神秘”供应商……于是你开始了“手艺人”日常:打开 settings.json,小心翼翼地改 BASE_URL,粘贴新的 API_KEY,生怕一个多余的空格让整个 CLI 崩掉。 烦不烦?太烦了! 今天,我就来给你安利一个能让你彻底告别手动配置的“神器”——CC-Switch。它就像 AI