1. 首页 > Linux教程 > 正文

Linux教程FG089-简单Web应用(Nginx)容器化部署入门

更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 容器化部署优势

将Web应用容器化部署具有以下优势:

  • 环境一致性:开发、测试、生产环境完全一致
  • 快速部署:容器启动快,部署效率高
  • 资源隔离:应用之间相互隔离,互不影响
  • 易于扩展:可以快速扩展应用实例
  • 便于迁移:容器可以在不同平台间轻松迁移

1.2 Nginx容器化要点

配置项 说明 示例
端口映射 将容器端口映射到主机端口 -p 80:80
数据卷 持久化配置和静态文件 -v /data/nginx:/usr/share/nginx/html
环境变量 配置应用参数 -e TZ=Asia/Shanghai
网络配置 配置容器网络 –network mynet
资源限制 限制CPU和内存使用 –memory=”512m”

1.3 Docker网络基础

  • bridge:默认网络模式,容器间可以通信
  • host:使用主机网络栈
  • none:无网络配置
  • container:共享另一个容器的网络
  • 自定义网络:用户定义的网络

Part02-实战环境准备与配置

2.1 创建项目目录结构

# 1. 创建项目目录
# mkdir -p /opt/nginx-app
# mkdir -p /opt/nginx-app/html
# mkdir -p /opt/nginx-app/conf
# mkdir -p /opt/nginx-app/logs
# mkdir -p /opt/nginx-app/data

# 2. 查看目录结构
# tree /opt/nginx-app
/opt/nginx-app
├── conf
├── data
├── html
└── logs

4 directories, 0 files

# 3. 创建静态网页文件
# cat > /opt/nginx-app/html/index.html << 'EOF'

Nginx容器化部署成功!

部署信息:

  • 容器名称:nginx-web
  • 端口映射:8080 -> 80
  • 部署时间:2026-04-02
  • 部署方式:Docker容器

这是一个使用Docker容器化部署的Nginx Web服务器。

容器化部署具有环境一致、快速部署、易于扩展等优势。

EOF

# 4. 创建关于页面
# cat > /opt/nginx-app/html/about.html << 'EOF'

关于我们

这是一个使用Docker容器化部署的Nginx Web服务器演示项目。

技术栈

  • Web服务器:Nginx
  • 容器技术:Docker
  • 操作系统:RHEL 10

特性

  • 容器化部署
  • 数据持久化
  • 配置管理
  • 日志管理

EOF

# 5. 查看创建的文件
# ls -la /opt/nginx-app/html/
total 16
-rw-r–r–. 1 root root 1234 Apr 2 12:00 about.html
-rw-r–r–. 1 root root 2345 Apr 2 12:00 index.html

2.2 创建Nginx配置文件

# 1. 创建Nginx主配置文件
# cat > /opt/nginx-app/conf/nginx.conf << 'EOF' user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml; server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } location /health { access_log off; return 200 "healthy\n"; add_header Content-Type text/plain; } error_page 404 /404.html; location = /404.html { internal; } } } EOF # 2. 创建404页面 # cat > /opt/nginx-app/html/404.html << 'EOF'

404

抱歉,您访问的页面不存在。

返回首页

EOF

# 3. 查看配置文件
# ls -la /opt/nginx-app/conf/
total 4
-rw-r–r–. 1 root root 1234 Apr 2 12:00 nginx.conf

Part03-核心命令实操演示

3.1 运行Nginx容器

# 1. 运行Nginx容器
# docker run -d \
–name nginx-web \
-p 8080:80 \
-v /opt/nginx-app/html:/usr/share/nginx/html \
-v /opt/nginx-app/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /opt/nginx-app/logs:/var/log/nginx \
-e TZ=Asia/Shanghai \
–restart unless-stopped \
nginx:latest
1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3

# 2. 查看运行中的容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b2c3d4e5f6a nginx:latest “/docker-entrypoint.…” 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp nginx-web

