欢迎来到我的博客

docker 镜像源、docker compose、Dockerfile、docker导出MySQL数据库

docker镜像源

https://zhuanlan.zhihu.com/p/24461370776

docker-compose.yml


services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      LANG: C.UTF-8
      MYSQL_ROOT_PASSWORD: xxx
      MYSQL_DATABASE: xxx_sys
    ports:
      - "3306:3306"
    volumes:
      - ./data/mysql:/var/lib/mysql
      - ./config/mysql:/etc/mysql/conf.d
      - ./initdb:/docker-entrypoint-initdb.d
    restart: always
    networks:
      - backend
    command:
      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1

  redis:
    image: redis:latest
    container_name: redis
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    ports:
      - "6379:6379"
    volumes:
      - ./data/redis:/data
    restart: always
    networks:
      - backend
    command: redis-server --appendonly yes

  backend:
    build:
      context: .
      dockerfile: Dockerfile.backend
    container_name: backend
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    ports:
      - "9966:9966"
    volumes:
      - ./backend/logs:/app/logs
    depends_on:
      mysql:
        condition: service_started
      redis:
        condition: service_started
    restart: always
    networks:
      - backend

  nginx:
    image: nginx:latest
    container_name: nginx
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    ports:
      - "80:80"
      - "443:443"
      - "1443:1443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
      - ./nginx/logs:/var/log/nginx
      - ./frontend-dist:/usr/share/nginx/html
    restart: always
    networks:
      - backend

networks:
  backend:
    driver: bridge

Dockerfile

#设置jdk版本
FROM openjdk:8
#设置容器内部工作目录为 /java,后续命令将在该目录下执行操作
WORKDIR /app
#置容器的时区为亚洲/上海,以确保正确的时间设置。
ENV TZ=Asia/Shanghaoi 
ENV LANG=en_US.UTF-8 
ENV LANGUAGE=en_US:en 
ENV LC_ALL=en_US.UTF-8
#将本地的文件添加到容器中的 /java 目录。
COPY backend/admin.jar app.jar
#运行指令
ENTRYPOINT ["java", "-Dfile.encoding=utf-8", "-jar", "app.jar" ]

docker导出表

#!/bin/bash
# 配置参数
CONTAINER_NAME="mysql"  # 容器名称或ID
DB_USER="root"          # 数据库用户名
DB_PASSWORD="xxxx@" # 数据库密码
DB_NAME="db_name"   # 数据库名称
TABLE_NAME="table"   # 要导出的表名
OUTPUT_FILE="./${TABLE_NAME}_$(date +%Y%m%d).sql"  # 导出文件路径

# 执行导出命令
docker exec $CONTAINER_NAME mysqldump -u$DB_USER -p$DB_PASSWORD --databases $DB_NAME --tables $TABLE_NAME > $OUTPUT_FILE

# 检查导出是否成功
if [ $? -eq 0 ]; then
  echo "表 $TABLE_NAME 导出成功,文件保存至:$OUTPUT_FILE"
else
  echo "表 $TABLE_NAME 导出失败"
fi

导出整个数据库

#!/bin/bash
# 导出Docker中MySQL数据库的完整SQL(包含结构和数据)

# 配置参数 - 根据实际情况修改
CONTAINER_NAME="mysql"       # MySQL容器名称或ID
DB_USER="root"               # 数据库用户名
DB_PASSWORD="xxxx@"      # 数据库密码
DB_NAME="db_name"        # 要导出的数据库名称
OUTPUT_DIR="./backups"       # 导出文件保存目录
DATE_SUFFIX=$(date +%Y%m%d_%H%M%S)  # 日期后缀,用于文件名
OUTPUT_FILE="${OUTPUT_DIR}/${DB_NAME}_full_${DATE_SUFFIX}.sql"  # 完整输出路径

# 创建输出目录(如果不存在)
mkdir -p "${OUTPUT_DIR}"

# 检查容器是否运行
if ! docker inspect "${CONTAINER_NAME}" &> /dev/null; then
    echo "错误:容器 ${CONTAINER_NAME} 不存在或未运行!"
    exit 1
fi

# 执行导出命令
echo "开始导出数据库 ${DB_NAME} ..."
docker exec "${CONTAINER_NAME}" mysqldump -u"${DB_USER}" -p"${DB_PASSWORD}" \
    --databases "${DB_NAME}" \
    --default-character-set=utf8mb4 \
    --routines \
    --events \
    --triggers > "${OUTPUT_FILE}"

# 检查导出结果
if [ $? -eq 0 ] && [ -f "${OUTPUT_FILE}" ] && [ -s "${OUTPUT_FILE}" ]; then
    echo "数据库导出成功!"
    echo "文件保存路径:${OUTPUT_FILE}"
    echo "文件大小:$(du -h "${OUTPUT_FILE}" | awk '{print $1}')"
else
    echo "错误:数据库导出失败!"
    # 清理可能的空文件
    if [ -f "${OUTPUT_FILE}" ]; then
        rm -f "${OUTPUT_FILE}"
    fi
    exit 1
fi

posted @ 2025-07-22 09:25  fchhk  阅读(16)  评论(0)    收藏  举报