为什么别人的项目"在我电脑上跑不起来"?Docker 给出的答案是:把应用连同它的运行环境一起打包,走到哪里都是同一套环境。它用"镜像"定义环境、"容器"运行实例,一条命令就能启动数据库、缓存、Web 服务。本文从零讲起,让你半小时内跑通第一个容器。
1. 核心概念:镜像、容器、仓库
- 镜像(Image):只读的"模板",包含代码、依赖和配置,类似安装包
- 容器(Container):镜像的运行实例,可以启动、停止、删除
- 仓库(Registry):存放镜像的"应用商店",最常用的是 Docker Hub
打个比方:镜像是一张烧录好的系统光盘,容器是插上光盘启动的那台虚拟机——光盘可以反复使用,机器随开随关。
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 编排,理解会立刻上一个台阶。