为什么需要 Docker?
如果你曾经遇到过"在我电脑上明明能跑啊"的困境,Docker 就是答案。Docker 把应用和它的依赖一起打包成一个标准化的容器,保证在开发、测试、生产环境中的行为完全一致。
- 环境一致性:开发用 Docker,测试用 Docker,生产也用 Docker,一模一样的运行环境
- 快速部署:一条命令启动整个应用栈,不需要手动装依赖
- 资源隔离:每个容器独立运行,互不影响
- 易于扩展:需要 10 个实例?docker-compose scale 一键搞定
安装 Docker
Ubuntu/Debian 安装:
apt update
apt install docker.io docker-compose -y
systemctl start docker
systemctl enable docker
# 让普通用户也能用 docker
usermod -aG docker $USER
# 重新登录生效
验证安装:
docker --version
docker run hello-world
核心概念速览
| 概念 | 类比 | 说明 |
|---|---|---|
| 镜像 (Image) | 安装包/ISO | 只读模板,包含运行应用所需的一切 |
| 容器 (Container) | 运行中的程序 | 镜像的运行实例,可以启动、停止、删除 |
| Dockerfile | 安装脚本 | 描述如何构建镜像的文本文件 |
| docker-compose | 部署编排 | 定义和管理多容器应用 |
| Registry | 应用商店 | 存储和分发镜像的仓库(Docker Hub) |
常用 Docker 命令
镜像管理
docker pull nginx:latest # 拉取镜像
docker images # 列出本地镜像
docker rmi nginx:latest # 删除镜像
docker build -t myapp:v1 . # 构建镜像
容器管理
docker run -d --name web -p 80:80 nginx # 后台运行 nginx,映射 80 端口
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(含已停止)
docker stop web # 停止容器
docker start web # 启动已停止的容器
docker rm web # 删除容器
docker logs -f web # 查看容器日志
docker exec -it web /bin/bash # 进入容器内部
编写 Dockerfile
一个典型的 PHP 应用 Dockerfile:
FROM php:8.1-fpm
# 安装扩展
RUN docker-php-ext-install pdo pdo_mysql mysqli
# 复制代码
COPY ./src /var/www/html/
# 设置权限
RUN chown -R www-data:www-data /var/www/html
# 暴露端口
EXPOSE 9000
CMD ["php-fpm"]
docker-compose 多容器编排
一个 WordPress 网站的 docker-compose.yml(PHP + MySQL + Nginx):
version: "3.8"
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: secret
depends_on:
- db
volumes:
db_data:
启动全部服务:
docker-compose up -d
停止并删除所有容器:
docker-compose down