rocky linux 9.0 一键部署docker脚本

62 阅读6分钟

在小伙伴使用该脚本时,需要先使用优化防火墙配置的脚本,不然在执行脚本时会报错

  1. 防火墙优化脚本
#!/bin/bash

# 快速修复firewalld Docker服务问题
# 解决 "INVALID_SERVICE: Zone 'public': 'docker' not among existing services" 错误

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'

echo -e "${YELLOW}=== 快速修复firewalld Docker服务问题 ===${NC}"

# 检查权限
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}需要root权限,请使用sudo运行${NC}"
    exit 1
fi

# 检查firewalld
if ! systemctl is-active --quiet firewalld; then
    echo -e "${YELLOW}启动firewalld...${NC}"
    systemctl start firewalld
fi

echo -e "${YELLOW}步骤1: 创建docker服务定义...${NC}"

# 创建docker服务定义文件
cat > /etc/firewalld/services/docker.xml << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Docker</short>
  <description>Docker daemon</description>
  <port protocol="tcp" port="2375"/>
  <port protocol="tcp" port="2376"/>
  <port protocol="tcp" port="2377"/>
  <port protocol="tcp" port="7946"/>
  <port protocol="udp" port="7946"/>
  <port protocol="udp" port="4789"/>
</service>
EOF

echo -e "${YELLOW}步骤2: 重新加载firewalld配置...${NC}"
firewall-cmd --reload

echo -e "${YELLOW}步骤3: 添加docker服务到防火墙...${NC}"
firewall-cmd --permanent --zone=public --add-service=docker

echo -e "${YELLOW}步骤4: 配置Docker网络规则...${NC}"
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="172.17.0.0/16" accept'
firewall-cmd --permanent --zone=public --add-masquerade

echo -e "${YELLOW}步骤5: 应用配置...${NC}"
firewall-cmd --reload

echo -e "${GREEN}✅ 修复完成!${NC}"

echo ""
echo "验证配置:"
echo "Docker服务: $(firewall-cmd --zone=public --query-service=docker && echo '已添加' || echo '未添加')"
echo "当前服务: $(firewall-cmd --zone=public --list-services)"

echo ""
echo -e "${GREEN}现在可以正常使用firewalld配置Docker了${NC}"

2.在使用一键脚本进行部署docker

#!/bin/bash

# Rocky Linux Docker安装和配置脚本
# 专门针对Rocky Linux 8/9系统优化

set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检测Rocky Linux版本
detect_rocky_version() {
    if [ ! -f /etc/rocky-release ]; then
        log_error "这不是Rocky Linux系统"
        exit 1
    fi
    
    ROCKY_VERSION=$(grep -oE '[0-9]+' /etc/rocky-release | head -1)
    ROCKY_FULL_VERSION=$(cat /etc/rocky-release)
    
    log_info "检测到系统: $ROCKY_FULL_VERSION"
    
    if [[ "$ROCKY_VERSION" != "8" && "$ROCKY_VERSION" != "9" ]]; then
        log_warning "未测试的Rocky Linux版本: $ROCKY_VERSION"
        log_info "脚本支持Rocky Linux 8和9,继续安装..."
    fi
}

# 检查权限
check_permissions() {
    if [ "$EUID" -ne 0 ]; then
        log_error "需要root权限来安装Docker"
        log_info "请使用: sudo $0"
        exit 1
    fi
}

# 检查系统要求
check_system_requirements() {
    log_info "检查系统要求..."
    
    # 检查内核版本
    KERNEL_VERSION=$(uname -r)
    log_info "内核版本: $KERNEL_VERSION"
    
    # 检查架构
    ARCH=$(uname -m)
    if [ "$ARCH" != "x86_64" ] && [ "$ARCH" != "aarch64" ]; then
        log_error "不支持的系统架构: $ARCH"
        exit 1
    fi
    log_info "系统架构: $ARCH"
    
    # 检查内存
    MEMORY_GB=$(free -g | awk '/^Mem:/{print $2}')
    if [ "$MEMORY_GB" -lt 2 ]; then
        log_warning "系统内存少于2GB,可能影响Docker性能"
    fi
    log_info "系统内存: ${MEMORY_GB}GB"
    
    # 检查磁盘空间
    DISK_SPACE=$(df / | awk 'NR==2{print int($4/1024/1024)}')
    if [ "$DISK_SPACE" -lt 10 ]; then
        log_warning "根分区可用空间少于10GB"
    fi
    log_info "可用磁盘空间: ${DISK_SPACE}GB"
    
    log_success "系统要求检查完成"
}