# 3. 查看容器详细信息
# docker inspect nginx-web | grep -A 10 “Mounts”
“Mounts”: [
{
“Type”: “bind”,
“Source”: “/opt/nginx-app/html”,
“Destination”: “/usr/share/nginx/html”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
},
{
“Type”: “bind”,
“Source”: “/opt/nginx-app/conf/nginx.conf”,
“Destination”: “/etc/nginx/nginx.conf”,
“Mode”: “ro”,
“RW”: false,
“Propagation”: “rprivate”
},
{
“Type”: “bind”,
“Source”: “/opt/nginx-app/logs”,
“Destination”: “/var/log/nginx”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
}
]

3.2 测试Web应用

# 1. 测试首页
# curl http://localhost:8080

Nginx容器化部署成功!

部署信息:

  • 容器名称:nginx-web
  • 端口映射:8080 -> 80
  • 部署时间:2026-04-02
  • 部署方式:Docker容器

这是一个使用Docker容器化部署的Nginx Web服务器。

容器化部署具有环境一致、快速部署、易于扩展等优势。

# 2. 测试关于页面
# curl http://localhost:8080/about.html

关于我们

这是一个使用Docker容器化部署的Nginx Web服务器演示项目。

技术栈

  • Web服务器:Nginx
  • 容器技术:Docker
  • 操作系统:RHEL 10

特性

  • 容器化部署
  • 数据持久化
  • 配置管理
  • 日志管理

# 3. 测试健康检查端点
# curl http://localhost:8080/health
healthy

# 4. 测试404页面
# curl http://localhost:8080/notfound

404

抱歉,您访问的页面不存在。

返回首页

3.3 查看容器日志

# 1. 查看容器日志
# docker logs nginx-web
/docker-entrypoint.sh: /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: /docker-entrypoint.d/20-envsubst-on-templates.sh: Running envsubst on /etc/nginx/templates/default.conf.template
/docker-entrypoint.sh: Launching /usr/sbin/nginx -g ‘daemon off;’
2026/04/02 12:00:00 [notice] 1#1: using the “epoll” event method
2026/04/02 12:00:00 [notice] 1#1: nginx/1.25.3
2026/04/02 12:00:00 [notice] 1#1: built by gcc 12.2.0
2026/04/02 12:00:00 [notice] 1#1: OS: Linux 5.14.0-362.el10.x86_64
2026/04/02 12:00:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2026/04/02 12:00:00 [notice] 1#1: start worker processes
2026/04/02 12:00:00 [notice] 1#1: start worker process 7
192.168.1.100 – – [02/Apr/2026:12:00:00 +0000] “GET / HTTP/1.1” 200 1234 “-” “curl/7.76.1”
192.168.1.100 – – [02/Apr/2026:12:00:01 +0000] “GET /about.html HTTP/1.1” 200 987 “-” “curl/7.76.1”
192.168.1.100 – – [02/Apr/2026:12:00:02 +0000] “GET /health HTTP/1.1” 200 8 “-” “curl/7.76.1”
192.168.1.100 – – [02/Apr/2026:12:00:03 +0000] “GET /notfound HTTP/1.1” 404 654 “-” “curl/7.76.1”

# 2. 查看Nginx访问日志
# tail -20 /opt/nginx-app/logs/access.log
192.168.1.100 – – [02/Apr/2026:12:00:00 +0000] “GET / HTTP/1.1” 200 1234 “-” “curl/7.76.1”
192.168.1.100 – – [02/Apr/2026:12:00:01 +0000] “GET /about.html HTTP/1.1” 200 987 “-” “curl/7.76.1”
192.168.1.100 – – [02/Apr/2026:12:00:02 +0000] “GET /health HTTP/1.1” 200 8 “-” “curl/7.76.1”
192.168.1.100 – – [02/Apr/2026:12:00:03 +0000] “GET /notfound HTTP/1.1” 404 654 “-” “curl/7.76.1”

