在云计算与微服务架构普及的今天,容器化部署已经成为开发者必备技能。Docker作为容器技术的领军者,通过“一次构建、到处运行”的特性,彻底解决了环境不一致导致的“本地运行正常,线上崩溃”问题。本文将以搭建一个静态HTML网站和一个动态PHP网站为例,带你从Docker基础操作到完整站点部署,一步步掌握容器化建站的核心流程。
一、Docker核心概念快速回顾
在开始实操前,先明确几个关键概念,避免后续操作中混淆:
- 镜像(Image):容器的“模板”,包含运行应用所需的所有文件、依赖和配置(比如Nginx镜像、PHP镜像)。
- 容器(Container):镜像的“运行实例”,是独立的沙箱环境,可启动、停止、删除。
- 仓库(Repository):存放镜像的地方,Docker Hub是官方公共仓库,也可搭建私有仓库。
- Dockerfile:定义镜像构建流程的文本文件,通过
docker build命令生成自定义镜像。
二、环境准备:安装Docker
1. 安装Docker(以Ubuntu为例)
# 更新软件包列表
sudo apt update
# 安装依赖包
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 验证安装(出现版本号则成功)
docker --version
2. 配置非root用户操作Docker(可选但推荐)
默认情况下,只有root用户能操作Docker,为了方便可将当前用户加入docker组:
sudo usermod -aG docker $USER
# 重启终端或执行以下命令生效
newgrp docker
三、实操1:Docker部署静态HTML网站
静态网站(如纯HTML/CSS/JS)是容器化部署的入门场景,我们将用Nginx镜像来运行。
步骤1:准备静态网站文件
首先创建一个本地目录存放网站代码,比如my-static-site:
mkdir -p my-static-site
cd my-static-site
# 创建首页index.html
cat > index.html << EOF
<!DOCTYPE html>
<html>
<head>
<title>我的Docker静态网站</title>
<style>
body { text-align: center; margin-top: 50px; font-family: Arial; }
h1 { color: #2c3e50; }
p { color: #7f8c8d; }
</style>
</head>
<body>
<h1>Hello Docker!</h1>
<p>这是用Docker部署的静态网站</p>
</body>
</html>
EOF
步骤2:拉取Nginx官方镜像
Nginx是轻量级高性能Web服务器,官方镜像已上传至Docker Hub,直接拉取即可:
docker pull nginx:latest
# 查看已拉取的镜像
docker images
输出类似:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 141MB
步骤3:运行Nginx容器并挂载本地网站文件
Docker容器默认是隔离的,要让容器访问本地文件,需通过卷挂载(Volume Mount)将本地目录映射到容器内的Nginx网页根目录(/usr/share/nginx/html):
docker run -d \
--name my-static-container \ # 给容器命名
-p 8080:80 \ # 端口映射:本地8080端口 → 容器80端口
-v $(pwd):/usr/share/nginx/html \ # 挂载本地当前目录到容器网页根目录
nginx:latest
参数说明:
-d:后台运行容器(守护进程模式);--name:指定容器名称,方便后续管理;-p:端口映射,Nginx默认监听80端口,这里映射到本地8080;-v:卷挂载,格式为本地路径:容器内路径。
步骤4:验证网站访问
打开浏览器,输入http://localhost:8080(如果是服务器,替换为服务器IP),即可看到“Hello Docker!”的页面。此时修改本地index.html内容,刷新浏览器会立即生效——因为挂载的目录是实时同步的。
步骤5:容器管理(可选)
- 查看运行中的容器:
docker ps - 停止容器:
docker stop my-static-container - 启动容器:
docker start my-static-container - 删除容器:
docker rm my-static-container(需先停止)
四、实操2:Docker部署动态PHP网站(Nginx+PHP-FPM)
静态网站无法处理表单、数据库交互等动态逻辑,此时需要Web服务器(Nginx)+ 应用服务器(PHP-FPM)的组合。由于涉及两个容器,我们用Docker Compose来管理多容器协作(更高效)。
步骤1:安装Docker Compose
Docker Compose是用于定义和运行多容器Docker应用的工具,通过docker-compose.yml文件配置服务:
# 下载最新版Docker Compose(注意替换版本号,可去GitHub查看最新版)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
步骤2:创建项目目录结构
mkdir -p my-php-site/{html,nginx}
cd my-php-site
目录说明:
html:存放PHP网站代码;nginx:存放Nginx配置文件。
步骤3:编写PHP代码
在html目录下创建index.php:
cat > html/index.php << EOF
<?php
echo "<h1>我的Docker PHP网站</h1>";
echo "当前时间:" . date('Y-m-d H:i:s');
echo "<br>PHP版本:" . phpversion();
?>
EOF
步骤4:编写Nginx配置文件
在nginx目录下创建default.conf,配置Nginx转发PHP请求到PHP-FPM容器:
cat > nginx/default.conf << EOF
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
# 处理PHP请求
location ~ \.php$ {
fastcgi_pass php-fpm:9000; # 指向PHP-FPM容器的服务名和端口
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
# 静态文件缓存
location ~* \.(css|js|png|jpg|jpeg|gif|ico)$ {
expires 1d;
add_header Cache-Control "public";
}
}
EOF
步骤5:编写docker-compose.yml
在项目根目录(my-php-site)下创建docker-compose.yml,定义Nginx和PHP-FPM两个服务:
version: '3'
services:
nginx:
image: nginx:latest
ports:
- "8081:80" # 本地8081端口映射到Nginx容器80端口
volumes:
- ./html:/var/www/html # 挂载PHP代码到容器
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载Nginx配置
depends_on:
- php-fpm # 依赖PHP-FPM服务,确保先启动PHP-FPM
php-fpm:
image: php:8.2-fpm # 使用PHP 8.2版本的FPM镜像
volumes:
- ./html:/var/www/html # 与Nginx共享PHP代码目录
步骤6:启动多容器服务
在my-php-site目录下执行:
docker-compose up -d
Docker Compose会自动拉取所需镜像(如果本地没有),并启动两个容器。
步骤7:验证动态网站
打开浏览器访问http://localhost:8081,会看到显示当前时间和PHP版本的页面——这说明PHP代码已被成功解析。
五、进阶:自定义镜像(Dockerfile实战)
上述案例用了官方镜像,但实际开发中常需自定义镜像(比如安装PHP扩展、修改配置)。以PHP-FPM为例,我们通过Dockerfile安装mysqli扩展(用于连接MySQL)。
步骤1:创建Dockerfile
在my-php-site目录下创建Dockerfile:

# 基于官方PHP-FPM镜像
FROM php:8.2-fpm
# 安装mysqli扩展
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
# 设置工作目录
WORKDIR /var/www/html
步骤2:修改docker-compose.yml
将原来的php-fpm服务从使用官方镜像改为构建自定义镜像:
services:
# ...(Nginx服务保持不变)
php-fpm:
build: . # 从当前目录的Dockerfile构建镜像
volumes:
- ./html:/var/www/html
步骤3:重新构建并启动
# 构建镜像并启动服务
docker-compose up -d --build
此时PHP-FPM容器已包含mysqli扩展,可用于连接MySQL数据库(需额外配置MySQL容器,这里不再展开)。
六、常见问题与解决方案
- 端口冲突:启动容器时提示“port already allocated”,需更换本地端口(比如将
8080改为8082)。 - 文件权限问题:容器内无法读写挂载的本地文件,可修改本地目录权限:
chmod -R 755 my-static-site。 - 容器日志查看:要调试网站错误,可查看容器日志:
- Nginx日志:
docker logs my-static-container - Docker Compose日志:
docker-compose logs nginx
- Nginx日志:
七、总结
通过本文的实操,你已经掌握了Docker部署静态和动态网站的核心流程:从镜像拉取、容器运行,到多容器协作(Docker Compose)和自定义镜像(Dockerfile)。Docker的优势在于环境一致性和轻量化,无论是个人项目还是企业级应用,容器化部署都能大幅提升开发和运维效率。
下一步可以尝试:部署带MySQL数据库的完整Web应用(比如WordPress)、使用Docker Swarm或Kubernetes进行容器编排,进一步探索容器技术的潜力。









留言0