# 配置防火墙
configure_firewall() {
    log_info "配置防火墙..."
    
    if systemctl is-active --quiet firewalld; then
        log_info "配置firewalld防火墙规则..."
        
        # 检查docker服务是否存在,如果不存在则创建
        if ! firewall-cmd --get-services | grep -q docker; then
            log_info "创建docker服务定义..."
            
            cat > /etc/firewalld/services/docker.xml << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Docker</short>
  <description>Docker daemon</description>
  <port protocol="tcp" port="2375"/>
  <port protocol="tcp" port="2376"/>
  <port protocol="tcp" port="2377"/>
  <port protocol="tcp" port="7946"/>
  <port protocol="udp" port="7946"/>
  <port protocol="udp" port="4789"/>
</service>
EOF
            
            # 重新加载服务定义
            firewall-cmd --reload
            log_success "docker服务定义已创建"
        fi
        
        # 添加Docker服务到防火墙
        if ! firewall-cmd --zone=public --query-service=docker &>/dev/null; then
            firewall-cmd --permanent --zone=public --add-service=docker
            log_success "已添加docker服务到防火墙"
        else
            log_info "docker服务已在防火墙中"
        fi
        
        # 添加Docker网络规则
        firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="172.17.0.0/16" accept' 2>/dev/null || true
        firewall-cmd --permanent --zone=public --add-masquerade
        
        # 重新加载防火墙规则
        firewall-cmd --reload
        
        log_success "防火墙配置完成"
    else
        log_info "firewalld未运行,跳过防火墙配置"
    fi
}

# 配置SELinux
configure_selinux() {
    log_info "配置SELinux..."
    
    SELINUX_STATUS=$(getenforce)
    log_info "当前SELinux状态: $SELINUX_STATUS"
    
    if [ "$SELINUX_STATUS" = "Enforcing" ]; then
        log_info "SELinux处于强制模式,安装container-selinux..."
        
        # 安装container-selinux
        dnf install -y container-selinux
        
        # 设置SELinux布尔值
        setsebool -P container_manage_cgroup on
        
        log_success "SELinux配置完成"
    elif [ "$SELINUX_STATUS" = "Permissive" ]; then
        log_warning "SELinux处于宽松模式"
    else
        log_info "SELinux已禁用"
    fi
}

# 卸载旧版本Docker
remove_old_docker() {
    log_info "移除旧版本Docker..."
    
    # 停止Docker服务
    systemctl stop docker 2>/dev/null || true
    systemctl stop docker.socket 2>/dev/null || true
    
    # 卸载旧版本
    dnf remove -y \
        docker \
        docker-client \
        docker-client-latest \
        docker-common \
        docker-latest \
        docker-latest-logrotate \
        docker-logrotate \
        docker-engine \
        podman \
        buildah \
        skopeo \
        runc 2>/dev/null || true
    
    log_success "旧版本Docker已移除"
}

# 安装必要依赖
install_dependencies() {
    log_info "安装必要依赖..."
    
    # 更新系统
    dnf update -y
    
    # 安装依赖包
    dnf install -y \
        dnf-plugins-core \
        device-mapper-persistent-data \
        lvm2 \
        curl \
        wget \
        yum-utils \
        ca-certificates \
        gnupg 
    
    log_success "依赖安装完成"
}

# 添加Docker仓库
add_docker_repository() {
    log_info "添加Docker官方仓库..."
    
    # 添加Docker CE仓库
    dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 启用仓库
    dnf config-manager --set-enabled docker-ce-stable
    
    # 更新仓库缓存
    dnf makecache
    
    log_success "Docker仓库添加完成"
}

# 安装Docker
install_docker() {
    log_info "安装Docker CE..."
    
    # 安装最新版本的Docker CE
    dnf install -y \
        docker-ce \
        docker-ce-cli \
        containerd.io \
        docker-buildx-plugin \
        docker-compose-plugin
    
    log_success "Docker安装完成"
}

