《数据不丢失!本地挂载的 Docker 一键启动PS1脚本》

在日常开发中,我们经常需要本地运行一些中间件或工具,比如绘图工具 Excalidraw、缓存 Redis、关系型数据库 MySQL。使用 Docker 可以避免污染宿主机环境,实现快速启动和迁移。

本文分享三个实用的 PowerShell 一键启动脚本,以及对应的配置文件,让你在 Windows 上也能轻松管理容器化开发环境。


一、Excalidraw ------ 本地化部署的白板神器

Excalidraw 是一款开源的虚拟白板工具,支持手绘风格图形。通过 Docker 运行官方镜像,可以享受私有的绘图服务。

启动脚本 start-excalidraw.ps1
powershell 复制代码
# start-excalidraw.ps1
# Excalidraw Docker 容器启动脚本

$ContainerName = "excalidraw"
$ImageName     = "excalidraw/excalidraw:latest"
$HostPort      = 5000
$ContainerPort = 80
$LocalPath     = "D:\develop\Docker Repository\excalidraw"
$ContainerPath = "/app/data"

# 确保本地挂载目录存在
if (-not (Test-Path $LocalPath)) {
    New-Item -ItemType Directory -Path $LocalPath -Force | Out-Null
    Write-Host "已创建目录: $LocalPath"
}

# 检查是否已在运行
$RunningContainer = docker ps -q -f "name=$ContainerName" 2>$null
if ($RunningContainer) {
    Write-Host "容器 '$ContainerName' 已在运行中。"
    exit 0
}

