为什么需要 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