Docker 快速入门
Docker 通过容器化技术解决"在我机器上能跑"的问题。本文从核心概念到 Dockerfile 编写,覆盖日常开发中最常用的操作。
发布于 2026年4月22日·4374 字·预计阅读 18 分钟
什么是 Docker
Docker 是一个容器化平台,把应用及其依赖打包成一个轻量级、可移植的容器。容器在任何安装了 Docker 的机器上都能以相同方式运行。
核心概念:
| 概念 | 说明 |
|---|---|
| 镜像(Image) | 只读模板,包含运行应用所需的一切(代码、运行时、库、配置) |
| 容器(Container) | 镜像的运行实例,可以启动、停止、删除 |
| Dockerfile | 构建镜像的脚本,定义镜像的每一层 |
| 仓库(Registry) | 存放和分发镜像的服务(Docker Hub 是最大的公共仓库) |
容器 vs 虚拟机:
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB 级 | GB 级 |
| 隔离级别 | 进程级 | 系统级 |
| 性能 | 接近原生 | 有损耗 |
安装
bash
# Ubuntu / Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
# 验证安装
docker --version
docker run hello-world
基本操作
拉取和运行镜像
bash
# 拉取镜像
docker pull nginx
# 运行容器
docker run nginx
# 后台运行,映射端口
docker run -d -p 8080:80 nginx
# 进入容器内部
docker run -it nginx /bin/bash
docker run 常用参数:
| 参数 | 含义 |
|---|---|
-d | 后台运行(detached) |
-p 宿主端口:容器端口 | 端口映射 |
-v 宿主路径:容器路径 | 挂载卷(数据持久化) |
--name mycontainer | 指定容器名称 |
-e KEY=VALUE | 设置环境变量 |
-it | 交互模式(分配终端) |
--rm | 容器停止后自动删除 |
管理容器
bash
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 停止容器
docker stop <container_id>
# 启动已停止的容器
docker start <container_id>
# 删除容器
docker rm <container_id>
# 删除所有已停止的容器
docker container prune
# 查看容器日志
docker logs <container_id>
docker logs -f <container_id> # 实时跟踪
管理镜像
bash
# 查看本地镜像
docker images
# 删除镜像
docker rmi <image_id>
# 删除所有未使用的镜像
docker image prune
# 查看镜像详情(每一层)
docker history <image_id>
Dockerfile
Dockerfile 是构建镜像的配方。以 Node.js 项目为例:
docker
# 1. 基础镜像
FROM node:20-alpine
# 2. 设置工作目录
WORKDIR /app
# 3. 复制依赖文件并安装(利用缓存层)
COPY package.json package-lock.json ./
RUN npm ci
# 4. 复制源代码
COPY . .
# 5. 构建应用
RUN npm run build
# 6. 暴露端口
EXPOSE 3000
# 7. 启动命令
CMD ["npm", "start"]
构建并运行:
bash
# 构建镜像
docker build -t my-app .
# 运行容器
docker run -d -p 3000:3000 --name my-app my-app
多阶段构建(推荐)
减少最终镜像体积:
docker
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产阶段
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["node", "dist/index.js"]
Docker Compose
当应用需要多个容器协同工作(比如 Web + 数据库 + 缓存),用 Docker Compose 管理更方便。
yaml
# docker-compose.yml
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
- redis
db:
image: postgres:16-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
pgdata:
bash
# 启动所有服务
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f app
# 停止并删除
docker compose down
# 停止并删除(包括数据卷)
docker compose down -v
常用技巧
清理磁盘空间
bash
# 删除所有未使用的资源(容器、镜像、网络)
docker system prune
# 更彻底的清理(包括未使用的卷)
docker system prune --volumes
# 查看 Docker 磁盘占用
docker system df
复制文件进出容器
bash
# 从容器复制到宿主机
docker cp <container_id>:/app/log.txt ./
# 从宿主机复制到容器
docker cp ./config.json <container_id>:/app/config.json
查看容器资源占用
bash
docker stats
速查表
text
镜像操作:
docker pull image 拉取镜像
docker images 查看镜像
docker build -t name . 构建镜像
docker rmi image 删除镜像
容器操作:
docker run image 运行容器
docker ps 查看运行中的容器
docker ps -a 查看所有容器
docker stop id 停止容器
docker start id 启动容器
docker rm id 删除容器
docker logs id 查看日志
常用参数:
-d 后台运行
-p 8080:80 端口映射
-v /host:/container 挂载卷
-e KEY=VAL 环境变量
--name name 容器命名
-it 交互终端
Compose:
docker compose up -d 启动
docker compose down 停止
docker compose logs -f 日志
清理:
docker system prune 清理未使用资源