1、什么是Docker
Docker 是一个用于开发、发布和运行应用程序的开放平台。 Docker 可以让你把应用和基础设施分开,所以 你可以快速交付软件。有了 Docker,你可以管理基础设施 就像你管理你的申请时一样。利用Docker的优势 代码的传输、测试和部署方法论,你可以 大幅减少编写代码到生产运行之间的延迟。
2、docker 安装
windows 上直接安装 docker desktop。docker desktop 包括了:docker engine、docker cli、docker compose
docker engine、docker cli、docker compose 关系:
3、docker 应用
用docker创建一个Mysql
# 3. 安全启动 MySQL 容器
docker run -d
--name JTMySQL
-p 13306:3306
-v D:\work\env\docker\MySQL\data:/var/lib/mysql
-v D:\work\env\docker\MySQL\conf:/etc/mysql/conf.d
-v D:\work\env\docker\MySQL\logs:/var/log/mysql
-v D:\work\env\docker\MySQL\backup:/backup
-e MYSQL_ROOT_PASSWORD=LoL@20201112
-e TZ=Asia/Shanghai
--restart=unless-stopped
--memory=4g
--memory-swap=4g
--cpus=2
--cpu-shares=1024
--ulimit nofile=65535:65535
--health-cmd='mysqladmin ping -h 127.0.0.1 -uroot -pLoL@20201112'
--health-interval=10s
--health-timeout=5s
--health-retries=3
--health-start-period=30s
--security-opt=no-new-privileges
--read-only
--tmpfs=/tmp
--tmpfs=/var/run/mysqld
mysql:latest
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--skip-name-resolve
--max-connections=500
--innodb-buffer-pool-size=2Gdocker 命令详解
docker run -d
→ 后台运行容器(不占用命令行窗口)
--name JTMySQL
→ 容器名字叫 JTMySQL,方便管理
-p 13306:3306
→ 端口映射
宿主机 13306 → 容器 3306
外面用 13306 端口连接 MySQL
-v D:\work\env\docker\MySQL\data:/var/lib/mysql
→ 数据目录挂载(最重要)
容器里的数据库数据 → 保存到你 Windows 的 D 盘
删容器不丢数据
-v D:\work\env\docker\MySQL\conf:/etc/mysql/conf.d
→ 配置文件挂载,你在 D 盘改配置,容器里自动生效
-v D:\work\env\docker\MySQL\logs:/var/log/mysql
→ 日志挂载,MySQL 日志保存到 D 盘
-v D:\work\env\docker\MySQL\backup:/backup
→ 备份目录挂载
-e MYSQL_ROOT_PASSWORD=LoL@20201112
→ 设置 root 密码
-e TZ=Asia/Shanghai
→ 时区 = 上海(解决时间差 8 小时问题)
--restart=unless-stopped
→ 开机自启 / 崩溃自动重启
除非你手动停,否则永远自动重启
--memory=4g
--memory-swap=4g
→ 限制内存最大 4G
防止 MySQL 把服务器内存吃光
--cpus=2
--cpu-shares=1024
→ 限制最多用 2 核 CPU
--ulimit nofile=65535:65535
→ 允许最大打开文件数(高并发必须)
--health-cmd='mysqladmin ping -h 127.0.0.1 -uroot -pLoL@20201112'
--health-interval=10s
--health-timeout=5s
--health-retries=3
--health-start-period=30s
→ 每 10 秒检查 MySQL 是否活着
→ 30 秒后开始第一次检查
→ 不健康会标记 unhealthy
--security-opt=no-new-privileges
→ 禁止容器内提权,更安全
--read-only
→ 容器文件系统只读,防止被黑、被篡改
--tmpfs=/tmp
--tmpfs=/var/run/mysqld
→ 临时目录放内存,提速、保护磁盘
mysql:latest
→ 用最新版 MySQL(不推荐,建议写死 8.0.40)
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
→ 字符集 utf8mb4(支持表情符号)
--skip-name-resolve
→ 禁止 DNS 反查,连接速度飞快
--max-connections=500
→ 最大连接数 500
--innodb-buffer-pool-size=2G
→ MySQL 核心缓存 2G(提升查询速度)
4、docker 实战
本机开发项目进行docker部署。
一般来说,开发一个网站包含以下环境:
开发人员电脑 > 开发环境 > 测试环境 > 沙箱环境 > 生产环境
4.1、开发本地生成镜像
本地项目

