为什么别人的项目"在我电脑上跑不起来"?Docker 给出的答案是:把应用连同它的运行环境一起打包,走到哪里都是同一套环境。它用"镜像"定义环境、"容器"运行实例,一条命令就能启动数据库、缓存、Web 服务。本文从零讲起,让你半小时内跑通第一个容器。

1. 核心概念:镜像、容器、仓库

打个比方:镜像是一张烧录好的系统光盘,容器是插上光盘启动的那台虚拟机——光盘可以反复使用,机器随开随关。

2. 安装与第一个容器

# 验证安装
docker --version

# 运行一个测试容器:hello-world
docker run hello-world

# 运行 nginx,映射端口 8080 -> 80
docker run -d -p 8080:80 --name web nginx

执行完最后一条,浏览器打开 http://localhost:8080 就能看到 nginx 欢迎页。-d 表示后台运行,-p 8080:80 把宿主机 8080 端口转发到容器内 80 端口。

3. 镜像管理:拉取与清理

docker pull mysql:8.0    # 拉取指定版本镜像
docker images            # 查看本地镜像
docker rmi mysql:8.0     # 删除镜像
docker image prune       # 清理悬空镜像

# 容器操作
docker ps                # 查看运行中的容器
docker ps -a             # 查看所有容器
docker stop web          # 停止
docker rm web            # 删除容器
命令作用
docker logs -f web实时查看容器日志
docker exec -it web bash进入容器内部操作
docker cp a.txt web:/tmp复制文件进出容器

4. 写一个 Dockerfile

把应用容器化的核心是写 Dockerfile,以 Python 应用为例:

# Dockerfile
FROM python:3.12-slim        # 基础镜像
WORKDIR /app                 # 工作目录
COPY requirements.txt .      # 复制依赖清单
RUN pip install -r requirements.txt  # 安装依赖
COPY . .                     # 复制项目代码
EXPOSE 8000                  # 声明端口
CMD ["python", "app.py"]     # 启动命令

构建并运行:

docker build -t myapp:1.0 .
docker run -d -p 8000:8000 --name app myapp:1.0

5. 数据持久化:卷挂载

容器删除后数据会丢失,所以数据库这类容器必须用 卷(Volume) 把数据存到宿主机:

# 匿名卷:容器删除后数据仍在
docker run -d -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8.0

# 挂载宿主机目录(适合开发,改代码即时生效)
docker run -d -p 8000:8000 -v $(pwd):/app myapp:1.0

6. 用 docker compose 编排多服务

真实项目往往需要多个容器协作(Web + 数据库 + 缓存),docker-compose.yml 一次定义、一键启动:

# docker-compose.yml
services:
  web:
    build: .
    ports: ["8000:8000"]
    depends_on: [db]
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes: ["mysql-data:/var/lib/mysql"]
volumes:
  mysql-data:
docker compose up -d   # 一键启动所有服务
docker compose down    # 停止并清理
💡 学习建议:不要只停留在 run 命令,亲手用 Dockerfile 容器化一个自己写过的小项目(哪怕是个静态网页),再试试 docker compose 编排,理解会立刻上一个台阶。