【Docker】看完这篇文章直接掌握Docker的使用

小破孩
2026-09-12 / 0 评论 / 3 阅读 / 正在检测是否收录...

可以。既然你的目标不是“简单会用 Docker Desktop”,而是以后能自己用 Docker Desktop 部署 PHP / Webman / Laravel / ThinkPHP / MySQL / Redis / Nginx 等项目,我建议不要只学几个 docker run 命令,而是按“理解 Docker → Dockerfile → Compose → PHP 环境 → 数据库 → Nginx → 项目部署 → 生产部署”这条路线学。

你之前已经接触过 PHP、ThinkPHP、Laravel、Webman、MySQL、Composer,所以这套教程我会直接按照 PHP 开发者的实际场景来教。


一、先建立一个正确的认识

你以后做 PHP 项目,最终很可能是这样的结构:

你的电脑
│
├─ Windows
│
├─ Docker Desktop
│   │
│   ├─ PHP 容器
│   │    └─ PHP 8.3
│   │
│   ├─ Nginx 容器
│   │
│   ├─ MySQL 容器
│   │
│   ├─ Redis 容器
│   │
│   └─ phpMyAdmin 容器
│
└─ 你的 PHP 项目
     ├─ app/
     ├─ config/
     ├─ public/
     ├─ vendor/
     ├─ composer.json
     ├─ Dockerfile
     └─ compose.yaml

也就是说:

以后你电脑上不一定需要直接安装 PHP、MySQL、Redis、Nginx。

Docker 把这些东西分别放进容器里。

这也是 Docker 最核心的价值。

Docker Desktop 在 Windows 上目前推荐使用 WSL 2 后端;Docker 官方也建议 Windows 开发环境结合 WSL 2 使用。(Docker 文档)


二、你必须先搞懂 6 个东西

Docker 初学者最容易犯的错误,就是一上来背命令。

其实你只需要先理解:

Docker 概念PHP 开发者可以理解成
Image 镜像PHP 环境模板
Container 容器正在运行的 PHP 环境
Dockerfile如何制作 PHP 环境
Compose一次定义 PHP+Nginx+MySQL+Redis
Volume数据持久化
Network容器之间通信

其中最重要的是:

Dockerfile
    ↓
Image
    ↓
Container

而:

compose.yaml
    ↓
一次管理多个 Container

三、第一阶段:先把 Docker Desktop 安装正确

你是 Windows,所以推荐:

Windows
   ↓
WSL 2
   ↓
Docker Desktop
   ↓
Linux Containers

Docker 官方目前要求 WSL 至少为 2.1.5,推荐保持最新版本。(Docker 文档)

1. 检查 WSL

打开:

PowerShell

执行:

wsl --version

再执行:

wsl -l -v

正常可能看到:

NAME      STATE           VERSION
Ubuntu    Running         2

如果没有 WSL:

wsl --install

然后:

wsl --update

重启电脑。


四、Docker Desktop 怎么设置

安装 Docker Desktop 后打开:

Settings

重点看:

General

确保:

Use the WSL 2 based engine

开启。

然后:

Settings
    ↓
Resources
    ↓
WSL Integration

打开你的 Ubuntu。

Docker 官方也建议在 WSL 2 环境下进行开发,并开启 WSL Integration。(Docker 文档)


五、第一课:不要 PHP,先跑一个 Nginx

打开 PowerShell:

docker --version

然后:

docker run -d -p 8080:80 nginx

浏览器打开:

http://localhost:8080

你应该看到:

Welcome to nginx!

恭喜。

你已经完成了:

Docker Desktop
      ↓
下载 nginx 镜像
      ↓
创建 nginx 容器
      ↓
启动容器
      ↓
Windows 8080
      ↓
容器 80

六、理解这个命令

刚才:

docker run -d -p 8080:80 nginx

拆开:

docker

Docker 命令。

run

创建并运行容器。

-d

后台运行。

-p 8080:80

端口映射:

Windows 8080
      ↓
Docker 容器 80

最后:

nginx

使用的镜像。


七、Docker Desktop GUI 到底怎么看?

现在打开 Docker Desktop。

你会看到:

Containers
Images
Volumes
Builds
...

刚才创建的:

nginx

就在:

Containers

里面。

而:

nginx

镜像就在:

Images

里面。

所以一定要区分:

Image

nginx 镜像

它类似:

安装包 / 模板

Container

nginx 容器

它类似:

已经启动的程序实例

可以这样理解:

nginx Image
    │
    ├── Container 1
    │
    ├── Container 2
    │
    └── Container 3

一个镜像可以创建很多容器。


八、几个你必须掌握的命令

查看容器

docker ps

查看所有容器:

docker ps -a

停止容器

docker stop 容器ID

例如:

docker stop abc123

删除容器

docker rm 容器ID

查看镜像

docker images

删除镜像

docker rmi nginx

查看日志

这个非常重要。

docker logs 容器ID

实时查看:

docker logs -f 容器ID

以后 PHP 报错、Webman 启动失败、Nginx 502,第一反应就是看日志


九、第二课:开始 PHP