# 检查是否存在已停止的容器
$ExistingContainer = docker ps -aq -f "name=$ContainerName" -f "status=exited" 2>$null
if ($ExistingContainer) {
    Write-Host "启动已存在的容器 '$ContainerName' ..."
    docker start $ContainerName
} else {
    Write-Host "创建并启动新容器 '$ContainerName' ..."
    docker run -d `
        --name $ContainerName `
        -p "${HostPort}:${ContainerPort}" `
        -v "${LocalPath}:${ContainerPath}" `
        --restart unless-stopped `
        $ImageName
}

if ($LASTEXITCODE -eq 0) {
    Write-Host "Excalidraw 已启动,访问地址: http://localhost:$HostPort"
} else {
    Write-Host "启动失败,请检查 Docker 是否运行。"
}

📌 使用说明

  • 容器内数据会持久化到 D:\develop\Docker Repository\excalidraw
  • 访问 http://localhost:5000 即可使用

二、Redis ------ 高性能键值缓存

配置文件 redis.conf
conf 复制代码
# 基础配置
bind 0.0.0.0
port 6379
requirepass 12345678

# 持久化配置
dir /data
dbfilename dump.rdb
appendonly yes
appenddirname "appendonlydir"

# 日志配置
logfile /var/log/redis/redis-server.log
loglevel notice

# 内存与策略
maxmemory 256mb
maxmemory-policy allkeys-lru
启动脚本 start-redis.ps1
powershell 复制代码
# start-redis.ps1
$container = docker ps -aq -f name=redis-local
if ($container) {
    docker start redis-local
} else {
    docker run -d `
      --name redis-local `
      --restart unless-stopped `
      -p 6379:6379 `
      -v "D:\develop\Docker Repository\redis\conf\redis.conf:/usr/local/etc/redis/redis.conf" `
      -v "D:\develop\Docker Repository\redis\data:/data" `
      -v "D:\develop\Docker Repository\redis\log:/var/log/redis" `
      redis:latest `
      redis-server /usr/local/etc/redis/redis.conf
}

📌 提醒 :记得修改 redis.conf 中的 requirepass 为自己的密码。


三、MySQL ------ 两种部署方案

MySQL 容器需要挂载配置文件、数据目录和日志目录。下面提供两种常用方式。

方案一:使用自定义端口(3307)与环境变量

启动脚本 run-mysql-3307.ps1

powershell 复制代码
# ========== 变量区(按需修改)==========
$MYSQL_PORT       = "3307"                           # 主机映射端口
$MYSQL_VERSION    = "8.4.4"                          # MySQL 版本
$CONTAINER_NAME   = "mysql-local"                    # 容器名称
$ROOT_PASSWORD    = "12345678"                       # root 密码
$DEFAULT_DB       = "myapp"                          # 默认数据库
$BASE_PATH        = "D:\develop\Docker Repository\mysql"  # 挂载根目录

# ========== 一键部署 ==========
docker run -d `
  --name $CONTAINER_NAME `
  --restart unless-stopped `
  -p "${MYSQL_PORT}:3306" `               # 注意:容器内 MySQL 默认端口是 3306
  -e MYSQL_ROOT_PASSWORD=$ROOT_PASSWORD `
  -e MYSQL_DATABASE=$DEFAULT_DB `
  -v "${BASE_PATH}\conf\my.cnf:/etc/mysql/my.cnf" `
  -v "${BASE_PATH}\data:/var/lib/mysql" `
  -v "${BASE_PATH}\log:/var/log/mysql" `
  mysql:${MYSQL_VERSION}

配套 my.cnf(放在 conf 目录下)

ini 复制代码
[mysqld]
port=3306                         # 容器内部端口固定为 3306
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='+08:00'
max_connections=200
innodb_buffer_pool_size=256M

# 日志配置
log-error=/var/log/mysql/error.log
general_log=1
general_log_file=/var/log/mysql/general.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

[client]
default-character-set=utf8mb4

⚠️ 注意-p 参数应写为 "${MYSQL_PORT}:3306",不要把容器内的 3306 映射成 3307。

这里主机端口为 3307,连接时使用 -P 3307


方案二:标准 3306 端口 + 更丰富的配置

启动脚本 run-mysql.ps1

powershell 复制代码
# run-mysql.ps1
$basePath = "D:/develop/Docker Repository/mysql"

# 确保目录存在
@("conf", "data", "logs") | ForEach-Object {
    $dir = Join-Path $basePath $_
    if (!(Test-Path $dir)) {
        New-Item -ItemType Directory -Path $dir -Force | Out-Null
        Write-Host "已创建: $dir"
    }
}

# 运行容器(使用标准 3306 端口)
docker run -d `
  --name mysql `
  --restart unless-stopped `
  -p 3306:3306 `
  -v "$basePath/conf/my.cnf:/etc/mysql/my.cnf" `
  -v "$basePath/data:/var/lib/mysql" `
  -v "$basePath/logs:/var/log/mysql" `
  -e MYSQL_ROOT_PASSWORD=12345678 `
  -e TZ=Asia/Shanghai `
  mysql:8.4.4

更完整的 my.cnf(适合生产级调优)

ini 复制代码
[client]
socket      = /var/run/mysqld/mysqld.sock
default-character-set=utf8mb4

[mysqld]
# 基础设置
user               = mysql
pid-file           = /var/run/mysqld/mysqld.pid
socket             = /var/run/mysqld/mysqld.sock
basedir            = /usr
datadir            = /var/lib/mysql
tmpdir             = /tmp
lc-messages-dir    = /usr/share/MySQL
skip-external-locking

# 字符集(统一 utf8mb4)
character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci
character-set-client-handshake = FALSE
init_connect         = 'SET NAMES utf8mb4'

# 时区
default-time-zone    = '+08:00'

# 日志(适配挂载路径)
log_error          = /var/log/mysql/error.log
slow_query_log     = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time    = 2
general_log        = 0
general_log_file   = /var/log/mysql/mysql-query.log
log-bin            = /var/log/mysql/mysql-bin.log
server-id          = 1

# InnoDB 调优
innodb_buffer_pool_size = 1G
innodb_log_file_size    = 256M
innodb_file_per_table   = 1
innodb_flush_method     = O_DIRECT
innodb_flush_log_at_trx_commit = 2

# 连接设置
max_connections     = 200
wait_timeout        = 28800
interactive_timeout = 28800
max_allowed_packet  = 64M

[mysqldump]
quick
quote-names
max_allowed_packet = 64M
default-character-set = utf8mb4

📌 两种方案的区别

  • 方案一:主机端口 3307,适合本地已有 MySQL 服务(占用 3306)的情况。
  • 方案二:主机端口 3306,配置更完整(binlog、时区、InnoDB 调优等),适合作为主力开发数据库。

总结

通过上述脚本,你可以在 Windows 上快速拉起三个常用的开发工具/中间件,无需手动安装,也不用担心环境冲突。每个脚本都具备「检查容器是否存在 → 启动或创建」的逻辑,支持 --restart unless-stopped 保证开机自启。

使用建议

  1. 将脚本保存为 .ps1 文件,在 PowerShell 中执行。
  2. 首次运行前根据实际情况修改路径、密码和端口。
  3. 若需停止容器,使用 docker stop <容器名>;彻底删除用 docker rm <容器名>

希望这些配置能帮助你更高效地搭建本地开发环境!如有问题,欢迎留言交流。

相关推荐
郝开2 小时前
Docker Compose 本地环境搭建:mysql
mysql·docker·容器
Dillon Dong2 小时前
【系列主题】拯救 OOM 与构建中断:Next.js 在 Docker 中的静态生成(SSG)避坑指南
开发语言·javascript·docker
aramae2 小时前
Linux多线程编程(二):互斥锁、线程安全与死锁剖析
linux·运维·服务器·网络·安全·centos
爱学习的小囧2 小时前
ESXi 存储路径丢失(PDL/APD)完整处置教程:分清类型再操作,一步不踩坑
linux·运维·服务器·网络·esxi·vmware
阿桂有点桂2 小时前
Laravel队列再docker中开启和配置
docker·php·laravel
Lumos_7772 小时前
Linux -- 信号
linux·运维·服务器
leikooo2 小时前
Skills 实战:Unsplash → COS 自动化配图
运维·ai·自动化
Lumos_7772 小时前
Linux -- 管道
linux·运维·服务器
人工智能培训2 小时前
AI模型部署进阶:Docker容器化部署AI项目
人工智能·深度学习·机器学习·docker·容器·transformer·知识图谱