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 关系:

工具

核心定位

核心作用

Docker Engine

Docker 的「核心后台守护进程」

真正负责「容器 / 镜像的底层管理」:创建、运行、停止容器,拉取 / 构建镜像,管理网络 / 数据卷等所有底层操作

Docker CLI

Docker 的「命令行交互工具」

用户通过敲 docker 命令(如 docker run docker pull),把指令发给 Docker Engine,让 Engine 去执行

Docker Compose

Docker 的「多容器编排工具」

用 YAML 文件配置「多个容器的协同工作」,一键启动 / 停止所有容器,自动处理依赖关系、网络连接

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=2G
docker 命令详解

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      镜像名:版本
.               用当前目录的 Dockerfile

5、镜像仓库

5.1、使用阿里云镜像仓库

1、进入阿里云控制台,创建镜像仓库
2、镜像操作

参考文档:容器镜像服务

2.1、登录阿里云镜像

docker login --username=江涛的cloud crpi-sbxf6opn90884xtq.cn-beijing.personal.cr.aliyuncs.com

2.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.0

2.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.0

2.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: bridge

2、根据 DockerImageRegistyCompose.yaml 配置文件创建容器

docker compose -f D:\work\env\docker\DockerImageRegistry\DockerImageRegistyCompose.yaml up -d

3、查看私有仓库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