Docker 快速开始
什么是 Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵从 Apache2.0 协议开源。
简单来说,Docker 可以让开发者将应用程序及其依赖环境打包到一个轻量级、可移植的容器中,然后可以在任何流行的 Linux 或 Windows 操作系统上运行。这种容器技术实现了应用与基础设施的分离,使得应用可以在不同的环境中以相同的方式运行。
容器 vs 虚拟机
传统虚拟机技术是模拟一整套操作系统,包含完整的硬件环境,而 Docker 容器则是直接利用宿主机的操作系统,通过命名空间(Namespace)和控制组(Cgroups)实现资源隔离。
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 硬盘占用 | MB 级 | GB 级 |
| 性能 | 接近原生 | 有损耗 |
| 系统支持量 | 单机支持上千容器 | 几十个 |
| 隔离性 | 进程级隔离 | 操作系统级隔离 |
Docker 在企业级开发中的用途
1. 应用部署与交付
企业开发中,经常会遇到「在我本地能跑,到服务器上就不行」的问题。Docker 通过容器化技术,确保应用在任何环境中都能一致运行:
- 开发环境:开发人员使用 Docker 运行项目所需的各种服务(MySQL、Redis、RabbitMQ 等)
- 测试环境:快速搭建与生产环境一致的测试环境
- 生产环境:标准化部署流程,降低运维复杂度
2. 微服务架构
在微服务架构中,每个服务都可以打包成独立的容器:
- 服务之间相互隔离,互不影响
- 每个服务可以独立扩展、独立部署
- 便于服务编排和管理(配合 Kubernetes)
3. 持续集成/持续部署 (CI/CD)
Docker 与 CI/CD 流程天然契合:
- 代码提交后自动构建镜像
- 自动运行测试
- 测试通过后自动部署到生产环境
- 支持快速回滚
4. 开发环境标准化
新员工入职时,只需安装 Docker 并运行 docker-compose up,即可快速搭建完整的开发环境,避免了繁琐的环境配置过程。
使用 Docker 的好处
1. 一致性环境
Docker 确保应用在开发、测试、生产环境中行为一致。容器包含了应用运行所需的一切:代码、运行时、库、配置文件等。
2. 快速交付与部署
- 传统部署:安装依赖 → 配置环境 → 部署应用,可能需要数小时
- Docker 部署:拉取镜像 → 运行容器,几分钟即可完成
3. 资源利用率高
容器共享宿主机内核,无需模拟整个操作系统,相比虚拟机大大节省了资源:
- 更低的内存占用
- 更快的启动速度
- 单机可以运行更多服务实例
4. 易于迁移和扩展
- Docker 容器可以在任何支持 Docker 的平台上运行
- 可以轻松地在本地、云服务器、混合云之间迁移
- 配合 Kubernetes 等编排工具,可以轻松实现弹性伸缩
5. 版本控制和回滚
Docker 镜像支持版本管理:
- 可以对镜像打标签进行版本控制
- 快速回滚到之前的版本
- 便于追踪问题
6. 隔离性和安全性
- 每个容器相互隔离,一个容器的问题不会影响其他容器
- 可以限制容器的资源使用(CPU、内存等)
- 提供了额外的安全层
Docker 核心概念
镜像 (Image)
定义:Docker 镜像是一个只读的模板,包含了创建 Docker 容器的指令。
理解方式:可以把镜像想象成一个「模具」或「蓝图」,它定义了容器运行时应该包含什么内容。
特点:
- 分层存储:镜像由多个只读层叠加组成
- 不可变:镜像一旦创建就不会改变
- 可版本管理:通过标签(Tag)区分不同版本
示例:
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 构建镜像
docker build -t my-app:v1.0 .容器 (Container)
定义:容器是镜像的运行实例,是一个独立运行的、轻量级的、可执行的软件包。
理解方式:如果说镜像是「类」,那么容器就是「实例」。容器可以被创建、启动、停止、删除、暂停。
特点:
- 每个容器相互隔离
- 容器在镜像的最上层添加了一个可写层
- 容器之间可以通信
示例:
# 创建并启动容器
docker run -d -p 80:80 nginx:latest
# 查看运行中的容器
docker ps
# 进入容器内部
docker exec -it <容器ID> /bin/bash
# 停止容器
docker stop <容器ID>
# 删除容器
docker rm <容器ID>仓库 (Registry)
定义:仓库是存放镜像的地方,类似于代码仓库的概念。
分类:
- 公共仓库:Docker Hub、阿里云镜像仓库、腾讯云镜像仓库等
- 私有仓库:企业自建的镜像仓库,如 Harbor
示例:
# 登录仓库
docker login
# 推送镜像到仓库
docker push my-registry.com/my-app:v1.0
# 从仓库拉取镜像
docker pull my-registry.com/my-app:v1.0Dockerfile
定义:Dockerfile 是一个文本文件,包含了构建镜像所需的所有指令。
常用指令:
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM node:18 |
| WORKDIR | 设置工作目录 | WORKDIR /app |
| COPY | 复制文件到容器 | COPY . . |
| RUN | 执行命令 | RUN npm install |
| EXPOSE | 声明暴露端口 | EXPOSE 3000 |
| CMD | 容器启动命令 | CMD ["npm", "start"] |
| ENV | 设置环境变量 | ENV NODE_ENV=production |
示例:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]Docker Compose
定义:Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。
使用场景:当一个应用需要多个服务协同工作时(如 Web 服务 + 数据库 + 缓存),使用 Docker Compose 可以一键启动所有服务。
示例 docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
- redis
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
db_data:
CodeVortex