@@ -55,6 +55,15 @@ init_messages_en() {
5555 [service_started]=" Docker service started"
5656 [service_start_failed]=" Docker service failed to start, checking logs..."
5757 [service_start_tip]=" Tip: Try starting manually with: sudo dockerd &"
58+ [kernel_reboot_hint]=" A newer kernel (%s) is installed but not running (current: %s). Reboot to load the new kernel and its modules, then Docker should start normally."
59+ [reboot_command]=" Run: reboot"
60+ [removing_conflicts]=" Removing conflicting packages (podman, buildah, etc.)..."
61+ [conflicts_removed]=" Conflicting packages removed"
62+ [installing_kernel_modules]=" Installing kernel-modules-extra (required for Docker networking on EL10+)..."
63+ [kernel_modules_installed]=" kernel-modules-extra installed"
64+ [loading_kernel_modules]=" Loading required kernel modules..."
65+ [kernel_modules_loaded]=" Kernel modules loaded and persisted"
66+ [kernel_modules_load_failed]=" Failed to load kernel modules (may need reboot for new kernel)"
5867 [configuring_mirror]=" Configuring mirror acceleration..."
5968 [backup_ok]=" Existing config backed up"
6069 [no_dns_added]=" No DNS configured, added Docker DNS automatically"
@@ -174,6 +183,15 @@ init_messages_zh() {
174183 [service_started]=" Docker 服务启动成功"
175184 [service_start_failed]=" Docker 服务启动失败,尝试查看日志..."
176185 [service_start_tip]=" 可尝试手动启动: sudo dockerd &"
186+ [kernel_reboot_hint]=" 检测到已安装新内核 (%s) 但当前运行的是旧内核 (%s)。请重启服务器以加载新内核及其模块,之后 Docker 应可正常启动。"
187+ [reboot_command]=" 执行: reboot"
188+ [removing_conflicts]=" 正在移除冲突的软件包 (podman, buildah 等)..."
189+ [conflicts_removed]=" 冲突软件包已移除"
190+ [installing_kernel_modules]=" 正在安装 kernel-modules-extra(EL10+ Docker 网络所需)..."
191+ [kernel_modules_installed]=" kernel-modules-extra 已安装"
192+ [loading_kernel_modules]=" 正在加载所需内核模块..."
193+ [kernel_modules_loaded]=" 内核模块已加载并持久化"
194+ [kernel_modules_load_failed]=" 内核模块加载失败(可能需要重启以使用新内核)"
177195 [configuring_mirror]=" 配置镜像加速..."
178196 [backup_ok]=" 已备份现有配置"
179197 [no_dns_added]=" 系统未配置 DNS,已自动添加 Docker DNS"
@@ -358,6 +376,27 @@ setup_sudo() {
358376 fi
359377}
360378
379+ # Check if a newer kernel is installed but not yet running
380+ # If so, a reboot is likely needed for Docker to work (missing kernel modules)
381+ check_kernel_reboot_needed () {
382+ local running_kernel newest_kernel
383+ running_kernel=$( uname -r)
384+
385+ # Get list of installed kernels sorted by version, pick the newest
386+ if command -v rpm & > /dev/null; then
387+ newest_kernel=$( rpm -q kernel-core --qf ' %{VERSION}-%{RELEASE}.%{ARCH}\n' 2> /dev/null | sort -V | tail -1)
388+ elif command -v dpkg & > /dev/null; then
389+ newest_kernel=$( dpkg -l ' linux-image-*' 2> /dev/null | awk ' /^ii/{print $2}' | sed ' s/linux-image-//' | sort -V | tail -1)
390+ fi
391+
392+ if [[ -n " $newest_kernel " && " $newest_kernel " != " $running_kernel " ]]; then
393+ echo " "
394+ msg kernel_reboot_hint " $newest_kernel " " $running_kernel "
395+ msg reboot_command
396+ echo " "
397+ fi
398+ }
399+
361400# Clean up temp files on exit
362401cleanup () {
363402 rm -f /tmp/docker.tgz /tmp/docker-ce-install.log /tmp/docker-ce-install-retry.log /tmp/docker-ce-install-mirror.log 2> /dev/null || true
@@ -423,12 +462,16 @@ if [[ "${TEST_MODE:-0}" == "1" ]]; then
423462 ;;
424463
425464 alinux)
426- if [[ " $VERSION_MAJOR " -ge 3 ]]; then
465+ if [[ " $VERSION_MAJOR " -ge 4 ]]; then
466+ PKG_MANAGER=" dnf"
467+ REPO_PATH=" centos/9"
468+ elif [[ " $VERSION_MAJOR " -ge 3 ]]; then
427469 PKG_MANAGER=" dnf"
470+ REPO_PATH=" centos/8"
428471 else
429472 PKG_MANAGER=" yum"
473+ REPO_PATH=" centos/8"
430474 fi
431- REPO_PATH=" centos/8"
432475 ;;
433476
434477 kylin)
@@ -629,6 +672,71 @@ setup_deb_repo() {
629672 return 1
630673}
631674
675+ # ============================================================
676+ # Pre-install preparation
677+ # ============================================================
678+
679+ # Remove conflicting packages (Podman, Buildah, etc.)
680+ # Required on EL systems where these are pre-installed
681+ remove_conflicting_packages () {
682+ local pkg_mgr=" $1 "
683+ local conflicts=(podman buildah containers-common docker docker-client
684+ docker-client-latest docker-common docker-latest docker-latest-logrotate
685+ docker-logrotate docker-engine)
686+ local found=false
687+
688+ for pkg in " ${conflicts[@]} " ; do
689+ if rpm -q " $pkg " & > /dev/null 2>&1 ; then
690+ found=true
691+ break
692+ fi
693+ done
694+
695+ if [[ " $found " == " true" ]]; then
696+ msg removing_conflicts
697+ sudo " $pkg_mgr " remove -y " ${conflicts[@]} " 2> /dev/null || true
698+ msg conflicts_removed
699+ fi
700+ }
701+
702+ # Ensure required kernel modules are available on EL10+
703+ # EL10 removed ip_tables module; Docker needs xt_addrtype, br_netfilter, overlay
704+ prepare_kernel_modules () {
705+ local pkg_mgr=" $1 "
706+ local version_major=" $2 "
707+
708+ # Only needed for EL10+
709+ if [[ " $version_major " -lt 10 ]]; then
710+ return 0
711+ fi
712+
713+ # Install kernel-modules-extra if not present
714+ if ! rpm -q kernel-modules-extra & > /dev/null 2>&1 ; then
715+ msg installing_kernel_modules
716+ sudo " $pkg_mgr " install -y kernel-modules-extra 2> /dev/null || true
717+ msg kernel_modules_installed
718+ fi
719+
720+ # Load required kernel modules
721+ msg loading_kernel_modules
722+ local all_loaded=true
723+ for mod in xt_addrtype br_netfilter overlay; do
724+ if ! modprobe " $mod " 2> /dev/null; then
725+ all_loaded=false
726+ fi
727+ done
728+
729+ if [[ " $all_loaded " == " true" ]]; then
730+ # Persist across reboots
731+ for mod in xt_addrtype br_netfilter overlay; do
732+ echo " $mod " | sudo tee " /etc/modules-load.d/${mod} .conf" > /dev/null 2> /dev/null || true
733+ done
734+ msg kernel_modules_loaded
735+ else
736+ msg kernel_modules_load_failed
737+ fi
738+ }
739+
632740# ============================================================
633741# Docker installation functions
634742# ============================================================
@@ -874,6 +982,10 @@ start_docker_service() {
874982 msg service_start_failed
875983 sudo journalctl -xeu docker.service --no-pager -n 20 2> /dev/null || \
876984 sudo systemctl status docker --no-pager -l 2> /dev/null || true
985+
986+ # Check if a newer kernel is installed but not yet booted
987+ check_kernel_reboot_needed
988+
877989 msg service_start_tip
878990 DOCKER_RUNNING=false
879991 fi
@@ -1193,7 +1305,10 @@ detect_install_strategy() {
11931305
11941306 alinux)
11951307 INSTALL_TYPE=" rpm"
1196- if [[ " ${VERSION_ID%% .* } " -ge 3 ]]; then
1308+ if [[ " ${VERSION_ID%% .* } " -ge 4 ]]; then
1309+ CENTOS_VERSION=" 9"
1310+ PKG_MANAGER=" dnf"
1311+ elif [[ " ${VERSION_ID%% .* } " -ge 3 ]]; then
11971312 CENTOS_VERSION=" 8"
11981313 PKG_MANAGER=" dnf"
11991314 else
@@ -1334,6 +1449,7 @@ main() {
13341449 # shellcheck disable=SC2059
13351450 printf " $( msg enter_choice " 1/2" ) " " "
13361451 read -r mode_input
1452+ mode_input=" ${mode_input:- 1} "
13371453 case " $mode_input " in
13381454 1) run_mode=" install" ; break ;;
13391455 2) run_mode=" mirror" ; break ;;
@@ -1450,6 +1566,14 @@ main() {
14501566 # Detect install strategy
14511567 detect_install_strategy
14521568
1569+ # Pre-install: remove conflicting packages and prepare kernel modules (RPM-based)
1570+ case " $INSTALL_TYPE " in
1571+ rpm|fedora)
1572+ remove_conflicting_packages " $PKG_MANAGER "
1573+ prepare_kernel_modules " $PKG_MANAGER " " ${VERSION_ID%% .* } "
1574+ ;;
1575+ esac
1576+
14531577 # Configure Docker source
14541578 msg configuring_source
14551579
0 commit comments