1. 环境准备与Docker安装在openEuler 24 LTS上部署DockerNginx容器化Web服务首先需要确保系统环境准备就绪。我建议先更新系统软件包到最新版本这个步骤虽然简单但很重要能避免很多潜在的兼容性问题。执行以下命令sudo dnf update -y更新完成后就可以开始安装Docker了。openEuler官方仓库中已经包含了Docker软件包直接使用dnf命令安装非常方便sudo dnf install docker -y安装完成后我们需要启动Docker服务并设置开机自启。这里有个小技巧启动服务后最好等待几秒钟再检查状态因为服务启动需要一点时间sudo systemctl start docker sudo systemctl enable docker # 等待3秒后检查状态 sudo systemctl status docker验证安装是否成功时我习惯用两个命令查看版本号和运行一个测试容器。如果看到类似Docker version 24.0.7的输出并且测试容器能正常运行说明安装已经成功docker --version docker run hello-world注意如果遇到权限问题记得将当前用户加入docker组sudo usermod -aG docker $USER然后退出重新登录生效。2. Docker镜像加速与Nginx拉取国内用户直接拉取Docker官方镜像可能会很慢我推荐配置镜像加速器。华为云SWR镜像仓库对openEuler有很好的支持配置方法如下sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://swr.cn-south-1.myhuaweicloud.com] } EOF sudo systemctl restart docker配置完成后就可以拉取Nginx镜像了。我建议使用官方最新稳定版同时也可以查看有哪些可用版本docker pull nginx:stable # 查看已下载的镜像 docker images如果遇到镜像拉取失败可能是网络问题。我通常会先用curl测试镜像仓库的连通性curl -v https://swr.cn-south-1.myhuaweicloud.com/v2/提示镜像拉取成功后可以用docker inspect nginx:stable查看镜像详情了解它的工作目录和默认配置。3. Nginx容器部署与配置基础Nginx容器运行很简单但实际部署时需要更多配置。我推荐使用以下命令启动容器同时映射端口和挂载配置文件mkdir -p ~/nginx/{conf,html,logs} docker run -d --name my_nginx \ -p 8080:80 \ -v ~/nginx/conf:/etc/nginx/conf.d \ -v ~/nginx/html:/usr/share/nginx/html \ -v ~/nginx/logs:/var/log/nginx \ nginx:stable这个命令做了几件事将容器80端口映射到主机8080端口挂载自定义配置目录可以放置多个server配置挂载网站根目录挂载日志目录方便查看创建测试页面验证部署是否成功echo h1openEuler Nginx Test Page/h1 ~/nginx/html/index.html然后通过浏览器访问http://服务器IP:8080应该能看到测试页面。如果想修改Nginx配置可以直接编辑~/nginx/conf目录下的文件然后重启容器docker restart my_nginx4. 常见问题排查与优化部署过程中可能会遇到各种问题我总结了几种常见情况及解决方法端口冲突问题如果8080端口已被占用会看到类似Bind for 0.0.0.0:8080 failed的错误。解决方法要么是停止占用端口的服务要么改用其他端口# 查看端口占用情况 sudo netstat -tulnp | grep 8080 # 或者改用8081端口 docker run -p 8081:80 ...权限问题容器内Nginx默认以nginx用户运行可能导致挂载目录无写权限。有两种解决方法修改目录权限chmod -R 777 ~/nginx或者强制容器以root运行不推荐生产环境使用docker run --user root ...性能优化建议对于生产环境建议使用Nginx的优化配置模板启用Gzip压缩可以显著减少传输数据量配置适当的缓存策略提升用户体验# 示例优化配置片段 gzip on; gzip_types text/plain text/css application/json; client_max_body_size 20m; keepalive_timeout 65;日志查看技巧当容器运行异常时查看日志是最直接的排查方法# 查看实时日志 docker logs -f my_nginx # 查看最近100行日志 docker logs --tail 100 my_nginx # 结合grep过滤错误日志 docker logs my_nginx | grep error5. 进阶部署与持久化方案基础部署完成后可以考虑更专业的部署方案。我分享一个生产环境常用的多站点配置方法首先准备目录结构mkdir -p ~/nginx/sites/{site1,site2}然后为每个站点创建独立的配置文件cat ~/nginx/conf/site1.conf EOF server { listen 80; server_name site1.example.com; root /usr/share/nginx/html/site1; index index.html; } EOF启动容器时挂载所有站点目录docker run -d --name nginx_prod \ -p 80:80 -p 443:443 \ -v ~/nginx/conf:/etc/nginx/conf.d \ -v ~/nginx/sites:/usr/share/nginx/html \ -v ~/nginx/certs:/etc/nginx/certs \ nginx:stable对于数据库等有状态服务建议使用Docker卷实现数据持久化# 创建管理卷 docker volume create nginx_data # 使用卷启动容器 docker run -v nginx_data:/data ...6. 容器编排与自动化部署当需要管理多个容器时使用Docker Compose可以大大简化工作。首先安装Composesudo dnf install docker-compose-plugin然后创建docker-compose.yml文件version: 3 services: web: image: nginx:stable ports: - 8080:80 volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/html:/usr/share/nginx/html restart: unless-stopped启动服务只需要一条命令docker compose up -d对于更复杂的生产环境可以考虑使用CI/CD流水线自动化部署配置健康检查确保服务可用性设置资源限制防止单个容器占用过多资源# 示例健康检查配置 healthcheck: test: [CMD, curl, -f, http://localhost] interval: 30s timeout: 10s retries: 37. 安全加固与监控容器安全不容忽视我通常会做这些加固措施定期更新镜像获取安全补丁docker pull nginx:stable docker stop my_nginx docker rm my_nginx # 然后用新镜像重新启动容器使用非root用户运行容器FROM nginx:stable USER nginx配置适当的防火墙规则sudo firewall-cmd --permanent --add-port8080/tcp sudo firewall-cmd --reload监控容器资源使用情况# 查看实时资源占用 docker stats # 查看详细资源使用情况 docker container inspect --format{{.Id}} {{.Name}} {{.HostConfig.Memory}} $(docker ps -aq)对于Web应用防火墙(WAF)需求可以考虑使用ModSecurity等模块docker run -d --name nginx_waf \ -e USE_MODSECURITY1 \ -p 8081:80 \ nginx:stable8. 实际项目经验分享在最近的一个电商项目部署中我们遇到了高并发下的性能问题。通过以下优化显著提升了性能调整Nginx worker进程数匹配主机CPU核心数启用HTTP/2协议配置OCSP Stapling减少SSL握手时间使用Brotli压缩替代Gzip# 性能优化配置示例 worker_processes auto; http2 on; ssl_stapling on; ssl_stapling_verify on; brotli on; brotli_types text/plain text/css application/json;另一个常见问题是容器日志占用过多磁盘空间。我们通过配置日志轮转解决# 全局日志配置 docker run --log-opt max-size10m --log-opt max-file3 ...对于需要频繁更新的网站我建议使用rsync同步本地开发目录到容器rsync -avz --delete ./local/path/ userserver:~/nginx/html/