# 配置Docker守护进程
configure_docker_daemon() {
    log_info "配置Docker守护进程..."
    
    # 创建Docker配置目录
    mkdir -p /etc/docker
    
    # 创建daemon.json配置文件
    cat > /etc/docker/daemon.json << 'EOF'
{
    "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com"
    ],
   "storage-driver": "overlay2",
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}
EOF
    
    log_success "Docker守护进程配置完成"
}

# 优化系统参数
optimize_system_parameters() {
    log_info "优化系统参数..."
    
    # 内核参数优化
    cat >> /etc/sysctl.conf << 'EOF'

# Docker优化参数
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.max_map_count = 262144
fs.may_detach_mounts = 1
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 5000
EOF
    
    # 应用参数
    sysctl -p
    
    # 设置文件描述符限制
    cat >> /etc/security/limits.conf << 'EOF'

# Docker优化
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
EOF
    
    log_success "系统参数优化完成"
}

# 启动Docker服务
start_docker_service() {
    log_info "启动Docker服务..."
    
    # 重新加载systemd配置
    sudo systemctl daemon-reload
    
    # 启动Docker服务
    sudo systemctl start docker
    
    # 设置开机自启
    sudo systemctl enable docker
    
    # 启动Docker socket
    sudo systemctl enable docker.socket
    
    # 等待服务启动
    sleep 3
    
    if systemctl is-active --quiet docker; then
        log_success "Docker服务启动成功"
    else
        log_error "Docker服务启动失败"
        return 1
    fi
}

# 配置用户权限
configure_user_permissions() {
    log_info "配置用户权限..."
    
    # 获取当前用户(如果通过sudo运行)
    if [ -n "$SUDO_USER" ]; then
        CURRENT_USER=$SUDO_USER
    else
        CURRENT_USER=$(whoami)
    fi
    
    if [ "$CURRENT_USER" != "root" ]; then
        # 添加用户到docker组
        usermod -aG docker $CURRENT_USER
        log_success "用户 $CURRENT_USER 已添加到docker组"
        log_warning "请重新登录或运行 'newgrp docker' 使权限生效"
    else
        log_info "当前为root用户,跳过用户组配置"
    fi
}

# 安装Docker Compose(独立版本)
install_docker_compose_standalone() {
    log_info "安装Docker Compose独立版本..."
    
    # 获取最新版本
    COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
    
    if [ -z "$COMPOSE_VERSION" ]; then
        COMPOSE_VERSION="v2.24.0"  # 备用版本
        log_warning "无法获取最新版本,使用备用版本: $COMPOSE_VERSION"
    fi
    
    # 下载并安装
    curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    # 设置执行权限
    chmod +x /usr/local/bin/docker-compose
    
    # 创建符号链接
    ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    log_success "Docker Compose安装完成: $COMPOSE_VERSION"
}

# 验证安装
verify_installation() {
    log_info "验证Docker安装..."
    
    # 检查Docker版本
    if command -v docker &> /dev/null; then
        DOCKER_VERSION=$(docker --version)
        log_success "Docker安装成功: $DOCKER_VERSION"
    else
        log_error "Docker命令未找到"
        return 1
    fi
    
    # 检查Docker服务状态
    if systemctl is-active --quiet docker; then
        log_success "Docker服务运行正常"
    else
        log_error "Docker服务未运行"
        return 1
    fi
    
    # 检查Docker Compose
    if command -v docker-compose &> /dev/null; then
        COMPOSE_VERSION=$(docker-compose --version)
        log_success "Docker Compose可用: $COMPOSE_VERSION"
    elif docker compose version &> /dev/null; then
        COMPOSE_VERSION=$(docker compose version)
        log_success "Docker Compose Plugin可用: $COMPOSE_VERSION"
    else
        log_warning "Docker Compose未安装"
    fi
    
    # 运行测试容器
    log_info "运行Hello World测试容器..."
    if docker run --rm hello-world > /dev/null 2>&1; then
        log_success "Docker测试容器运行成功"
    else
        log_warning "Docker测试容器运行失败,但Docker已安装"
    fi
    
    # 显示系统信息
    echo ""
    log_info "Docker系统信息:"
    docker system info | grep -E "Server Version|Storage Driver|Logging Driver|Cgroup Driver|Kernel Version|Operating System"
}

