这是一篇为您精心准备的 Docker 实战指南。它不仅仅是命令的堆砌,而是按照全生命周期(从获取镜像、运行容器、数据持久化、到构建自己的镜像)编写的深度教程。


Docker 实战全指南:从零到精通

本文将通过一个完整的流程,带你掌握 Docker 的核心操作。我们将以最常用的 Web 服务器 Nginx 和一个自定义的 Python 应用为例。


第一部分:核心概念速记

在敲代码前,请死记这三个概念的关系:

  1. 镜像 (Image):类的定义(Class),或者说是“光盘/安装包”。它是只读的。
  2. 容器 (Container):类的实例(Object),或者说是“运行中的程序”。它是可读写的。
  3. 仓库 (Repository):存放镜像的地方(比如 Docker Hub),类似 GitHub。

第二部分:镜像管理 (Image)

一切从获取镜像开始。

1. 拉取镜像

从 Docker Hub 下载 Nginx 镜像。

# 语法: docker pull [镜像名]:[标签]
# 如果不写标签,默认是 latest
docker pull nginx:latest

2. 查看本地镜像

docker images

# 输出示例:
# REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
# nginx        latest    605c77e624dd   2 weeks ago    141MB

3. 删除镜像

# 删除不再需要的镜像(必须先删除使用该镜像的容器)
docker rmi nginx:latest

第三部分:容器操作 (Container) —— 核心中的核心

这是你日常工作最频繁的部分。

1. 启动容器 (Run)

这是最长、参数最复杂的命令。我们来拆解运行一个 Nginx 容器:

docker run -d \
  --name my-nginx-server \
  -p 8080:80 \
  -v $(pwd)/html:/usr/share/nginx/html \
  nginx:latest

详细参数解析(背下来):

  • docker run: 创建并启动一个新容器。
  • -d (Detached): 后台运行。如果不加,容器日志会霸占你的终端。
  • --name: 给容器起个名字(my-nginx-server),否则 Docker 会随机生成一个怪名字。
  • -p 8080:80 (Port): 端口映射
    • 左边 8080宿主机(你的电脑)的端口。
    • 右边 80容器内部的端口(Nginx 默认监听 80)。
    • 效果:访问你电脑的 localhost:8080,流量会被转发到容器里的 80 端口。
  • -v (Volume): 挂载数据卷(下文详细讲)。
  • nginx:latest: 指定使用的镜像。

2. 查看运行中的容器

docker ps

# 如果要查看包括已停止的所有容器:
docker ps -a

3. 停止与启动

# 停止容器
docker stop my-nginx-server

# 再次启动
docker start my-nginx-server

# 重启(常用于修改配置后)
docker restart my-nginx-server

4. 进入容器内部

有时候你需要进容器里改配置文件或查看情况,这相当于 SSH 进了一台微型 Linux。

# -it 代表交互式终端
# /bin/bash 是你想在容器里执行的命令(如果没有 bash,尝试 /bin/sh)
docker exec -it my-nginx-server /bin/bash

# 进入后,你可以执行 ls, cat 等命令
# 输入 exit 退出容器

5. 查看容器日志

容器后台运行时,如何看报错?

# 查看最后20行日志
docker logs --tail 20 my-nginx-server

# -f (follow): 实时滚动查看日志(类似 tail -f)
docker logs -f my-nginx-server

6. 删除容器

# 必须先 stop 才能 rm,或者加 -f 强制删除
docker rm -f my-nginx-server

第四部分:数据持久化 (Volume)

痛点:容器一旦删除,里面的文件(比如数据库数据、日志)就全没了。
解决:使用挂载(Volume),把容器里的目录“映射”到你宿主机的硬盘上。

方式一:Bind Mount (指定路径挂载)

最适合开发环境,因为你可以直接在宿主机修改代码,容器内立即生效。

# 假设当前目录下有一个 index.html 文件
echo "<h1>Hello Docker</h1>" > index.html

# 运行并将当前目录挂载到 Nginx 的默认网页目录
docker run -d -p 8081:80 \
  -v $(pwd):/usr/share/nginx/html \
  nginx

