1. Docker 是什么?
Docker 是一个 容器化平台,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,并在任何支持 Docker 的环境中运行。
类比:Docker 就像“软件集装箱”,让应用可以在不同环境中无缝运行,而不用担心环境差异导致的问题。
核心概念:
镜像(Image):只读模板,包含运行应用所需的代码、库、环境等(类似于“安装包”)。
容器(Container):镜像的运行实例(类似于“进程”),独立且隔离。
Dockerfile:定义如何构建镜像的脚本文件。
2. 为什么使用 Docker?它能解决什么问题?
可以让应用程序快速部署,安全运行,并且使其更容易跨环境迁移和管理
(1)解决“在我机器上能跑,线上却报错”的问题
传统方式:开发、测试、生产环境不一致,导致应用在不同环境表现不同。
Docker 方案:通过容器封装应用和依赖,确保 “一次构建,到处运行”。
(2)快速部署与扩展
传统方式:部署新服务器需要手动安装环境(如 Java、MySQL、Nginx),耗时且易出错。
Docker 方案:直接运行容器,秒级启动,支持自动化扩缩容(如 Kubernetes)。
(3)资源利用率高,轻量级
虚拟机(VM):每个 VM 需要独立操作系统,占用大量 CPU、内存。
Docker 容器:共享主机 OS,更轻量,启动更快,资源占用更少。
Docker 容器传统虚拟机启动时间秒级分钟级性能接近原生有损耗硬盘占用MB 级GB 级隔离性进程级隔离完整 OS 隔离
当然和传统虚拟机的区别还是很大的,
虚拟机包含操作系统的完整副本,包括内核及所有驱动和应用,因此占用更多的磁盘空间和内存。而docker在操作系统层面进行虚拟化,共享宿主机的操作系统内核。
虚拟机需要独立的维护和管理,包括操作系统和应用的更新。容器可以通过容器编排工具(如 Kubernetes)进行集中管理,易于自动化和扩展。容器的无状态性使得更新和维护更简单,可以快速部署和回滚应用
(4)微服务架构的最佳搭档
微服务需要多个独立服务协同工作,Docker 让每个服务可以独立打包、部署、伸缩。
例如:电商系统拆分为 用户服务、订单服务、支付服务,每个服务运行在单独容器中。
(5)持续集成/持续交付(CI/CD)
开发 → 构建镜像 → 测试 → 生产,全流程自动化。
例如:GitHub + Docker + Jenkins 实现自动化部署。
3. Docker 的典型应用场景
(1)本地开发环境标准化
新成员加入团队时,无需手动配环境,直接运行 docker-compose up 即可启动全套服务(如 MySQL + Redis + Nginx)。
(2)快速搭建测试环境
测试人员可以一键启动隔离的测试环境,避免污染本地数据。
(3)云原生与微服务
Docker是一个容器编排工具,可以帮助我们管理应用程序。但是,如果想要管理大量的容器,就需要更为强大的编排工具,而 Kubernetes(K8s)就是这样一个工具。
Kubernetes(K8s)管理成千上万个 Docker 容器,实现自动化运维。
(4)边缘计算与 IoT
在资源受限的设备(如树莓派)上运行容器化应用。
关于dockerfile 文件 和 docker compose的理解
Dockerfile 是一个文本文件,用于自动化地构建 Docker 镜像。Dockerfile 定义了从基础镜像开始,按步骤配置环境和部署应用所需要的所有命令。
比如:以下是一个常用dockerfile文件的相关设置
# 设置Java 17 官方镜像作为基础镜像
FROM openjdk:17-jdk
# 设置维护者信息
LABEL maintainer="zsy"
# 设置环境变量,可以设置默认的环境变量用于应用配置
ENV SPRING_PROFILES_ACTIVE=dev \
# 可选 JAVA_OPTS="-Xmx512m -Xms256m"
# 设置容器内的工作目录
WORKDIR /work-App
# 将 jar 包复制到工作目录
COPY target/boot.jar work-App.jar
# 设置对外暴露的端口号
EXPOSE 8080
# 容器健康检查设置,用于定期检查应用是否崩掉
HEALTHCHECK --interval=1m --timeout=10s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
docker Compose又是什么呢?像我们项目中使用的redis,MQ,mysql等中间件,不能写在dockerfile里面吧。都有各自独立的镜像。Docker Compose就是用来一键启动所有的其他的服务的。
文件名后缀为yml,比如,docker-compose.yml
version: '0.0.1'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./webroot:/usr/share/nginx/html
depends_on:
- app
app:
build:
context: ./app
dockerfile: Dockerfile
environment:
- DEBUG=false
depends_on:
- db
db:
image: postgres:latest
environment:
- POSTGRES_USER=exampleuser
- POSTGRES_PASSWORD=examplepass
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
使用docker-compose up一键启动和停止
4. Docker 核心命令速查
docker run:启动一个新的容器
docker ps:列出正在运行的容器
docker ps -a:列出所有容器
docker stop: 停止正在运行的容器
docker start: 启动已停止的容器
docker rm:删除容器
docker images: 列出本地镜像
docker pull:从镜像仓库拉取或更新指定的镜像
docker build: 使用 Dockerfile 构建镜像
docker logs :查看日志
docker logs -f
docker logs --tail 50
docker logs --since 30m
5. Docker 的局限性
不适合 GUI 应用:主要针对服务端应用。
安全性低于虚拟机:容器共享主机内核,隔离性较弱(但可通过安全配置优化)。
镜像可能较大:需优化分层构建(如使用 Alpine Linux 基础镜像)。
6. 总结:Docker 的优势
✅ 环境一致性:开发、测试、生产环境一致。
✅ 快速部署:秒级启动,简化 DevOps 流程。
✅ 资源高效:比虚拟机更轻量,节省服务器成本。
✅ 生态强大:支持 Kubernetes、云服务(AWS/Azure)、CI/CD 工具链。
Docker 已成为现代软件开发的标配工具,掌握它能极大提升开发效率和系统可靠性! 🚀