一、实用价值:
简化Linux环境下服务程序的部署流程,通过容器化封装程序运行所需的全部环境(系统依赖、库文件、配置),彻底解决依赖兼容问题,实现一键快速部署。
1. 解决 “环境不一致” 问题(最核心)
把应用 + 所有依赖(如 Java 17、MySQL 驱动、Nginx 配置)打包成镜像,开发 / 测试 / 生产都用同一个镜像运行,环境 100% 一致,彻底杜绝 “环境问题”。
2. 解决 “依赖安装复杂” 问题
镜像中已包含所有依赖,部署时只需一行命令docker run,无需手动装任何软件,零基础也能部署。
3. 解决 “服务隔离” 问题
每个服务运行在独立容器中,依赖完全隔离,互不影响,一台服务器可安全运行多个不同环境的服务。
4. 解决 “扩缩容 / 迁移难” 问题
容器可通过docker-compose或 K8s 一键扩容,迁移时只需在新服务器下载镜像、启动容器,分钟级完成。
5. 解决 “开发 - 部署效率低” 问题
结合 CI/CD 工具(如 Jenkins),代码提交后自动构建镜像、推送、更新容器,实现 “代码修改→自动部署” 的全流程自动化。
6. 降低 Linux 部署门槛
Docker 把 “复杂的 Linux 环境配置” 封装成镜像,只需掌握几个 Docker 核心命令,就能完成服务部署,无需深入学 Linux 底层。
二、简介:
1. 容器(Container)的核心概念
容器是基于操作系统层面的轻量级虚拟化技术,可以把它理解为:一个 “打包好的、可移植的、独立的运行环境”—— 把应用程序 + 它的所有依赖(代码、运行时、库文件、配置)全部打包在一个 “隔离的盒子” 里,这个盒子就是容器。
对比虚拟机(VM),更容易理解容器的本质:
| 特性 | 容器(Docker) | 虚拟机(VMware/Hyper-V) |
|---|---|---|
| 虚拟化层级 | 操作系统层(共享主机内核) | 硬件层(模拟完整硬件) |
| 资源占用 | 极低(MB 级,启动秒级) | 极高(GB 级,启动分钟级) |
| 隔离性 | 进程级隔离(够用) | 完全隔离(资源浪费) |
| 可移植性 | 一次打包,所有 Linux 系统直接运行 | 需适配硬件,移植性差 |
| 镜像体积 | 小巧(如 Java 镜像几百 MB) | 庞大(Windows 镜像几十 GB) |
2. Docker 的核心理念:“一次构建,到处运行”(Build, Ship, Run)
Docker 的设计初衷是解决 “开发环境能跑,生产环境跑不起来”的经典问题,核心理念分三层:
- Build(构建):在开发环境(Windows/macOS/Linux)把应用 + 依赖打包成「镜像(Image)」—— 镜像就是容器的 “模板”,是只读的;
- Ship(分发):把镜像上传到镜像仓库(如 Docker Hub、私有 Harbor),开发 / 测试 / 生产环境都能下载;
- Run(运行):在任意支持 Docker 的系统(主要是 Linux)上,基于镜像创建「容器」并运行 —— 无论开发还是生产,运行环境 100% 一致。
3. Docker 的底层原理
- 命名空间(Namespace):实现容器的 “隔离性”—— 每个容器有自己独立的进程、网络、文件系统、用户空间,互不干扰;
- 控制组(Cgroup):实现容器的 “资源限制”—— 限制容器能使用的 CPU、内存、磁盘 IO,避免单个容器占满主机资源;
- 联合文件系统(UnionFS):实现镜像的 “分层存储”—— 镜像由多个只读层叠加而成,容器运行时在最上层加一个可写层,节省磁盘空间,且镜像更新时只需修改差异层。
三、核心优点
-
环境一致性:开发 / 测试 / 生产环境 1:1,杜绝 “环境问题”;
-
轻量高效:容器启动秒级,资源占用仅为虚拟机的 1/10;
-
可移植性强:一次打包,所有 Linux 系统(甚至 Windows/macOS)直接运行;
-
隔离性好:服务之间依赖隔离,无冲突;
-
生态丰富:Docker Hub 有上百万个现成镜像(MySQL、Redis、Nginx、Java 等),开箱即用;
-
自动化友好:易集成 CI/CD,实现开发 - 部署全自动化。
四、常见问题
1、关于资源调配:
cpu资源分配:
# ==================== 1. CPU核数限制 ==================== # 格式:--cpus="数值" 限制容器最多使用N个CPU核心(支持小数,如0.5=半核) # 场景:PLC数据采集程序(低CPU消耗),限制最多用1核 docker run -d --name plc-collect \ --cpus="1" \ # 核心限制:最多占用1个CPU核心 your-plc-image:latest # 你的工业程序镜像 # ==================== 2. CPU核心绑定 ==================== # 格式:--cpuset-cpus="核编号" 限制容器仅使用指定的CPU核心(编号从0开始) # 场景:工业AI计算程序,绑定到2、3号核心(避免和其他程序抢核心) docker run -d --name ai-calc \ --cpuset-cpus="2,3" \ # 仅使用第2、3个CPU核心(多核服务器专用) your-ai-image:latest # ==================== 3. CPU优先级 ==================== # 格式:--cpu-shares=数值 优先级权重(默认1024,值越大优先级越高,仅资源竞争时生效) # 场景:PLC采集(核心)优先级1024,日志分析(非核心)优先级512 # ① 启动核心容器(PLC采集) docker run -d --name plc-collect \ --cpu-shares=1024 \ # 高优先级:资源竞争时优先分配CPU your-plc-image:latest # ② 启动非核心容器(日志分析) docker run -d --name log-analyze \ --cpu-shares=512 \ # 低优先级:仅核心容器空闲时才分配更多CPU your-log-image:latest # ==================== 4. 运行中调整CPU限制(无需重启容器) ==================== # 格式:docker update --cpus=新值 容器名/ID # 场景:临时给AI计算容器扩容到2核 docker update --cpus="2" ai-calc
--cpus 是给容器设置 CPU 算力的「最高上限」(硬限制,永不超配);--cpu-shares 是资源紧缺时,给容器保障的「算力分配优先级」(软规则,确保核心容器能优先拿到算力,不被抢占),可以配合使用。
内存分配:
# ==================== 1. 内存上限限制 ==================== # 格式:--memory="数值" 限制容器最大可用内存(支持单位:b/k/m/g) # 场景:PLC采集程序限制最多用2G内存,防止内存泄漏导致宿主机崩溃 docker run -d --name plc-collect \ --memory="2g" \ # 核心限制:最多占用2GB内存 your-plc-image:latest # ==================== 2. 内存+交换分区限制 ==================== # 格式:--memory-swap="数值" 内存+交换分区总上限(通常设为内存的1.5倍) # 场景:数据计算容器,内存2G+交换分区1G(总3G) docker run -d --name data-calc \ --memory="2g" \ --memory-swap="3g" \ # 内存用完后可使用1G交换分区(避免直接OOM) your-data-image:latest # ==================== 3. 运行中调整内存限制 ==================== # 格式:docker update --memory=新值 容器名/ID # 场景:临时给PLC采集容器扩容到3G内存 docker update --memory="3g" plc-collect # ==================== 4. OOM保护==================== # 格式:--oom-kill-disable=true 禁止内核因OOM杀死容器(仅内存上限生效时可用) # 场景:核心PLC采集容器,即使内存超量也不终止(优先保证运行) docker run -d --name plc-collect \ --memory="2g" \ # 必须先设内存上限,否则OOM保护不生效 --oom-kill-disable=true \ # 禁用OOM杀手:核心程序不被终止 your-plc-image:latest
查看:
# 查看单个容器的资源配置 docker inspect --format '{{.HostConfig.CpuShares}} {{.HostConfig.Memory}}' plc-collect # 输出示例:1024 2147483648(1024=CPU优先级,2147483648字节=2G内存) # 查看容器实时资源使用情况(类似Linux top) docker stats plc-collect # 输出:CPU使用率、内存使用率、内存占用量等实时数据
2、关于数据持久化:容器默认是 “临时的”,容器删除后数据会丢失,需通过 “数据卷(Volume)” 持久化数据;
先创建卷
# 创建PLC数据库专用卷(Docker自动管理存储路径,无需关心宿主机具体位置)
docker volume create plc-mysql-data
挂载卷
# 启动MySQL容器,挂载卷到数据目录,保障数据持久化 docker run -d --name plc-mysql \ --restart=always \ # 意外崩溃自动重启(工业必配) -p 3306:3306 \ # 映射端口,方便宿主机/采集容器访问 -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=plc_data \ # 初始化PLC采集数据库 -v plc-mysql-data:/var/lib/mysql \ # 核心:卷挂载到MySQL数据目录 mysql:8.0 # 工业场景选8.0 LTS版
3、两个服务互通:可以采用虚拟docker网络(与网络配置有关):
# 1. 仅用虚拟网络启动数据库容器(无端口映射,容器内互通) docker run -d --name plc-mysql \ --network=plc-network \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0 # 2. 采集容器接入同一网络,能访问数据库(容器内互通) docker exec -it plc-collect ping plc-mysql # 通 docker exec -it plc-collect mysql -h plc-mysql -u root -p123456 # 能连接 # 3. 宿主机无法访问数据库(无端口映射) mysql -h localhost -P 3306 -u root -p123456 # 连接失败 # 4. 给数据库容器加端口映射(重启容器,或运行中映射不推荐) docker run -d --name plc-mysql \ --network=plc-network \ -p 3306:3306 \ # 宿主机3306端口映射到容器3306 -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0 # 5. 宿主机/外部能访问了 # 宿主机访问 mysql -h localhost -P 3306 -u root -p123456 # 成功 # 笔记本(IP:192.168.1.200)访问宿主机(IP:192.168.1.100) mysql -h 192.168.1.100 -P 3306 -u root -p123456 # 成功(需宿主机防火墙放行3306)
4、镜像安全风险:第三方镜像可能包含恶意代码,需用官方镜像或私有仓库;
五、Docker 安装全流程:
安装:
# ==================== 步骤1:卸载旧版本 ==================== sudo apt-get remove -y docker docker-engine docker.io containerd runc # ==================== 步骤2:更新系统包索引,安装依赖工具 ==================== sudo apt-get update # 安装HTTPS传输、CA证书、密钥管理等必备工具 sudo apt-get install -y ca-certificates curl gnupg lsb-release # ==================== 步骤3:添加Docker官方GPG密钥 ==================== # 创建密钥存储目录 sudo mkdir -p /etc/apt/trusted.gpg.d # 1下载阿里云Docker GPG密钥(国内可访问) curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg # ==================== 步骤4:添加Docker官方软件源 ==================== # 官方源echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 阿里云源 # echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # ==================== 步骤5:安装Docker Engine(核心组件) ==================== # 更新包索引 sudo apt-get update # 安装最新稳定版Docker(包含docker-ce、containerd、docker-compose) sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # ==================== 步骤6:启动并设置Docker开机自启 ==================== # 启动Docker服务 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker # ==================== 步骤7:验证安装是否成功 ====================
docker info # 能输出Docker系统信息,说明daemon正常
docker ps -a # 能列出空列表(无容器),说明容器管理功能正常
docker version # 能输出Client/Server信息,说明安装完整 # ==================== 步骤8:配置非root用户免sudo使用Docker ==================== # 将当前用户加入docker用户组 sudo usermod -aG docker $USER # 生效配置(需重新登录服务器/终端) newgrp docker # 验证:无需sudo运行docker命令 docker ps
常用命令:
# 1. 查看Docker版本(确认安装成功) docker --version # 输出示例:Docker version 26.0.0, build 2ae903e # 2. 查看Docker服务状态(确认运行中) sudo systemctl status docker # 输出 "active (running)" 表示服务正常 # 3. 查看已安装的Docker组件 dpkg -l | grep docker # 4. 重启Docker服务(配置修改后生效) sudo systemctl restart docker
六、Docker配置文件示例(仅供参考,与具体工程有关):
# 阶段1:构建SpringBoot包(多阶段构建,减小最终镜像体积) FROM maven:3.8.8-openjdk-8 AS builder # 设置工作目录 WORKDIR /app # 复制pom.xml和源码(利用Maven缓存) COPY pom.xml . COPY src ./src # 国内环境:替换Maven镜像源(非官方补充,解决依赖下载慢) RUN sed -i 's/central/mirrors.aliyun.com\/maven/g' /usr/share/maven/ref/settings-docker.xml # 打包(跳过测试,加快构建) RUN mvn clean package -DskipTests # 阶段2:运行镜像(轻量JRE镜像) FROM openjdk:8-jre-slim # 设置工作目录 WORKDIR /app # 从构建阶段复制打好的jar包 COPY --from=builder /app/target/*.jar app.jar # 暴露后台API端口(自定义,比如8080) EXPOSE 8080 # 启动命令(官方推荐exec格式) # 注:数据库地址用容器名"mysql"(docker-compose编排后可直接解析) CMD ["java", "-jar", "app.jar", "--spring.datasource.url=jdbc:mysql://mysql:3306/mine_autops?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai", "--spring.datasource.username=root", "--spring.datasource.password=123456"]
version: '3.8' # 官方推荐稳定版本 services: # 1. MySQL数据库容器 mysql: image: mysql:8.0 # 官方镜像 container_name: mine-autops-mysql # 容器名(后台程序可通过此名称访问) restart: always # 开机自启核心配置 environment: MYSQL_ROOT_PASSWORD: 123456 # 根密码 MYSQL_DATABASE: mine_autops # 初始化数据库 MYSQL_CHARSET: utf8mb4 # 字符集 volumes: - mysql-data:/var/lib/mysql # 数据持久化(避免容器删了数据丢) ports: - "3306:3306" # 宿主机端口映射(可选,方便本地连接) networks: - mine-autops-network # 2. SpringBoot后台容器 backend: build: ./backend # 构建backend目录下的Dockerfile container_name: mine-autops-backend restart: always # 开机自启 depends_on: - mysql # 先启动MySQL再启动后台 ports: - "8080:8080" # 后台API端口映射 networks: - mine-autops-network # 3. Python前端容器 frontend: build: ./frontend # 构建frontend目录下的Dockerfile container_name: mine-autops-frontend restart: always # 开机自启 depends_on: - backend # 先启动后台再启动前端 ports: - "5000:5000" # 前端访问端口映射 networks: - mine-autops-network # 自定义网络(容器间隔离通信) networks: mine-autops-network: driver: bridge # 数据卷(持久化MySQL数据) volumes: mysql-data:
七、Docker 生态:从开发到部署的全链路(配套工具)
| 工具 / 组件 | 作用 | 适用场景 |
|---|---|---|
| Docker Desktop | Windows/macOS 的 Docker 图形化工具 | 开发环境 |
| Docker Compose | 多容器编排(如同时运行 Web+MySQL+Redis) | 开发 / 测试 / 小型生产环境 |
| Docker Hub | 公共镜像仓库 | 测试 / 开源项目 |
| Harbor | 私有镜像仓库(企业级) | 生产环境(避免镜像泄露) |
| Jenkins/GitLab CI | 自动化构建镜像、推送、部署 | 开发 - 部署自动化(CI/CD) |
| Kubernetes (K8s) | 容器编排平台(大规模集群部署) | 生产环境(高可用、扩缩容) |
| Prometheus+Grafana | 监控容器 / 服务器状态 | 运维监控 |
| ELK | 收集容器日志 | 日志分析 / 故障排查 |
八、Docker 生态:从开发到部署的全链路(配套工具)
1、Docker的网络默认是配置可用的,不需特殊配置;
2、开机自启动,需要先保证docker开机运行,然后再让各个容器随着docker运行而启动;
3、有些镜像源地址经常会出问题,需要用时先确认源可用。
浙公网安备 33010602011771号