Skip to content

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)区分不同版本

示例

bash
# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 构建镜像
docker build -t my-app:v1.0 .

容器 (Container)

定义:容器是镜像的运行实例,是一个独立运行的、轻量级的、可执行的软件包。

理解方式:如果说镜像是「类」,那么容器就是「实例」。容器可以被创建、启动、停止、删除、暂停。

特点

  • 每个容器相互隔离
  • 容器在镜像的最上层添加了一个可写层
  • 容器之间可以通信

示例

bash
# 创建并启动容器
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

示例

bash
# 登录仓库
docker login

# 推送镜像到仓库
docker push my-registry.com/my-app:v1.0

# 从仓库拉取镜像
docker pull my-registry.com/my-app:v1.0

Dockerfile

定义: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

示例

dockerfile
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

yaml
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:

Released under the MIT License.