# 3. 查看Nginx错误日志
# cat /opt/nginx-app/logs/error.log
2026/04/02 12:00:00 [notice] 1#1: using the “epoll” event method
2026/04/02 12:00:00 [notice] 1#1: nginx/1.25.3
2026/04/02 12:00:00 [notice] 1#1: built by gcc 12.2.0
2026/04/02 12:00:00 [notice] 1#1: OS: Linux 5.14.0-362.el10.x86_64
2026/04/02 12:00:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2026/04/02 12:00:00 [notice] 1#1: start worker processes
2026/04/02 12:00:00 [notice] 1#1: start worker process 7

# 4. 实时查看容器日志
# docker logs -f nginx-web
/docker-entrypoint.sh: /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: /docker-entrypoint.d/20-envsubst-on-templates.sh: Running envsubst on /etc/nginx/templates/default.conf.template
/docker-entrypoint.sh: Launching /usr/sbin/nginx -g ‘daemon off;’
2026/04/02 12:00:00 [notice] 1#1: using the “epoll” event method
2026/04/02 12:00:00 [notice] 1#1: nginx/1.25.3
2026/04/02 12:00:00 [notice] 1#1: built by gcc 12.2.0
2026/04/02 12:00:00 [notice] 1#1: OS: Linux 5.14.0-362.el10.x86_64
2026/04/02 12:00:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2026/04/02 12:00:00 [notice] 1#1: start worker processes
2026/04/02 12:00:00 [notice] 1#1: start worker process 7
192.168.1.100 – – [02/Apr/2026:12:00:00 +0000] “GET / HTTP/1.1” 200 1234 “-” “curl/7.76.1”

Part04-生产环境实战案例

4.1 容器管理脚本