# 创建Rocky Linux特定的优化脚本
create_rocky_optimization_scripts() {
    log_info "创建Rocky Linux优化脚本..."
    
    # 创建Docker优化脚本
    cat > /usr/local/bin/docker-rocky-optimize.sh << 'EOF'
#!/bin/bash

# Rocky Linux Docker优化脚本

echo "=== Rocky Linux Docker优化 ==="

# 检查并优化存储驱动
STORAGE_DRIVER=$(docker info --format '{{.Driver}}')
echo "当前存储驱动: $STORAGE_DRIVER"

if [ "$STORAGE_DRIVER" != "overlay2" ]; then
    echo "建议使用overlay2存储驱动"
fi

# 检查cgroup驱动
CGROUP_DRIVER=$(docker info --format '{{.CgroupDriver}}')
echo "当前cgroup驱动: $CGROUP_DRIVER"

# 优化内核参数
echo "优化内核参数..."
sysctl -w vm.max_map_count=262144
sysctl -w fs.may_detach_mounts=1

# 清理Docker资源
echo "清理Docker资源..."
docker system prune -f

echo "优化完成!"
EOF
    
    chmod +x /usr/local/bin/docker-rocky-optimize.sh
    
    # 创建Docker监控脚本
    cat > /usr/local/bin/docker-rocky-monitor.sh << 'EOF'
#!/bin/bash

# Rocky Linux Docker监控脚本

echo "=== Rocky Linux Docker监控 ==="
echo "时间: $(date)"
echo ""

# 系统信息
echo "系统信息:"
echo "  发行版: $(cat /etc/rocky-release)"
echo "  内核: $(uname -r)"
echo "  架构: $(uname -m)"
echo ""

# Docker信息
echo "Docker信息:"
echo "  版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)"
echo "  存储驱动: $(docker info --format '{{.Driver}}')"
echo "  日志驱动: $(docker info --format '{{.LoggingDriver}}')"
echo ""

# 容器统计
echo "容器统计:"
echo "  运行中: $(docker ps -q | wc -l)"
echo "  总数: $(docker ps -a -q | wc -l)"
echo "  镜像数: $(docker images -q | wc -l)"
echo ""

# 资源使用
echo "资源使用:"
echo "  内存: $(free -h | grep Mem | awk '{print $3"/"$2}')"
echo "  磁盘: $(df -h / | awk 'NR==2{print $3"/"$2" ("$5")"}')"
echo ""

# Docker磁盘使用
echo "Docker磁盘使用:"
docker system df

# 检查服务状态
echo ""
echo "服务状态:"
systemctl is-active docker && echo "  Docker: 运行中" || echo "  Docker: 未运行"
systemctl is-active firewalld && echo "  Firewalld: 运行中" || echo "  Firewalld: 未运行"
EOF
    
    chmod +x /usr/local/bin/docker-rocky-monitor.sh
    
    log_success "Rocky Linux优化脚本创建完成"
}

