一、实用价值:

简化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 的底层原理

Docker 能实现 “轻量级隔离 + 跨平台运行”,核心依赖 Linux 内核的 3 个特性:
  • 命名空间(Namespace):实现容器的 “隔离性”—— 每个容器有自己独立的进程、网络、文件系统、用户空间,互不干扰;
  • 控制组(Cgroup):实现容器的 “资源限制”—— 限制容器能使用的 CPU、内存、磁盘 IO,避免单个容器占满主机资源;
  • 联合文件系统(UnionFS):实现镜像的 “分层存储”—— 镜像由多个只读层叠加而成,容器运行时在最上层加一个可写层,节省磁盘空间,且镜像更新时只需修改差异层。

三、核心优点

  1. 环境一致性:开发 / 测试 / 生产环境 1:1,杜绝 “环境问题”;

  2. 轻量高效:容器启动秒级,资源占用仅为虚拟机的 1/10;

  3. 可移植性强:一次打包,所有 Linux 系统(甚至 Windows/macOS)直接运行;

  4. 隔离性好:服务之间依赖隔离,无冲突;

  5. 生态丰富:Docker Hub 有上百万个现成镜像(MySQL、Redis、Nginx、Java 等),开箱即用;

  6. 自动化友好:易集成 CI/CD,实现开发 - 部署全自动化。

四、常见问题

1、关于资源调配:

Docker 封装了 Linux Cgroup 资源管理的 API,默认依托 Linux 内核原生的按需抢占式资源调度;可手动配置容器的 CPU / 内存配额与资源优先级,既实现多容器的资源竞争利用,又能强制保障工业核心业务容器的资源占用,避免非核心容器抢占资源导致核心程序异常。
相关代码:

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 21474836481024=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 不是单独使用的,有一套完整的生态工具,覆盖开发→测试→部署→运维全流程,核心工具如下:
 
工具 / 组件作用适用场景
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、有些镜像源地址经常会出问题,需要用时先确认源可用。

 
posted on 2026-01-31 16:44  竹羊  阅读(0)  评论(0)    收藏  举报