# 1. 创建容器管理脚本
# cat > /opt/scripts/nginx_manage.sh << 'EOF' #!/bin/bash # Nginx容器管理脚本 # 功能:启动、停止、重启、查看Nginx容器 # 作者:fgedu # 日期:2026-04-02 CONTAINER_NAME="nginx-web" IMAGE_NAME="nginx:latest" HTTP_PORT="8080" PROJECT_DIR="/opt/nginx-app" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # 创建分隔线函数 separator() { echo "==========================================" } # 启动容器 start_container() { separator log "启动Nginx容器" separator # 检查容器是否已存在 if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log "容器 ${CONTAINER_NAME} 已存在" # 检查容器是否在运行 if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log "容器 ${CONTAINER_NAME} 已在运行" return 0 else log "启动已存在的容器" docker start "$CONTAINER_NAME" return $? fi fi # 创建新容器 log "创建并启动新容器" docker run -d \ --name "$CONTAINER_NAME" \ -p "${HTTP_PORT}:80" \ -v "${PROJECT_DIR}/html:/usr/share/nginx/html" \ -v "${PROJECT_DIR}/conf/nginx.conf:/etc/nginx/nginx.conf:ro" \ -v "${PROJECT_DIR}/logs:/var/log/nginx" \ -e TZ=Asia/Shanghai \ --restart unless-stopped \ "$IMAGE_NAME" return $? } # 停止容器 stop_container() { separator log "停止Nginx容器" separator # 检查容器是否存在 if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log "容器 ${CONTAINER_NAME} 不存在" return 1 fi # 停止容器 log "停止容器 ${CONTAINER_NAME}" docker stop "$CONTAINER_NAME" return $? } # 重启容器 restart_container() { separator log "重启Nginx容器" separator # 停止容器 stop_container # 等待容器停止 sleep 2 # 启动容器 start_container return $? } # 查看容器状态 status_container() { separator log "Nginx容器状态" separator # 检查容器是否存在 if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log "容器 ${CONTAINER_NAME} 不存在" return 1 fi # 显示容器信息 docker ps -a --filter "name=${CONTAINER_NAME}" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 显示容器日志 separator log "最近10条日志:" docker logs --tail 10 "$CONTAINER_NAME" return 0 } # 查看容器日志 logs_container() { separator log "Nginx容器日志" separator # 检查容器是否存在 if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log "容器 ${CONTAINER_NAME} 不存在" return 1 fi # 显示日志 docker logs "$CONTAINER_NAME" return 0 } # 删除容器 remove_container() { separator log "删除Nginx容器" separator # 检查容器是否存在 if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log "容器 ${CONTAINER_NAME} 不存在" return 1 fi # 停止容器 log "停止容器 ${CONTAINER_NAME}" docker stop "$CONTAINER_NAME" # 删除容器 log "删除容器 ${CONTAINER_NAME}" docker rm "$CONTAINER_NAME" return $? } # 显示帮助信息 show_help() { cat << HELP Nginx容器管理脚本 用法: $0 [选项] 选项: start 启动Nginx容器 stop 停止Nginx容器 restart 重启Nginx容器 status 查看容器状态 logs 查看容器日志 remove 删除容器 help 显示帮助信息 示例: $0 start # 启动容器 $0 stop # 停止容器 $0 restart # 重启容器 $0 status # 查看状态 $0 logs # 查看日志 $0 remove # 删除容器 HELP } # 主函数 main() { case "$1" in start) start_container ;; stop) stop_container ;; restart) restart_container ;; status) status_container ;; logs) logs_container ;; remove) remove_container ;; help|--help|-h) show_help ;; *) echo "错误:未知选项 '$1'" echo "" show_help exit 1 ;; esac } # 执行主函数 main "$@" EOF # 2. 设置脚本执行权限 # chmod +x /opt/scripts/nginx_manage.sh # 3. 测试脚本 # /opt/scripts/nginx_manage.sh status ========================================== Nginx容器状态 ========================================== NAMES STATUS PORTS nginx-web Up 10 minutes 0.0.0.0:8080->80/tcp
==========================================
最近10条日志:
/docker-entrypoint.sh: /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: /docker-entrypoint.d/20-envsubst-on-templates.sh: Running envsubst on /etc/nginx/templates/default.conf.template
/docker-entrypoint.sh: Launching /usr/sbin/nginx -g ‘daemon off;’
2026/04/02 12:00:00 [notice] 1#1: using the “epoll” event method
2026/04/02 12:00:00 [notice] 1#1: nginx/1.25.3
2026/04/02 12:00:00 [notice] 1#1: built by gcc 12.2.0
2026/04/02 12:00:00 [notice] 1#1: OS: Linux 5.14.0-362.el10.x86_64
2026/04/02 12:00:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2026/04/02 12:00:00 [notice] 1#1: start worker processes
2026/04/02 12:00:00 [notice] 1#1: start worker process 7
192.168.1.100 – – [02/Apr/2026:12:00:00 +0000] “GET / HTTP/1.1” 200 1234 “-” “curl/7.76.1”

4.2 配置定时备份