现在开始进入你真正需要的部分。

Docker 官方有专门的 PHP 容器化教程,目前官方 PHP Guide 就是围绕 Dockerfile、Compose、数据库和开发环境展开的。(Docker 文档)

我们先建立:

php-demo
│
├── index.php
└── Dockerfile

十、创建 index.php

<?php

phpinfo();

十一、创建 Dockerfile

FROM php:8.3-apache

COPY . /var/www/html

这就是你的第一个 Dockerfile。


十二、构建 PHP 镜像

进入项目目录:

docker build -t php-demo .

这里:

docker build

构建镜像。

-t php-demo

给镜像起名字:

php-demo
.

当前目录作为构建上下文。

然后:

docker images

你应该看到:

php-demo
php
...

十三、启动 PHP

docker run -d -p 8080:80 --name php-demo php-demo

浏览器:

http://localhost:8080

看到 PHP 信息。

你已经完成:

Docker
 ↓
PHP Image
 ↓
PHP Container
 ↓
Apache
 ↓
PHP
 ↓
浏览器

十四、但是这不是我们最终要用的方式

你以后做:

Webman
Laravel
ThinkPHP
8688web
外贸商城
客服系统

不会每次都:

docker run ...

而是使用:

Docker Compose

这是你必须重点掌握的东西


十五、什么是 Compose?

假设你的 PHP 项目需要:

Nginx
PHP
MySQL
Redis

以前你可能需要:

启动 PHP
启动 Nginx
启动 MySQL
启动 Redis
配置网络
配置端口

Compose 可以统一描述:

services:

  nginx:
    ...

  php:
    ...

  mysql:
    ...

  redis:
    ...

然后一句:

docker compose up -d

全部启动。


十六、这才是你真正需要掌握的 Docker

以后你的 PHP 项目目录可能是:

my-project/
│
├── app/
├── config/
├── public/
├── runtime/
├── vendor/
├── composer.json
├── Dockerfile
├── compose.yaml
└── docker/
    └── nginx/
        └── default.conf

十七、一个完整 PHP 开发环境

我们先做一个:

Nginx
   ↓
PHP 8.3
   ↓
MySQL 8
   ↓
Redis

架构:

                  Windows
                     │
              Docker Desktop
                     │
        ┌────────────┴────────────┐
        │                         │
      Nginx                       │
     :8080                        │
        │                         │
        ↓                         │
      PHP 8.3                    │
        │                         │
        ├──────────→ MySQL 8     │
        │                         │
        └──────────→ Redis        │

十八、compose.yaml

例如:

services:

  php:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/var/www/html
    networks:
      - app

  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
    networks:
      - app

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: demo
      MYSQL_USER: demo
      MYSQL_PASSWORD: demo
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app

  redis:
    image: redis:alpine
    networks:
      - app

networks:
  app:

volumes:
  mysql-data:

这一个文件就定义了:

PHP
Nginx
MySQL
Redis
网络
MySQL 数据

十九、然后只需要

docker compose up -d

查看:

docker compose ps

可能看到:

NAME             STATUS
xxx-php-1        running
xxx-nginx-1      running
xxx-mysql-1      running
xxx-redis-1      running

停止:

docker compose down

重新构建:

docker compose up -d --build

看日志:

docker compose logs -f

看 PHP:

docker compose logs -f php

看 Nginx:

docker compose logs -f nginx

看 MySQL:

docker compose logs -f mysql

二十、你现在必须理解一个特别重要的东西:容器网络

比如 PHP 连接 MySQL。

很多初学者会写:

127.0.0.1

这是错的。

因为:

PHP Container
127.0.0.1

代表的是:

PHP 容器自己

而不是 MySQL。

Compose 中:

mysql:

就是 MySQL 的服务名。

所以 PHP 连接:

mysql:3306

而不是:

127.0.0.1:3306

例如:

DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=demo
DB_USERNAME=demo
DB_PASSWORD=demo

这个概念对你以后部署 Webman、Laravel、ThinkPHP 非常重要


二十一、Volume 是什么?

比如 MySQL:

volumes:
  - mysql-data:/var/lib/mysql

意思:

MySQL容器
    │
    ↓
/var/lib/mysql
    │
    ↓
mysql-data

即使:

docker compose down

数据库数据仍然存在。

所以:

Container

可以删除。

但:

Volume

保存数据。

这就是为什么:

容器不是虚拟机。

二十二、你以后会经常遇到的命令

把这一组记下来。

Docker

docker ps
docker ps -a
docker images
docker logs
docker exec
docker stop
docker start
docker restart
docker rm
docker rmi
docker inspect

Compose

docker compose up -d
docker compose down
docker compose restart
docker compose ps
docker compose logs
docker compose logs -f
docker compose exec
docker compose build
docker compose up -d --build

二十三、尤其要学会 docker exec

例如进入 PHP 容器:

docker compose exec php bash

进入之后:

php -v

查看:

PHP 8.3.x

Composer:

composer -V

甚至:

ls

你会发现:

你其实已经进入了一台 Linux 环境。

