phpmysql网站开发全程实例 第2版wordpress您的密码重设链接无效
phpmysql网站开发全程实例 第2版,wordpress您的密码重设链接无效,文化网站源码,青岛网站快速备案1. 环境准备#xff1a;认清你的战场#xff0c;别被“官方适配”忽悠了
兄弟们#xff0c;搞国产化环境部署#xff0c;尤其是鲲鹏银河麒麟v10这个组合#xff0c;第一步千万别急着敲命令。我踩过最大的坑#xff0c;就是轻信了“官方适配”这四个字。很多文档会说银河麒…1. 环境准备认清你的战场别被“官方适配”忽悠了兄弟们搞国产化环境部署尤其是鲲鹏银河麒麟v10这个组合第一步千万别急着敲命令。我踩过最大的坑就是轻信了“官方适配”这四个字。很多文档会说银河麒麟基于某个主流发行版比如CentOS或者Ubuntu让你直接去配对应的源。听起来很美好对吧但实操下来十有八九会掉进依赖地狱。为什么因为架构差异。我们常用的x86_64也叫amd64和鲲鹏920芯片用的aarch64ARM64完全是两套不同的指令集。这就好比一个是汽油车一个是电动车虽然都能跑但发动机CPU和加油/充电方式软件包完全不一样。很多软件仓库尤其是老版本的默认只提供x86_64的包。你兴冲冲地给银河麒麟v10配了个CentOS 7的源yum makecache可能没问题但一到yum install就会报一堆“没有可用包”或者“架构不匹配”的错误根本原因就在这里。我实测下来银河麒麟v10服务器版的底层用户态环境确实和CentOS 8的aarch64版本兼容性最好。但注意是兼容性最好不是完全一样。直接使用CentOS 8的官方源依然会遇到依赖冲突因为麒麟系统自己定制了一些基础库版本可能和CentOS 8仓库里的对不上。这就是为什么很多朋友照着网上的CentOS教程装Docker总是卡在某个诡异的依赖错误上比如containerd.io版本冲突、libseccomp不满足要求等等。所以在动手前我们先得摸清自家系统的底细。打开终端老老实实执行下面几个命令# 1. 确认操作系统版本 cat /etc/kylin-release # 预期输出类似Kylin Linux Advanced Server release V10 (Tercel) # 2. 确认系统架构 uname -p # 对于鲲鹏机器这里必须显示 aarch64。如果是x86_64那本文的很多步骤对你可能不适用。 # 3. 确认内核版本 uname -r # Docker要求内核3.10以上银河麒麟v10默认满足这里通常是4.x的内核。 # 4. 检查关键工具 iptables --version # 需要1.4以上版本用于容器网络管理。 systemctl --version # 确认systemd存在这是后续配置服务的基础。把这些信息记下来。尤其是aarch64这个架构标识它会贯穿我们整个离线部署过程。我们的核心思路就是既然在线源依赖关系复杂容易出错那我们就绕过包管理器直接使用官方编译好的、针对aarch64架构的Docker静态二进制包。这个方法干净利落不依赖系统仓库里那些可能版本不对的库是从根源上避开依赖陷阱的“野路子”但实测非常有效。2. 彻底清理给系统一个干净的起点在部署新版本之前如果系统里存在任何旧版本的Docker或者残留的配置必须清理干净。不然新旧文件混在一起权限冲突、服务启动失败这些问题会把你搞得晕头转向。我遇到过好几次docker命令执行没反应或者dockerd启动报错追根溯源都是旧文件没删干净。首先尝试用系统自带的包管理器卸载。虽然我们可能不用它来安装但用它来清理是个好习惯。sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine执行这个命令后yum会列出将要移除的包。注意看如果它提示“没有匹配的包”那是正常的说明系统之前没有通过yum安装过Docker。如果有就确认移除。但是包管理器卸载并不彻底。它只删除了通过yum安装的那些包文件而Docker在运行过程中会产生大量的数据文件、配置文件、镜像和容器存储目录。这些都需要我们手动清理。我们来个“大扫除”# 删除Docker相关的本地文件路径可能因系统而异下面是最常见的 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd # 删除可能存在的旧配置文件 sudo rm -f /etc/docker/daemon.json sudo rm -f /usr/lib/systemd/system/docker.service sudo rm -f /usr/lib/systemd/system/docker.socket # 删除旧版本的二进制文件如果之前是手动安装的 sudo rm -f /usr/bin/docker sudo rm -f /usr/bin/dockerd sudo rm -f /usr/bin/docker-init sudo rm -f /usr/bin/docker-proxy sudo rm -f /usr/bin/containerd sudo rm -f /usr/bin/containerd-shim sudo rm -f /usr/bin/containerd-shim-runc-v2 sudo rm -f /usr/bin/runc # 可以使用 which docker 等命令先查看具体位置再删除清理完成后我建议重启一下系统。这不是必须的但能确保所有残留的进程和内存状态都被清空让我们在一个绝对干净的环境里开始。重启后再执行一下docker version如果提示“命令未找到”那就对了说明旧环境已经彻底拜拜了。3. 核心实战手动部署Docker静态二进制包这是整个过程中最核心、也最体现“绕过依赖陷阱”思想的一步。我们不去折腾yum和dnf直接去Docker官方获取为aarch64架构预编译好的静态二进制文件。所谓“静态”就是指这个可执行文件已经把运行所需的大部分基础库都打包进去了对操作系统的依赖降到最低非常适合我们这种离线且环境特殊的场景。3.1 获取正确的二进制包首先你需要一个有网络的环境比如另一台能上网的电脑来下载文件。打开Docker官方提供的静态二进制包下载地址https://download.docker.com/linux/static/stable/aarch64/。你会看到一个文件列表里面有很多版本。版本选择有讲究。不是越新越好尤其是生产环境。太新的版本可能稳定性有待考验而且其依赖的容器运行时如containerd版本可能和后续你要用的其他工具比如Kubernetes有兼容性问题。我个人的经验是选择一个次新的、长期支持LTS的版本。比如在我写这篇文章的时候20.10.x系列是一个比较稳定成熟的选择。你可以根据实际情况调整。假设我们选择docker-20.10.24.tgz那么在能上网的机器上执行wget https://download.docker.com/linux/static/stable/aarch64/docker-20.10.24.tgz下载完成后将这个docker-20.10.24.tgz文件通过U盘、内网SCP/FTP或者其他任何方式传输到你的离线鲲鹏服务器上。假设你放到了/root目录下。3.2 解压与部署现在回到你的离线鲲鹏服务器终端开始操作# 1. 进入压缩包所在目录 cd /root # 2. 解压压缩包 tar -zxvf docker-20.10.24.tgz # 解压后会得到一个名为 docker 的目录 # 3. 查看解压出的文件 ls docker/ # 你应该会看到一堆可执行文件包括 docker, dockerd, containerd, runc 等核心组件。 # 4. 将这些二进制文件复制到系统的可执行路径下 sudo cp docker/* /usr/bin/这一步非常关键。/usr/bin是系统默认的可执行文件搜索路径。把这些文件放在这里以后我们就可以直接在命令行里输入docker、dockerd等命令来使用了。3.3 初步测试Docker守护进程在配置成系统服务之前我们先手动测试一下核心的Docker引擎dockerd能不能跑起来。# 使用sudo权限直接在前台启动dockerd sudo dockerd如果一切顺利你会看到一大串日志输出最后几行应该是API listen on /var/run/docker.sock之类的说明Docker守护进程已经成功启动并在监听请求了。这时先按 CtrlC 停止它。如果启动失败常见的错误和排查思路如下错误信息包含iptables或nf_tables可能是系统防火墙规则模块冲突。可以尝试更新iptables或者使用--iptablesfalse参数启动不推荐长期使用。银河麒麟v10自带的版本一般没问题。错误信息关于cgroup检查/sys/fs/cgroup目录是否存在且已挂载。可以尝试在dockerd命令后加上--exec-opt native.cgroupdriversystemd。权限错误确保你是用sudo执行的或者当前用户在docker组里但我们现在还没创建这个组。手动测试通过证明二进制包本身在你这台鲲鹏麒麟v10的机器上是能工作的这给了我们巨大的信心。接下来我们要把它做成一个系统服务让它能开机自启、方便管理。4. 集成systemd让Docker乖乖变成系统服务让dockerd一直在前台运行显然不现实。我们需要systemd来管理它这是目前Linux系统服务管理的标准。通过systemd我们可以用systemctl start/stop/restart docker这样的命令来优雅地控制Docker还能设置开机自启。4.1 创建Docker服务单元文件首先为Docker创建一个systemd服务配置文件。sudo vi /usr/lib/systemd/system/docker.service将以下内容完整地粘贴进去。这个配置是我根据官方文档和多次实战调整过的适配我们这种二进制部署方式特别是注意到了aarch64环境下的一些路径细节。[Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service containerd.service Wantsnetwork-online.target Requiresdocker.socket [Service] Typenotify # 重点这里的ExecStart路径就是我们刚才复制二进制文件的路径 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways # 注意安全设置根据你的安全要求调整 StartLimitBurst3 StartLimitInterval60s # 设置进程的权限和资源限制 LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity # 设置任务最大数量如果不设置默认值是 512不设置可能会导致无法启动 TasksMaxinfinity # 以非root用户运行时的相关设置如果以root运行可忽略 # Userdocker # Groupdocker # 挂载路径 MountFlagsprivate # 内核内存限制某些场景下需要 # OOMScoreAdjust-500 # 设置环境变量 EnvironmentFile-/etc/default/docker [Install] WantedBymulti-user.target关键点解释After... containerd.service: 我们手动部署的二进制包里包含了containerd但这里我们假设它由Docker自己启动。如果你遇到containerd相关问题可能需要单独为containerd也配置服务文件但大多数情况下Docker能管理好它。ExecStart: 指定dockerd的启动命令。-H fd://表示使用套接字激活配合下面的.socket文件。--containerd...指定了containerd的通信套接字位置。Typenotify: 让dockerd在启动完成后主动通知systemd这样systemd能准确知道服务状态。Restartalways: 服务意外退出时自动重启增强稳定性。4.2 创建Socket激活文件可选但推荐为了更好的按需启动和安全性我们配置一个socket文件。sudo vi /usr/lib/systemd/system/docker.socket粘贴以下内容[Unit] DescriptionDocker Socket for the API PartOfdocker.service [Socket] ListenStream/var/run/docker.sock SocketMode0660 SocketUserroot SocketGroupdocker [Install] WantedBysockets.target这个文件定义了Docker守护进程监听的Unix套接字。当有客户端如docker命令连接这个套接字时systemd才会自动启动docker.service实现按需启动。4.3 配置Docker守护进程选项接下来创建Docker的配置文件daemon.json这里可以设置很多运行时参数比如镜像加速器。sudo vi /etc/docker/daemon.json对于离线环境配置可以相对简单但一个关键设置是关于日志驱动的避免日志撑爆磁盘{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, storage-driver: overlay2 }如果你的机器未来有可能连接网络并且希望拉取镜像快一些可以预先配置国内镜像加速器虽然现在离线用不上但配置了没坏处{ registry-mirrors: [https://your-mirror.mirror.aliyuncs.com], log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, storage-driver: overlay2 }注意将https://your-mirror.mirror.aliyuncs.com替换为你实际获取的加速器地址例如阿里云、腾讯云等容器镜像服务提供的地址。4.4 创建docker用户组并设置权限为了能让非root用户使用docker命令这更安全方便我们需要创建一个docker用户组并把相应用户加进去。# 创建docker组 sudo groupadd docker # 将当前用户加入docker组 sudo usermod -aG docker $USER # 或者将特定用户如kylin加入docker组 # sudo usermod -aG docker kylin非常重要修改用户组后需要完全注销当前会话然后重新登录或者新开一个终端组权限变更才会生效。否则你还会遇到“权限被拒绝”的错误。4.5 启动并验证服务所有配置完成后让systemd重新加载配置然后启动服务。# 重新加载systemd配置使其识别新的服务文件 sudo systemctl daemon-reload # 启动docker服务 sudo systemctl start docker # 设置docker服务开机自启 sudo systemctl enable docker # 查看docker服务状态 sudo systemctl status docker运行status命令后你希望看到绿色的“active (running)”字样。如果状态是失败的红色可以用sudo journalctl -u docker --since 5 minutes ago来查看详细的日志根据错误信息进行排查。最后进行功能验证# 验证客户端和服务端版本 docker version # 运行一个最简单的测试容器 docker run --rm hello-world如果docker version能正确显示Client和Server的版本信息并且hello-world容器能成功运行并输出一段欢迎信息那么恭喜你你已经成功在完全离线的鲲鹏银河麒麟v10环境中绕过了所有依赖陷阱部署好了Docker。5. 避坑指南与进阶配置走到这一步Docker已经可用了。但要想在生产环境用得顺手还有一些坑要提前知道有些配置可以优化。5.1 离线环境下的镜像管理离线环境最大的痛点就是镜像。你没法直接docker pull。通常的做法是在一台有网的、架构相同的机器上比如另一台x86机器或者另一台能联网的鲲鹏机器先拉取需要的镜像然后导出为文件再传输到离线服务器加载。# 在有网机器上操作 docker pull nginx:alpine docker save -o nginx_alpine.tar nginx:alpine # 然后将 nginx_alpine.tar 文件拷贝到离线服务器 # 在离线服务器上操作 docker load -i nginx_alpine.tar docker images # 确认镜像已加载对于需要部署多个镜像的复杂应用建议使用docker save一次性导出多个镜像或者使用docker-compose配合预先导出的镜像包。5.2 存储驱动与磁盘空间默认的overlay2存储驱动在银河麒麟v10上通常工作良好。但你需要关注/var/lib/docker目录的磁盘使用情况这是Docker存放镜像、容器、卷数据的地方。定期清理无用的镜像和容器是必要的# 删除所有已停止的容器 docker container prune -f # 删除所有未被使用的镜像谨慎操作确保都没用了 docker image prune -a -f # 查看磁盘使用情况 docker system df5.3 防火墙与SELinux银河麒麟v10默认可能启用了防火墙firewalld和SELinux。Docker需要与它们协作。Firewalld: Docker服务启动时会自动创建所需的防火墙规则docker0网桥、容器网络等。如果你自定义了防火墙区域或规则可能需要手动放行相关端口。一般情况不用动。SELinux: 如果SELinux处于Enforcing模式可能会阻止Docker的一些操作。对于初学者或测试环境可以临时将其设置为Permissive模式观察是否解决问题sudo setenforce 0 # 临时设置为Permissive sudo getenforce # 查看当前模式永久修改需要编辑/etc/selinux/config文件将SELINUXenforcing改为SELINUXpermissive然后重启。生产环境请谨慎评估SELinux策略不建议直接关闭。5.4 内核参数调优对于高负载的容器环境可能需要对系统内核参数进行调整。可以创建或修改/etc/sysctl.d/docker.conf文件加入如下内容# 增加网络连接跟踪表大小 net.netfilter.nf_conntrack_max 262144 # 允许转发容器网络必需 net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 # 调整虚拟内存分配策略有助于性能 vm.swappiness 0 vm.overcommit_memory 1修改后执行sudo sysctl -p /etc/sysctl.d/docker.conf使其生效。最后记得重新登录终端或者执行newgrp docker命令让你刚刚加入的docker用户组生效。之后你就可以不用sudo直接使用docker命令了。整个过程从迷茫到清晰核心就是认清架构差异放弃对系统包管理器的幻想拥抱静态二进制部署。这条路在国产化离线环境中往往比折腾源和依赖要靠谱得多。