网站通栏图片代码,有没有电脑做兼职的网站吗,wordpress慢 数据库6,友汇网站建设管理后台CentOS Stream 9 的 Docker 容器 —— 语法详解与实战案例系统环境#xff1a;CentOS Stream 9 x86_64
Docker 版本#xff1a;26.1#xff08;或 Podman 4.9#xff09;
目标#xff1a;掌握容器化部署核心技能一、云计算与容器概述云计算#xff1a;通过网络提供计算资…CentOS Stream 9 的 Docker 容器 —— 语法详解与实战案例系统环境CentOS Stream 9 x86_64Docker 版本26.1或 Podman 4.9目标掌握容器化部署核心技能一、云计算与容器概述云计算通过网络提供计算资源CPU、内存、存储、网络的服务模式。三种服务模型类型说明示例IaaS基础设施即服务提供虚拟机、存储、网络等基础资源AWS EC2, Azure VMPaaS平台即服务提供开发运行平台含中间件、数据库等Heroku, Google App EngineSaaS软件即服务直接提供应用程序Gmail, Office 365容器技术轻量级虚拟化共享宿主机内核隔离进程、文件系统、网络。容器 vs 虚拟机对比项容器虚拟机启动速度秒级分钟级资源占用极低高需完整 OS隔离性进程级硬件级镜像大小MB 级GB 级适用场景微服务、CI/CD、快速部署完整系统模拟、强隔离需求主流容器技术Docker最流行生态完善企业广泛使用PodmanRed Hat 主推无守护进程rootless 安全兼容 Docker CLIContainerd底层容器运行时K8s 默认使用本章重点Docker Podman 基础 Nginx/MySQL 容器化部署二、Docker 技术详解2.1 Docker 核心概念概念说明镜像Image只读模板包含运行环境和应用程序如 ubuntu:22.04, nginx:latest容器Container镜像的运行实例可启动、停止、删除仓库Registry存储镜像的地方Docker Hub, Harbor, 阿里云镜像仓库Dockerfile定义镜像构建步骤的文本文件docker-compose.yml定义多容器应用的编排文件2.2 Docker 安装CentOS Stream 9✅ 安装 Docker Engine# 卸载旧版本如有sudodnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine# 安装依赖sudodnfinstall-y dnf-plugins-coresudodnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装 Docker Engine、CLI、Containerdsudodnfinstall-y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 启动并设置开机自启sudosystemctl start dockersudosystemctlenabledocker# 验证安装sudodocker run hello-world✅ 将当前用户加入 docker 组免 sudosudousermod-aG docker$USERnewgrp docker# 立即生效组权限或重新登录# 验证无需 sudodocker run hello-world✅ 查看版本docker --version docker info2.3 Docker 常用命令语法详解① 镜像管理# 拉取镜像docker pull nginx:latest# 查看本地镜像docker images# 删除镜像需无容器使用docker rmi nginx:latest# 构建镜像从 Dockerfiledocker build -t myapp:1.0.# 打标签docker tag myapp:1.0 myregistry.com/myapp:1.0# 推送镜像docker push myregistry.com/myapp:1.0② 容器管理# 运行容器前台docker run -it ubuntu:22.04 /bin/bash# 后台运行 端口映射 自动重启 命名docker run -d\--name mynginx\-p8080:80\--restart unless-stopped\nginx:latest# 查看运行中容器dockerps# 查看所有容器含停止的dockerps-a# 查看容器日志docker logs mynginx# 进入运行中的容器dockerexec-it mynginx /bin/bash# 停止容器docker stop mynginx# 启动已停止容器docker start mynginx# 删除容器必须先停止dockerrmmynginx# 强制删除运行中容器dockerrm-f mynginx# 查看容器资源使用docker stats mynginx③ 数据卷与挂载# 挂载主机目录到容器docker run -d\--name mynginx\-v /home/user/html:/usr/share/nginx/html\-p8080:80\nginx:latest# 创建命名数据卷docker volume create myvol# 使用数据卷docker run -d\--name mynginx\-v myvol:/usr/share/nginx/html\nginx:latest# 查看数据卷docker volumelsdocker volume inspect myvol④ 网络管理# 查看网络docker networkls# 创建自定义网络docker network create mynet# 容器加入自定义网络docker run -d\--name mynginx\--network mynet\nginx:latest# 容器间通过容器名通信需在同一网络docker run -it --network mynet alpinepingmynginx2.4 Dockerfile 语法详解带注释✅ 示例构建自定义 Nginx 镜像包含自定义首页# Dockerfile # 基础镜像 FROM nginx:latest # 维护者信息可选 LABEL maintaineradminexample.com # 将本地文件复制到镜像中相对 Dockerfile 路径 COPY index.html /usr/share/nginx/html/ # 暴露端口文档说明实际需 -p 映射 EXPOSE 80 # 启动命令Nginx 默认已设置可省略 # CMD [nginx, -g, daemon off;]✅ 准备 index.html!-- index.html --!DOCTYPEhtmlhtmlheadtitleMy Custom Nginx/title/headbodyh1Hello from Custom Docker Nginx!/h1pDeployed on: % new Date() %/p/body/html✅ 构建并运行# 构建镜像末尾 . 表示当前目录为构建上下文docker build -t my-nginx:1.0.# 运行容器docker run -d --name myweb -p8080:80 my-nginx:1.0# 访问 http://localhost:8080 查看效果✅ Dockerfile 指令速查指令作用示例FROM指定基础镜像FROM ubuntu:22.04LABEL添加元数据LABEL version1.0COPY复制文件到镜像COPY app.py /app/ADD复制自动解压ADD app.tar.gz /app/RUN执行命令构建时RUN apt update apt install -y curlCMD容器启动默认命令CMD [python, app.py]ENTRYPOINT入口点不可被覆盖ENTRYPOINT [./start.sh]EXPOSE声明端口EXPOSE 80ENV设置环境变量ENV DEBUGtrueWORKDIR设置工作目录WORKDIR /appVOLUME声明数据卷VOLUME [/data]2.5 docker-compose.yml 语法详解用于定义和运行多容器应用。✅ 示例同时部署 Nginx MySQL# docker-compose.ymlversion:3.8# Compose 文件版本services:# 定义第一个服务Web 服务器web:image:nginx:latestcontainer_name:my_nginxports:-8080:80# 主机端口:容器端口volumes:-./html:/usr/share/nginx/html# 挂载自定义页面depends_on:-db# 依赖 db 服务启动顺序restart:unless-stopped# 定义第二个服务数据库db:image:mysql:8.0container_name:my_mysqlenvironment:MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:myappMYSQL_USER:appuserMYSQL_PASSWORD:app-passports:-3306:3306volumes:-mysql_data:/var/lib/mysql# 使用命名卷restart:unless-stopped# 定义命名卷全局volumes:mysql_data:✅ 准备自定义页面mkdirhtmlechoh1Welcome to My Docker Site!/h1html/index.html✅ 启动服务# 启动所有服务后台docker-compose up -d# 查看服务状态docker-composeps# 查看日志docker-compose logs web docker-compose logs db# 停止服务docker-compose down# 重建镜像并启动docker-compose up -d --build✅ docker-compose.yml 关键语法字段说明versionCompose 文件格式版本services定义多个容器服务image使用的镜像build指定 Dockerfile 路径替代 imageports端口映射主机:容器volumes数据卷挂载主机路径:容器路径或命名卷:容器路径environment设置环境变量depends_on启动依赖顺序restart重启策略no, always, unless-stoppedvolumes根定义命名卷三、Podman 技术详解PodmanRed Hat 开发Docker CLI 兼容无守护进程支持 rootless更安全。✅ 安装 PodmanCentOS Stream 9 默认已安装# 查看是否已安装podman --version# 若未安装sudodnfinstall-y podman# 验证podman run hello-world✅ Podman 与 Docker 命令对比DockerPodman说明docker runpodman run完全兼容docker pspodman psdocker buildpodman builddocker-composepodman-compose需单独安装✅ 安装 podman-composesudodnfinstall-y python3-pip pip3installpodman-compose✅ 使用示例与 Docker 几乎一致# 拉取镜像podman pull nginx:latest# 运行容器podman run -d --name mypodnginx -p8081:80 nginx:latest# 查看容器podmanps# 查看镜像podman images# 无守护进程直接管理容器进程更轻量安全✅ Rootless 模式推荐# 普通用户直接运行无需 sudopodman run -d --name rootless-nginx -p8082:80 nginx:latest# 查看用户级容器podmanps-a# 用户级镜像存储在 ~/.local/share/containers/✅ 与 Docker 互操作# 导出 Docker 镜像为 tardocker save nginx:latestnginx.tar# Podman 加载podman load -i nginx.tar# 导出 Podman 镜像podman save nginx:latest -o nginx-podman.tar✅ Podman 优势无 daemon更安全资源占用少支持 rootless普通用户可运行容器与 systemd 集成好podman generate systemd兼容 Docker CLI 和镜像格式四、综合案例1Nginx 容器部署4.1 案例概述使用 Docker 部署 Nginx Web 服务器支持自定义页面、端口映射、数据卷挂载、自动重启。适用场景快速搭建静态网站、反向代理、负载均衡测试环境。4.2 案例详解✅ 方法一直接运行官方镜像快速测试# 后台运行映射端口设置重启策略docker run -d\--name webserver\-p8080:80\--restart unless-stopped\nginx:latest# 验证访问curlhttp://localhost:8080# 应返回默认 Nginx 欢迎页✅ 方法二自定义页面 数据卷挂载生产推荐# 创建本地目录存放自定义页面mkdir-p ~/myweb/htmlechoh1My Docker Nginx Site/h1~/myweb/html/index.html# 运行容器并挂载目录docker run -d\--name myweb\-p8080:80\-v ~/myweb/html:/usr/share/nginx/html:ro\# ro只读安全--restart unless-stopped\nginx:latest# 验证自定义页面curlhttp://localhost:8080# 输出My Docker Nginx Site✅ 方法三使用 Dockerfile 构建自定义镜像# Dockerfile.custom FROM nginx:alpine # 更小体积 # 删除默认欢迎页 RUN rm -f /usr/share/nginx/html/* # 复制自定义页面 COPY ./html/ /usr/share/nginx/html/ # 暴露端口 EXPOSE 80 # 使用默认启动命令✅ 构建并运行# 目录结构# .# ├── Dockerfile.custom# └── html/# └── index.htmldocker build -t my-nginx-custom:1.0 -f Dockerfile.custom.docker run -d --name custom-web -p8080:80 my-nginx-custom:1.0✅ 方法四使用 docker-compose 编排推荐用于多服务# docker-compose-nginx.ymlversion:3.8services:nginx:image:nginx:latestcontainer_name:prod_nginxports:-80:80volumes:-./html:/usr/share/nginx/html:ro-./nginx.conf:/etc/nginx/nginx.conf:ro# 可选自定义配置restart:alwaysnetworks:-webnetnetworks:webnet:driver:bridge✅ 启动docker-compose -f docker-compose-nginx.yml up -d五、综合案例2MySQL 容器部署5.1 案例概述使用 Docker 部署 MySQL 8.0 数据库设置 root 密码、创建数据库和用户持久化数据卷支持远程连接。适用场景开发测试数据库、微服务后端存储。5.2 案例详解✅ 基础运行不推荐生产docker run -d\--name mysql_db\-p3306:3306\-eMYSQL_ROOT_PASSWORDsecret123\mysql:8.0# 进入容器测试dockerexec-it mysql_db mysql -uroot -p# 输入密码 secret123✅ 生产级部署推荐# 创建数据卷持久化docker volume create mysql_data# 创建配置目录mkdir-p ~/mysql/confmkdir-p ~/mysql/init# 创建初始化 SQL 脚本可选cat~/mysql/init/init.sqlEOF CREATE DATABASE IF NOT EXISTS myapp; CREATE USER appuser% IDENTIFIED BY AppPass123!; GRANT ALL PRIVILEGES ON myapp.* TO appuser%; FLUSH PRIVILEGES; EOF# 运行 MySQL 容器docker run -d\--name mysql_prod\-p3306:3306\-eMYSQL_ROOT_PASSWORDRootPass456!\-eMYSQL_DATABASEmyapp\-eMYSQL_USERappuser\-eMYSQL_PASSWORDAppPass123!\-v mysql_data:/var/lib/mysql\-v ~/mysql/conf:/etc/mysql/conf.d\-v ~/mysql/init:/docker-entrypoint-initdb.d\--restart unless-stopped\mysql:8.0\--character-set-serverutf8mb4\--collation-serverutf8mb4_unicode_ci# 验证数据库dockerexec-it mysql_prod mysql -uappuser -pAppPass123!-eSHOW DATABASES;✅ 关键参数说明-e MYSQL_ROOT_PASSWORD设置 root 密码必需-e MYSQL_DATABASE自动创建数据库-e MYSQL_USER / MYSQL_PASSWORD创建用户并授权-v ~/mysql/init:/docker-entrypoint-initdb.d容器首次启动时执行 SQL 脚本--character-set-serverutf8mb4设置默认字符集✅ 自定义 MySQL 配置my.cnf# ~/mysql/conf/custom.cnf [mysqld] max_connections200 innodb_buffer_pool_size256M log-error/var/log/mysql/error.log slow_query_log1 slow_query_log_file/var/log/mysql/slow.log long_query_time2✅ 使用 docker-compose 部署 MySQL推荐# docker-compose-mysql.ymlversion:3.8services:mysql:image:mysql:8.0container_name:mysql_serverports:-3306:3306environment:MYSQL_ROOT_PASSWORD:RootPass456!MYSQL_DATABASE:myappMYSQL_USER:appuserMYSQL_PASSWORD:AppPass123!volumes:-mysql_data:/var/lib/mysql-./mysql/conf:/etc/mysql/conf.d-./mysql/init:/docker-entrypoint-initdb.dcommand:---character-set-serverutf8mb4---collation-serverutf8mb4_unicode_cirestart:unless-stoppedvolumes:mysql_data:✅ 启动mkdir-p mysql/conf mysql/init# 放入 custom.cnf 和 init.sqldocker-compose -f docker-compose-mysql.yml up -d六、综合性案例LNMP 环境一键部署Linux Nginx MySQL PHP 容器化一键部署✅ 目录结构lnmp-project/ ├── docker-compose.yml ├── nginx/ │ ├── Dockerfile │ └── default.conf ├── php/ │ └── Dockerfile └── html/ └── index.php6.1 编写 Dockerfile✅nginx/DockerfileFROM nginx:alpine COPY default.conf /etc/nginx/conf.d/default.conf EXPOSE 80✅nginx/default.confserver { listen 80; server_name localhost; root /var/www/html; index index.php index.html; location ~ \.php$ { fastcgi_pass php:9000; # 转发到 php 服务 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }✅php/DockerfileFROM php:8.2-fpm-alpine RUN docker-php-ext-install mysqli pdo pdo_mysql WORKDIR /var/www/html✅html/index.php?phpechoh1Welcome to LNMP Docker!/h1;phpinfo();?6.2 编写 docker-compose.yml# docker-compose.ymlversion:3.8services:nginx:build:./nginxports:-80:80volumes:-./html:/var/www/html:rodepends_on:-phprestart:unless-stoppedphp:build:./phpvolumes:-./html:/var/www/htmlrestart:unless-stoppedmysql:image:mysql:8.0environment:MYSQL_ROOT_PASSWORD:secretMYSQL_DATABASE:testdbvolumes:-mysql_data:/var/lib/mysqlrestart:unless-stoppedvolumes:mysql_data:6.3 一键部署cdlnmp-project docker-compose up -d --build# 访问 http://localhost# 应显示 PHP 信息页面✅ 验证 PHP 连接 MySQL修改 index.php?php$hostmysql;$dbtestdb;$userroot;$passsecret;$charsetutf8mb4;$dsnmysql:host$host;dbname$db;charset$charset;$options[PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODEPDO::FETCH_ASSOC,PDO::ATTR_EMULATE_PREPARESfalse,];try{$pdonewPDO($dsn,$user,$pass,$options);echoh1 LNMP 部署成功/h1;echop✅ 数据库连接成功/p;}catch(\PDOException$e){thrownew\PDOException($e-getMessage(),(int)$e-getCode());}?✅ Docker/Podman 最佳实践使用 .dockerignore避免上传无用文件加速构建多阶段构建减小镜像体积非 root 用户运行提升安全性健康检查HEALTHCHECK指令资源限制--memory,--cpus日志驱动--log-driverjson-file --log-opt max-size10m定期清理docker system prune -a使用 Podman生产环境推荐更安全轻量 附录常用命令速查表功能Docker 命令Podman 命令拉取镜像docker pull nginxpodman pull nginx列出镜像docker imagespodman images运行容器docker run -d --name web -p 80:80 nginxpodman run -d --name web -p 80:80 nginx列出容器docker pspodman ps查看日志docker logs webpodman logs web进入容器docker exec -it web /bin/bashpodman exec -it web /bin/bash构建镜像docker build -t myapp .podman build -t myapp .启动编排docker-compose up -dpodman-compose up -d清理系统docker system prune -apodman system prune -a 综合项目扩展建议部署 WordPressNginx PHP MySQL phpMyAdmin搭建私有镜像仓库registry:2 Nginx HTTPS 代理CI/CD 集成Jenkins Docker 自动构建部署监控容器cAdvisor Prometheus Grafana容器安全扫描Trivy / Clair 扫描镜像漏洞迁移到 Podman将现有 Docker 项目无缝迁移至 Podman这份文档覆盖了 CentOS Stream 9 上容器技术的全部核心知识点 语法细节 配置说明 实用案例 综合项目所有命令和代码均含详细注释可直接用于教学、自学或生产环境参考。