一、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
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 usermod -aG docker $USER
|
三、核心命令速查
镜像操作
1 2 3 4
| docker pull nginx:latest docker images docker rmi nginx:latest docker build -t myapp:v1 .
|
容器操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker run -d --name web -p 8080:80 nginx:latest
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
|
四、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
COPY package*.json ./ RUN npm ci --only=production
COPY . .
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
|
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
| 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
| 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 system prune docker system prune -a docker volume prune docker builder prune
|
八、踩坑记录
端口被占用 Port is already allocated — docker ps 看哪个容器占用了,换端口或停掉旧容器即可。
容器内服务运行但宿主机访问不了 — 检查 -p 是否正确映射,以及容器内服务是否监听 0.0.0.0(不是 127.0.0.1)。
镜像拉取慢 / 超时 — 配置国内镜像源,在 Docker Desktop 设置中添加 registry mirror,或 Linux 下编辑 /etc/docker/daemon.json。
数据丢了 — 没挂载数据卷的容器一旦删除,容器内数据也随之删除。重要数据一定要挂载 -v 到宿主机目录或命名卷。
容器反复重启 — docker logs <容器> 查看日志定位问题,通常是启动命令报错退出。
Windows 下路径问题 — -v 挂载路径需要使用绝对路径,常用写法 -v ${PWD}/html:/usr/share/nginx/html(PowerShell 用 $pwd)。
磁盘被占满了 — Docker 镜像和构建缓非常占空间,定期 docker system prune -a。
以上就是 Docker 从安装、镜像构建、Dockerfile 编写到 Compose 编排和实战方案的完整攻略,祝你容器化顺利!