二十四、这时候你就会理解 Docker 的真正意义

以前:

Windows
│
├── PHP 8.1
├── PHP 8.2
├── PHP 8.3
├── MySQL
├── Redis
├── Nginx
├── Composer
└── 各种扩展

很容易乱。

Docker:

Docker Desktop
│
├── PHP 8.1 Container
├── PHP 8.2 Container
├── PHP 8.3 Container
│
├── MySQL Container
├── Redis Container
│
├── Webman项目
├── Laravel项目
└── ThinkPHP项目

不同项目之间互相隔离。


二十五、对于你,我建议学习路线这样安排

不要一次把所有 Docker 知识全部学完。

按照这个顺序:

第 1 阶段:Docker 基础

必须掌握:

Image
Container
Dockerfile
Volume
Network
Port

以及:

docker pull
docker run
docker ps
docker stop
docker rm
docker logs
docker exec
docker build

第 2 阶段:Compose

重点:

compose.yaml
services
image
build
ports
volumes
environment
depends_on
networks

掌握:

docker compose up -d
docker compose down
docker compose ps
docker compose logs
docker compose exec
docker compose build

第 3 阶段:PHP

然后进入:

PHP
Composer
PHP Extension
php.ini
www.conf
OPcache

比如:

pdo
pdo_mysql
mysqli
redis
mbstring
curl
zip
gd
openssl

二十六、第 4 阶段:Nginx + PHP-FPM

这是 PHP 开发者非常重要的一关。

最终理解:

浏览器
   ↓
Nginx
   ↓
PHP-FPM
   ↓
PHP代码

而不是简单的:

Apache + PHP

你以后部署 Webman / Laravel / ThinkPHP,理解这个非常有价值。


二十七、第 5 阶段:MySQL + Redis

学习:

MySQL Container
Redis Container
Volume
Network
Environment

最终:

PHP
 │
 ├── MySQL
 │
 └── Redis

二十八、第 6 阶段:真正部署 Webman

这个阶段就和你目前的开发方向高度相关了。

最终做到:

8688web
│
├── Nginx
│
├── Webman
│    └── PHP 8.3
│
├── MySQL
│
├── Redis
│
└── Composer

启动:

docker compose up -d

然后:

http://localhost

访问你的 Webman。


二十九、第 7 阶段:多项目

例如:

Docker Desktop
│
├── 8688web
│   ├── nginx
│   ├── php
│   ├── mysql
│   └── redis
│
├── project-a
│   ├── nginx
│   ├── php
│   └── mysql
│
├── project-b
│   ├── nginx
│   └── php
│
└── project-c

每个项目独立。

这时候你就真正进入 Docker 开发模式了。


三十、还有一个你现在非常值得注意的问题:项目放哪里

如果你使用 Windows + WSL 2:

开发项目最好放在 WSL 的 Linux 文件系统里,而不是大量 PHP 项目放在 Windows 文件系统后再通过挂载访问。

Docker 官方也明确建议,在 WSL 2 开发环境中,为了获得更好的性能,把代码放在默认 Linux distribution 内。(Docker 文档)

例如:

Ubuntu

/home/你的用户名/projects/

然后:

cd ~/projects

开发。

如果使用 VS Code,也可以:

code .

直接进入 WSL 环境开发。(Docker 文档)


三十一、你暂时不要急着学这些

现在先别碰:

Kubernetes
Docker Swarm
Docker Registry
CI/CD
Docker Scout
容器编排
多阶段构建高级玩法

这些以后再学。

对于你目前:

PHP + Webman + Laravel + ThinkPHP + MySQL + Redis + Nginx

最重要的是:

Docker基础
      ↓
Dockerfile
      ↓
Compose
      ↓
PHP
      ↓
Nginx
      ↓
MySQL
      ↓
Redis
      ↓
Webman
      ↓
完整项目
      ↓
生产部署

三十二、我建议我们直接“实战学”

你如果真的想必须掌握 Docker Desktop,我不建议我一次给你甩一百页理论。

我们可以直接做一个完整的 PHP Docker 实战课程

实战项目

Docker Desktop
       ↓
WSL2
       ↓
PHP 8.3
       ↓
Nginx
       ↓
MySQL 8
       ↓
Redis
       ↓
Composer
       ↓
Webman
       ↓
Laravel
       ↓
ThinkPHP

最后甚至可以做到:

一个项目
    ↓
git clone
    ↓
docker compose up -d
    ↓
PHP环境自动安装
    ↓
Composer自动处理
    ↓
MySQL自动启动
    ↓
Redis自动启动
    ↓
Nginx自动启动
    ↓
浏览器直接访问

这才是你真正应该掌握的 Docker 使用方式。

你现在先不要往后跳。第一步就在你电脑上执行:

wsl --version

以及:

wsl -l -v

这两个命令的结果直接发给我。我可以根据你现在的 Windows/WSL 状态,带你从 Docker Desktop 安装 → WSL2 → 第一个 PHP 容器 → PHP+Nginx+MySQL+Redis → Webman 项目一步一步实操。

0

评论 (0)

取消