此时访问 localhost:8081,你会看到 “Hello Docker”。如果你在宿主机修改 index.html,刷新浏览器内容也会变。

方式二:Docker Volume (托管卷)

最适合生产环境或数据库,由 Docker 自动管理存储位置。

# 创建一个卷
docker volume create my-db-data

# 挂载这个卷
docker run -d \
  -v my-db-data:/var/lib/mysql \
  mysql:5.7

第五部分:构建自己的镜像 (Dockerfile)

光用别人的镜像是不够的,你需要打包自己的代码。我们以一个简单的 Python Flask 应用为例。

1. 准备文件

新建一个文件夹,包含以下三个文件:

文件 1: app.py (业务代码)

from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello():
    return f"Hello from Docker! Hostname: {os.getenv('HOSTNAME')}"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

文件 2: requirements.txt (依赖库)

flask

文件 3: Dockerfile (构建蓝图)
这是核心,请仔细阅读每一行的注释。

# 1. 基础镜像:基于官方 Python 3.9 轻量版
FROM python:3.9-slim

# 2. 设置工作目录:容器内的操作都在 /app 下进行
WORKDIR /app

# 3. 复制依赖文件:先只复制 requirements.txt,利用缓存机制
COPY requirements.txt .

# 4. 安装依赖:在容器内执行 pip install
# --no-cache-dir 可以减小镜像体积
RUN pip install --no-cache-dir -r requirements.txt

# 5. 复制源代码:将当前目录所有文件复制到容器的 /app
COPY . .

# 6. 暴露端口:声明容器会使用 5000 端口(仅做文档声明用)
EXPOSE 5000

# 7. 启动命令:容器启动时默认执行的命令
CMD ["python", "app.py"]

2. 构建镜像 (Build)

# -t 给镜像起个名字 (my-flask-app) 和标签 (v1)
# 最后的 . 代表 Dockerfile 在当前目录
docker build -t my-flask-app:v1 .

3. 运行你的镜像

docker run -d -p 5000:5000 my-flask-app:v1

访问 localhost:5000,你就能看到你的 Python 应用在 Docker 里跑起来了!


第六部分:Docker Compose (编排)

当你同时需要 Python 后端 + Redis 缓存 + MySQL 数据库时,手动敲三个 docker run 命令太累了。
我们需要 docker-compose.yml 来一次性管理它们。

文件: docker-compose.yml

version: '3.8'  # 格式版本

services:
  # 服务 1: 我们的 Web 应用
  web:
    build: .  # 直接使用当前目录的 Dockerfile 构建
    ports:
      - "5000:5000"
    volumes:
      - .:/app  # 代码热更新挂载
    depends_on:
      - redis
    environment:
      - REDIS_HOST=redis

  # 服务 2: Redis 数据库
  redis:
    image: "redis:alpine"
    ports:
      - "6379:6379"

常用命令:

# 1. 启动所有服务(后台运行)
docker-compose up -d

# 2. 查看 Compose 管理的容器状态
docker-compose ps

# 3. 查看所有服务的汇总日志
docker-compose logs -f

# 4. 停止并删除所有容器、网络
docker-compose down

第七部分:清理战场 (Cleanup)

Docker 用久了会产生很多垃圾(停止的容器、未使用的镜像、缓存)。

# 慎用!这会删除所有停止的容器、未被使用的网络和悬空的镜像
docker system prune

# 如果要更彻底(包括未被使用的镜像和数据卷)
docker system prune -a --volumes

总结:Docker 极简口诀

  1. 找镜像docker pull
  2. 跑容器docker run -d -p <宿主机端口>:<容器端口> --name <名字> <镜像>
  3. 看状态docker ps
  4. 看日志docker logs -f <名字>
  5. 进容器docker exec -it <名字> /bin/bash
  6. 停容器docker stop <名字>
  7. 删容器docker rm <名字>
  8. 造镜像docker build -t <名字> .
  9. 一键跑docker-compose up -d
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