编写dockerfile文件
# Build stage
# 基于一个基础镜像
FROM maven:3.9.15-amazoncorretto-17-debian AS builder
# 进入容器内 /app 目录(没有就自动创建)
WORKDIR /app
# 把你本地的 pom.xml 复制到容器 /app 下; 把你本地的 src 源码目录复制到容器里
COPY pom.xml .
COPY src ./src
# mvn package:Maven 打包 -B:后台静默执行 -DskipTests:跳过测试(加快打包); 最终在 target/ 目录生成可执行 jar
RUN mvn -B -DskipTests package
# Runtime stage
FROM timbru31/java-node:17-alpine-jre-24
WORKDIR /app
# 从刚才的 builder 阶段 把打包好的 jar 复制过来,重命名为 app.jar
COPY --from=builder /app/target/*.jar app.jar
# 容器暴露端口 9080
EXPOSE 9080
# 容器启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]根据dockerfile文件创建镜像
docker build -t myboot:1.0 .docker build 构建
-t 起名
myboot:1.0 镜像名:版本
. 用当前目录的 Dockerfile5、镜像仓库
5.1、使用阿里云镜像仓库
1、进入阿里云控制台,创建镜像仓库








2、镜像操作
参考文档:容器镜像服务
2.1、登录阿里云镜像
docker login --username=江涛的cloud crpi-sbxf6opn90884xtq.cn-beijing.personal.cr.aliyuncs.com2.2、修改仓库名称

2.3、重命名镜像
docker tag [ImageId] crpi-sbxf6opn90884xtq.cn-beijing.personal.cr.aliyuncs.com/jt-world-docker-registry/myboot:[镜像版本号]
docker tag sha256:9ad26178d766e9a8aa5e8ef8a6e8e72dcef87ce57ac2c9b8904f3c359d36e210 crpi-sbxf6opn90884xtq.cn-beijing.personal.cr.aliyuncs.com/jt-world-docker-registry/myboot:1.02.4、上传镜像
docker push crpi-sbxf6opn90884xtq.cn-beijing.personal.cr.aliyuncs.com/jt-world-docker-registry/myboot:[镜像版本号]
docker push crpi-sbxf6opn90884xtq.cn-beijing.personal.cr.aliyuncs.com/jt-world-docker-registry/myboot:1.02.5、注意
阿里云镜像的仓库名 对应 镜像的Name;版本号 对应 镜像版本号
crpi-sbxf6opn90884xtq.cn-beijing.personal.cr.aliyuncs.com/jt-world-docker-registry/myboot:1.0为什么你上传或者下载的镜像名称这么长:阿里云的规范,那些简洁的镜像名称是上传到Docker Hub公共仓库的
5.2、搭建私人镜像仓库
docker 搭建私人镜像仓库
1、创建 dockercompose 文件
DockerImageRegistyCompose.yaml 配置registry镜像和对应的ui界面
services:
registry:
image: registry:3.1.1
container_name: jt-registry
restart: on-failure:3
networks:
- jt_registry_network
volumes:
- D:\work\env\docker\DockerImageRegistry\registry\lib:/var/lib/registry # 镜像数据、仓库元数据
ports:
- 15000:5000
environment:
- REGISTRY_STORAGE_DELETE_ENABLED=true # 允许删除镜像
registry-ui:
image: joxit/docker-registry-ui:2.6.0-debian
container_name: jt-registry-ui
restart: on-failure:3
networks:
- jt_registry_network
ports:
- 15001:80
environment:
- TZ=Asia/Shanghai
- REGISTRY_URL=http://localhost:15001 # 指向仓库
- NGINX_PROXY_PASS_URL=http://registry:5000
- REGISTRY_TITLE=JT私有镜像仓库
- DELETE_IMAGES=true # 允许界面删除镜像
- SINGLE_REGISTRY=true
depends_on:
- registry
networks:
jt_registry_network:
driver: bridge2、根据 DockerImageRegistyCompose.yaml 配置文件创建容器
docker compose -f D:\work\env\docker\DockerImageRegistry\DockerImageRegistyCompose.yaml up -d3、查看私有仓库UI界面
访问 http://localhost:15001/

4、上传镜像到私有仓库
# 重命名镜像名称,加上镜像的访问位置
docker tag myboot:1.0 localhost:15000/myboot:1.0
# 上传镜像
docker push localhost:15000/myboot:1.0
# 拉取镜像
docker pull localhost:15000/myboot:1.0
评论交流
欢迎留下你的想法