# 配置日志轮转
configure_log_rotation() {
    log_info "配置Docker日志轮转..."
    
    cat > /etc/logrotate.d/docker << 'EOF'
/var/lib/docker/containers/*/*.log {
    rotate 7
    daily
    compress
    size=10M
    missingok
    delaycompress
    copytruncate
    notifempty
}
EOF
    
    log_success "日志轮转配置完成"
}

# 显示安装后信息
show_post_install_info() {
    echo ""
    log_success "Rocky Linux Docker安装完成!"
    echo ""
    echo "系统信息:"
    echo "  操作系统: $(cat /etc/rocky-release)"
    echo "  内核版本: $(uname -r)"
    echo "  Docker版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)"
    echo ""
    echo "常用命令:"
    echo "  docker --version              # 查看Docker版本"
    echo "  docker info                   # 查看Docker系统信息"
    echo "  docker run hello-world        # 运行测试容器"
    echo "  docker ps                     # 查看运行中的容器"
    echo "  docker images                 # 查看本地镜像"
    echo "  systemctl status docker       # 查看Docker服务状态"
    echo ""
    echo "Docker Compose命令:"
    echo "  docker compose --version      # 查看Compose版本"
    echo "  docker compose up -d          # 启动服务"
    echo "  docker compose down           # 停止服务"
    echo ""
    echo "Rocky Linux专用工具:"
    echo "  docker-rocky-optimize.sh      # 运行系统优化"
    echo "  docker-rocky-monitor.sh       # 系统监控"
    echo ""
    echo "配置文件位置:"
    echo "  /etc/docker/daemon.json       # Docker守护进程配置"
    echo "  /etc/systemd/system/docker.service.d/  # systemd配置"
    echo ""
    if [ -n "$SUDO_USER" ] && [ "$SUDO_USER" != "root" ]; then
        log_warning "请重新登录或运行以下命令使docker组权限生效:"
        echo "  newgrp docker"
        echo "  或者重新登录系统"
    fi
}

# 显示帮助信息
show_help() {
    echo "Rocky Linux Docker安装脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help          显示此帮助信息"
    echo "  -v, --version       显示脚本版本"
    echo "  --no-compose        不安装Docker Compose"
    echo "  --no-optimize       不进行系统优化"
    echo "  --uninstall         卸载Docker"
    echo ""
    echo "支持的Rocky Linux版本:"
    echo "  - Rocky Linux 8.x"
    echo "  - Rocky Linux 9.x"
}

# 卸载Docker
uninstall_docker() {
    log_info "卸载Docker..."
    
    # 停止Docker服务
    systemctl stop docker 2>/dev/null || true
    systemctl disable docker 2>/dev/null || true
    
    # 卸载Docker包
    dnf remove -y \
        docker-ce \
        docker-ce-cli \
        containerd.io \
        docker-buildx-plugin \
        docker-compose-plugin
    
    # 删除Docker数据目录
    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
    rm -rf /etc/docker
    
    # 删除用户组
    groupdel docker 2>/dev/null || true
    
    # 删除创建的脚本
    rm -f /usr/local/bin/docker-rocky-optimize.sh
    rm -f /usr/local/bin/docker-rocky-monitor.sh
    rm -f /usr/local/bin/docker-compose
    
    log_success "Docker已卸载"
}

# 主函数
main() {
    echo "========================================"
    echo "    Rocky Linux Docker安装脚本 v1.0"
    echo "========================================"
    echo ""
    
    # 解析命令行参数
    INSTALL_COMPOSE=true
    OPTIMIZE_SYSTEM=true
    
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -v|--version)
                echo "Rocky Linux Docker安装脚本 v1.0"
                exit 0
                ;;
            --no-compose)
                INSTALL_COMPOSE=false
                shift
                ;;
            --no-optimize)
                OPTIMIZE_SYSTEM=false
                shift
                ;;
            --uninstall)
                check_permissions
                uninstall_docker
                exit 0
                ;;
            *)
                log_error "未知选项: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 执行安装流程
    check_permissions
    detect_rocky_version
    check_system_requirements
    configure_selinux
    remove_old_docker
    install_dependencies
    add_docker_repository
    install_docker
    configure_docker_daemon
    
    if [ "$OPTIMIZE_SYSTEM" = true ]; then
        optimize_system_parameters
    fi
    
    start_docker_service
    configure_user_permissions
    configure_firewall
    
    if [ "$INSTALL_COMPOSE" = true ]; then
        install_docker_compose_standalone
    fi
    
    configure_log_rotation
    create_rocky_optimization_scripts
    
    # 验证安装
    if verify_installation; then
        show_post_install_info
    else
        log_error "Docker安装验证失败"
        exit 1
    fi
}

# 运行主函数
main "$@"

给脚本执行权限

chmod +x rockylinux_docker_install.sh

完整安装

sudo ./rockylinux_docker_install.sh

不安装Docker Compose

sudo ./rockylinux_docker_install.sh --no-compose

不进行系统优化

sudo ./rockylinux_docker_install.sh --no-optimize

卸载Docker

sudo ./rockylinux_docker_install.sh --uninstall

查看帮助

./rockylinux_docker_install.sh --help