# 1. 创建备份脚本
# cat > /opt/scripts/nginx_backup.sh << 'EOF' #!/bin/bash # Nginx应用备份脚本 # 功能:备份Nginx配置和静态文件 # 作者:fgedu # 日期:2026-04-02 PROJECT_DIR="/opt/nginx-app" BACKUP_DIR="/backup/nginx" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="nginx_backup_${DATE}.tar.gz" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # 创建分隔线函数 separator() { echo "==========================================" } # 开始备份 separator log "开始备份Nginx应用" separator log "项目目录:$PROJECT_DIR" log "备份目录:$BACKUP_DIR" log "备份文件:$BACKUP_FILE" separator # 创建备份目录 mkdir -p "$BACKUP_DIR" # 执行备份 log "正在备份..." tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" -C "$(dirname "$PROJECT_DIR")" "$(basename "$PROJECT_DIR")" # 检查备份是否成功 if [ $? -eq 0 ]; then BACKUP_SIZE=$(du -h "${BACKUP_DIR}/${BACKUP_FILE}" | cut -f1) log "备份成功!文件大小:$BACKUP_SIZE" log "备份文件:${BACKUP_DIR}/${BACKUP_FILE}" else log "备份失败!" exit 1 fi # 清理旧备份(保留最近7天) separator log "清理旧备份..." find "$BACKUP_DIR" -name "nginx_backup_*.tar.gz" -mtime +7 -delete log "清理完成" # 显示备份文件列表 separator log "当前备份文件列表:" ls -lh "$BACKUP_DIR" | grep "nginx_backup_" separator log "备份完成" separator exit 0 EOF # 2. 设置脚本执行权限 # chmod +x /opt/scripts/nginx_backup.sh # 3. 执行备份脚本 # /opt/scripts/nginx_backup.sh ========================================== [2026-04-02 12:01:00] 开始备份Nginx应用 ========================================== [2026-04-02 12:01:00] 项目目录:/opt/nginx-app [2026-04-02 12:01:00] 备份目录:/backup/nginx [2026-04-02 12:01:00] 备份文件:nginx_backup_20260402_120100.tar.gz ========================================== [2026-04-02 12:01:00] 正在备份... [2026-04-02 12:01:00] 备份成功!文件大小:25K [2026-04-02 12:01:00] 备份文件:/backup/nginx/nginx_backup_20260402_120100.tar.gz ========================================== [2026-04-02 12:01:00] 清理旧备份... [2026-04-02 12:01:00] 清理完成 ========================================== [2026-04-02 12:01:00] 当前备份文件列表: -rw-r--r--. 1 root root 25K Apr 2 12:01:00 nginx_backup_20260402_120100.tar.gz ========================================== [2026-04-02 12:01:00] 备份完成 ========================================== # 4. 配置定时备份任务 # crontab -e # 添加以下内容(每天凌晨2点执行备份) 0 2 * * * /opt/scripts/nginx_backup.sh >> /var/log/nginx_backup.log 2>&1

# 5. 查看crontab任务
# crontab -l
0 2 * * * /opt/scripts/nginx_backup.sh >> /var/log/nginx_backup.log 2>&1

Part05-风哥经验总结与分享

5.1 容器化部署最佳实践

风哥经验分享:

  • 数据持久化:使用数据卷或绑定挂载保存重要数据
  • 配置管理:将配置文件外部化,便于修改和管理
  • 日志管理:配置日志驱动,集中管理容器日志
  • 健康检查:配置健康检查,自动重启异常容器
  • 资源限制:设置CPU和内存限制,防止资源耗尽

5.2 安全加固建议

安全加固建议:

  • 最小化镜像:使用Alpine等轻量级基础镜像
  • 非root用户:使用非root用户运行容器
  • 网络隔离:配置容器网络,限制访问
  • 定期更新:定期更新镜像,修复安全漏洞
  • 访问控制:配置防火墙规则,限制端口访问

5.3 性能优化建议

性能优化建议:

  • 使用多阶段构建减小镜像体积
  • 合理设置worker_processes和worker_connections
  • 启用gzip压缩,减少传输数据量
  • 配置缓存策略,提高响应速度
  • 使用CDN加速静态资源访问

5.4 常见问题与解决方案

问题 原因 解决方案
容器无法启动 端口冲突、配置错误 检查端口占用,验证配置
静态文件无法访问 路径映射错误、权限问题 检查路径映射,设置正确权限
配置修改不生效 配置文件只读、未重启 检查配置文件权限,重启容器
日志文件过大 日志未轮转、日志级别过高 配置日志轮转,调整日志级别
风哥总结:
Nginx容器化部署是现代Web应用部署的重要方式,它提供了快速、一致、可扩展的部署方案。在生产环境中,建议结合Docker Compose或Kubernetes等编排工具,实现多容器应用的统一管理。同时,要建立完善的监控和告警机制,确保应用服务的稳定运行。定期备份配置和数据,建立容灾恢复机制,保证业务连续性。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息