欢迎来到我的博客

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

docker镜像源

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

亲测可用

https://docker.1ms.run

config/mysql 非必需

[mysqld]
# 服务器端字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 禁用客户端握手自动检测(强制使用服务器字符集)
character-set-client-handshake=1

[client]
# 客户端默认字符集(影响 mysql 命令行等客户端)
default-character-set=utf8mb4

[mysql]
# MySQL 客户端工具字符集
default-character-set=utf8mb4

# 补充:强制连接字符集(针对所有客户端连接)
[mysqld_safe]
default-character-set=utf8mb4

nginx/nginx.conf

events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;


    map $sent_http_content_type $json_charset {
        ~*application/json ";charset=utf-8";
        default "";
    }

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server_tokens off;
    include /etc/nginx/conf.d/*.conf;
}

nginx/conf.d/app.conf

server {
        listen 9999 default_server ssl;  # 显式指定为 9999 端口的默认服务器(兼容所有 Host)
        listen [::]:9999 default_server;  # 适配 IPv6(可选)
        server_name xxx.xxx.cn localhost;  # 同时匹配域名、公网IP、内网IP、localhost

#	allow 192.168.0.0/16;
#	deny all;

        ssl_certificate        /etc/nginx/ssl/xxxxxx.crt;
        ssl_certificate_key    /etc/nginx/ssl/xxxxx.key;


        # SSL 安全优化(避免弱加密告警)
        ssl_protocols TLSv1.2 TLSv1.3;                  # 禁用不安全的 TLS 版本
        ssl_prefer_server_ciphers on;                   # 优先使用服务器加密套件
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;  # 强加密套件
        ssl_session_timeout 1d;                         # SSL 会话超时
        ssl_session_cache shared:SSL:10m;               # 会话缓存(提升性能)
        ssl_session_tickets off;                        # 禁用会话票据(避免安全风险)

        # HSTS 配置(强制浏览器后续优先用 HTTPS 访问
        add_header Strict-Transport-Security "max-age=2592000; includeSubDomains" always;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        # 关键配置:允许最大请求体大小(根据需求调整,如10MB=10m,20MB=20m)
        client_max_body_size 512m;  
        # 可选:设置请求体缓冲区(优化大文件上传)
        client_body_buffer_size 10m;

        root /usr/share/nginx/html;
        index index.html index.htm;

        # 前端路由适配(单页应用必备)
        location / {
            try_files $uri $uri/ /index.html;
            # add_header Cache-Control "no-cache, no-store, must-revalidate";  # 避免缓存导致的访问异常
        }

        # location / {
        #     root /usr/share/nginx/html;
        #     try_files $uri $uri/ /index.html;
        #     index  index.html index.htm;
        # }

        location /prod-api {
           proxy_pass http://127.0.0.1:8888/prod-api;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header X-Forwarded-Port $server_port;
           proxy_set_header X-Forwarded-Host $host:$server_port;
           proxy_pass_request_headers on;
           proxy_connect_timeout 30s;
       }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

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
	  # --sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

  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
	  - ./backend/uploadPath:/app/uploadPath
    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 eclipse-temurin:8-jre
#设置容器内部工作目录为 /app,后续命令将在该目录下执行操作
WORKDIR /app
#置容器的时区为亚洲/上海,以确保正确的时间设置。
ENV TZ=Asia/Shanghai
ENV LANG=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  阅读(38)  评论(0)    收藏  举报