Docker容器搭建网站实操教程:从0到1部署你的第一个容器化站点

快小二编导 技术教程

在云计算与微服务架构普及的今天,容器化部署已经成为开发者必备技能。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容器,这里不再展开)。

六、常见问题与解决方案

  1. 端口冲突:启动容器时提示“port already allocated”,需更换本地端口(比如将8080改为8082)。
  2. 文件权限问题:容器内无法读写挂载的本地文件,可修改本地目录权限:chmod -R 755 my-static-site
  3. 容器日志查看:要调试网站错误,可查看容器日志:
    • Nginx日志:docker logs my-static-container
    • Docker Compose日志:docker-compose logs nginx

七、总结

通过本文的实操,你已经掌握了Docker部署静态和动态网站的核心流程:从镜像拉取、容器运行,到多容器协作(Docker Compose)和自定义镜像(Dockerfile)。Docker的优势在于环境一致性和轻量化,无论是个人项目还是企业级应用,容器化部署都能大幅提升开发和运维效率。

下一步可以尝试:部署带MySQL数据库的完整Web应用(比如WordPress)、使用Docker Swarm或Kubernetes进行容器编排,进一步探索容器技术的潜力。

0 18705

留言0

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码