一、Docker 是什么

一句话理解:Docker 把应用和它依赖的环境一起打包成一个可移植的容器,让你在任何装了 Docker 的机器上都能跑。

核心概念三个:

概念 说明 类比
镜像(Image) 只读模板,包含运行环境和代码 操作系统 ISO
容器(Container) 镜像的运行实例,可读写 虚拟机
仓库(Registry) 存放镜像的地方 GitHub

和虚拟机的本质区别:虚拟机虚拟硬件+操作系统,容器共享宿主机内核,只隔离应用层,所以启动快、占内存少

二、安装 Docker

Windows / macOS

直接下载 Docker Desktop,安装后启动即可。

验证安装:

1
2
docker --version
docker compose version

Linux(Ubuntu)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg -y

# 添加 Docker 官方 GPG Key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

# 免 sudo 使用 Docker
sudo usermod -aG docker $USER
# 重新登录后生效

三、核心命令速查

镜像操作

1
2
3
4
docker pull nginx:latest        # 拉取镜像
docker images # 查看本地镜像
docker rmi nginx:latest # 删除镜像
docker build -t myapp:v1 . # 从 Dockerfile 构建镜像

容器操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 运行一个 Nginx 容器
docker run -d --name web -p 8080:80 nginx:latest

# 常用参数:
# -d 后台运行
# --name 给容器起个名字
# -p 主机:容器 端口映射
# -v 主机:容器 挂载目录
# -e KEY=VAL 设置环境变量
# --rm 容器退出后自动删除

docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(含已停止)
docker stop web # 停止容器
docker start web # 启动已停止的容器
docker restart web # 重启容器
docker rm web # 删除容器(需先停止)
docker rm -f web # 强制删除(不管停没停)
docker logs -f web # 实时查看日志
docker exec -it web bash # 进入容器 shell

四、Dockerfile 编写指南

Dockerfile 是一份构建镜像的”配方”,每个指令会生成一层:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 指定基础镜像
FROM node:20-alpine

# 设置工作目录
WORKDIR /app

# 先复制 package 文件,利用缓存加速构建
COPY package*.json ./
RUN npm ci --only=production

# 再复制源码
COPY . .

# 暴露端口(文档作用,实际映射靠 -p)
EXPOSE 3000

# 容器启动命令
CMD ["node", "server.js"]

常用指令

指令 作用 示例
FROM 指定基础镜像 FROM python:3.12-slim
WORKDIR 设置工作目录 WORKDIR /app
COPY 复制文件到镜像 COPY . /app
RUN 构建时执行命令 RUN apt update && apt install curl -y
CMD 容器默认启动命令 CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT 容器入口,不会被 run 覆盖 ENTRYPOINT ["python"]
ENV 设置环境变量 ENV NODE_ENV=production
EXPOSE 声明端口 EXPOSE 8080
VOLUME 创建挂载点 VOLUME /data
COPY --chown 复制并指定文件所有者 COPY --chown=node:node . /app

最佳实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 使用多阶段构建减小镜像体积
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.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/package*.json ./
RUN npm ci --only=production
CMD ["node", "dist/server.js"]
1
2
3
4
5
# 2. 用 .dockerignore 排除无用文件
# node_modules
# .git
# .env
# dist
1
2
# 3. 合并 RUN 减少层数
RUN apt update && apt install curl -y && rm -rf /var/lib/apt/lists/*

五、Docker Compose

单容器不够时,用 Compose 一键编排多容器。

经典 LAMP 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# docker-compose.yml
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- php
networks:
- app-net

php:
image: php:8.2-fpm-alpine
volumes:
- ./html:/usr/share/nginx/html
networks:
- app-net

mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: myapp
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app-net

volumes:
mysql-data:

networks:
app-net:

Compose 常用命令

1
2
3
4
5
6
7
8
docker compose up -d              # 后台启动
docker compose down # 停止并删除
docker compose down -v # 连同数据卷一起删
docker compose logs -f # 查看日志
docker compose ps # 查看状态
docker compose exec php bash # 进入某服务
docker compose restart nginx # 重启某服务
docker compose build --no-cache # 重新构建

六、常用场景方案

1. MySQL 快速启动

1
2
3
4
5
6
7
8
9
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
-v mysql-data:/var/lib/mysql \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--default-authentication-plugin=mysql_native_password

2. Redis 快速启动

1
2
3
4
5
6
docker run -d \
--name redis \
-p 6379:6379 \
-v redis-data:/data \
redis:7-alpine \
redis-server --appendonly yes

3. 安装 Portainer(容器管理 Web UI)

1
2
3
4
5
6
docker run -d \
--name portainer \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer-data:/data \
portainer/portainer-ce:latest

访问 https://localhost:9443 创建管理员账号即可。

4. Nginx 反向代理模板

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name api.example.com;

location / {
proxy_pass http://your-app:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

七、常用清理操作

1
2
3
4
5
docker system df                    # 查看 Docker 磁盘占用
docker system prune # 删除停止容器、未用网络、悬空镜像
docker system prune -a # 更彻底,删所有未用镜像
docker volume prune # 删除未用数据卷
docker builder prune # 删除构建缓存

八、踩坑记录

  1. 端口被占用 Port is already allocateddocker ps 看哪个容器占用了,换端口或停掉旧容器即可。

  2. 容器内服务运行但宿主机访问不了 — 检查 -p 是否正确映射,以及容器内服务是否监听 0.0.0.0(不是 127.0.0.1)。

  3. 镜像拉取慢 / 超时 — 配置国内镜像源,在 Docker Desktop 设置中添加 registry mirror,或 Linux 下编辑 /etc/docker/daemon.json

  4. 数据丢了 — 没挂载数据卷的容器一旦删除,容器内数据也随之删除。重要数据一定要挂载 -v 到宿主机目录或命名卷。

  5. 容器反复重启docker logs <容器> 查看日志定位问题,通常是启动命令报错退出。

  6. Windows 下路径问题-v 挂载路径需要使用绝对路径,常用写法 -v ${PWD}/html:/usr/share/nginx/html(PowerShell 用 $pwd)。

  7. 磁盘被占满了 — Docker 镜像和构建缓非常占空间,定期 docker system prune -a


以上就是 Docker 从安装、镜像构建、Dockerfile 编写到 Compose 编排和实战方案的完整攻略,祝你容器化顺利!