docker buildx 忽略容器镜像服务的证书校验的方法

最近在使用docker的最新版本docker 29.6.2版本,使用最新buildx的方法,上传个人搭建的容器镜像服务上,在证书忽略校验这块,需要需要注意一下。

1、docker安装

我docker安装,直接使用二进制的安装方法,直接从阿里云的mirror下载docker二进制压缩包,执行命令启动的方式。这种方式很容易安装各个版本的docker,大家可以参考一下,安装脚本如下:

bash 复制代码
PKG_DIR="/tmp/docker-version-packages"   # Persistent directory for Docker packages and buildx binary
TEST_DIR="/tmp/docker-version-test-$$"
BUILDX_VERSION="v0.34.1"
BUILDX_PLUGIN_DIR="${HOME}/.docker/cli-plugins"
BUILDX_BUILDER_NAME="my-builder"
BUILDKIT_IMAGE="moby/buildkit:buildx-stable-1"

install_docker_version() {
    local docker_version="$1"
    local download_url="https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/${docker_version}"

    log_info "========== Installing Docker: ${docker_version} =========="

    # Stop existing Docker service
    log_info "Stopping existing Docker service..."
    if systemctl is-active --quiet docker 2>/dev/null; then
        service docker stop || true
        sleep 2
    fi

    # Kill any lingering dockerd processes
    if pgrep -x dockerd > /dev/null; then
        log_warn "Found lingering dockerd process, cleaning up..."
        pkill -x dockerd || true
        sleep 2
    fi

    # Create persistent package directory and working directory
    mkdir -p "${PKG_DIR}"
    mkdir -p "${TEST_DIR}"

    # Download Docker (use local package if available)
    if [[ -f "${PKG_DIR}/${docker_version}" ]]; then
        log_info "Local package already exists: ${docker_version}, skipping download"
    else
        log_info "Downloading Docker: ${download_url}"
        if ! curl -k -fSL -o "${PKG_DIR}/${docker_version}" "${download_url}"; then
            log_error "Download failed: ${download_url}"
            return 1
        fi
        log_success "Download complete"
    fi

    # Copy to working directory and extract
    log_info "Extracting Docker package..."
    cp "${PKG_DIR}/${docker_version}" "${TEST_DIR}/"
    cd "${TEST_DIR}"
    tar -zxf "${docker_version}"

    # Copy binaries
    log_info "Installing Docker binaries to /usr/bin..."
    cp -p docker/* /usr/bin/

    # Start Docker daemon
    log_info "Starting Docker daemon..."
    nohup dockerd > "${TEST_DIR}/dockerd.log" 2>&1 &

    # Wait for Docker to start
    log_info "Waiting for Docker to start..."
    local max_wait=30
    local waited=0
    while ! docker info > /dev/null 2>&1; do
        sleep 1
        waited=$((waited + 1))
        if [[ $waited -ge $max_wait ]]; then
            log_error "Docker startup timeout (${max_wait}s)"
            log_error "Check logs: ${TEST_DIR}/dockerd.log"
            return 1
        fi
    done

    # Verify insecure-registries configuration is loaded
    log_info "Verifying insecure-registries configuration..."
    if ! docker info 2>/dev/null | grep -q "xxx.registry.com"; then
        log_warn "insecure-registries not loaded, restarting Docker daemon..."
        pkill -9 -x dockerd || true
        sleep 3
        rm -f /var/run/docker.sock /run/docker.sock 2>/dev/null || true
        nohup dockerd > "${TEST_DIR}/dockerd-restart.log" 2>&1 &
        waited=0
        while ! docker info > /dev/null 2>&1; do
            sleep 1
            waited=$((waited + 1))
            if [[ $waited -ge $max_wait ]]; then
                log_error "Docker restart timeout"
                return 1
            fi
        done
    fi

    # Verify Docker installation
    log_info "Verifying Docker installation..."
    if ! docker info > /dev/null 2>&1; then
        log_error "docker info failed"
        return 1
    fi

    if ! docker version > /dev/null 2>&1; then
        log_error "docker version failed"
        return 1
    fi

    local docker_ver
    docker_ver=$(docker version --format '{{.Server.Version}}')
    log_success "Docker ${docker_version} installed successfully, version: ${docker_ver}"

    return 0
}

install_docker_version "docker-29.6.2.tgz"

1、buildkit安装

bash 复制代码
PKG_DIR="/tmp/docker-version-packages"   # Persistent directory for Docker packages and buildx binary
TEST_DIR="/tmp/docker-version-test-$$"
BUILDX_VERSION="v0.34.1"
BUILDX_PLUGIN_DIR="${HOME}/.docker/cli-plugins"
BUILDX_BUILDER_NAME="my-builder"
BUILDKIT_IMAGE="moby/buildkit:buildx-stable-1"

# Install Docker buildx plugin (reentrant, binary downloaded only once)
install_docker_buildx() {
    local buildx_bin="${BUILDX_PLUGIN_DIR}/docker-buildx"

    # 1. Check if buildx is already installed and usable
    if [[ -x "${buildx_bin}" ]]; then
        local installed_ver
        installed_ver=$("${buildx_bin}" version 2>&1 | head -1)
        log_success "buildx already installed: ${installed_ver}, skipping"
        return 0
    fi

    # 2. Detect system architecture
    local arch
    arch=$(uname -m)
    case "${arch}" in
        x86_64)   arch="amd64" ;;
        aarch64)  arch="arm64" ;;
        armv7l)   arch="arm-v7" ;;
        *)
            log_error "Unsupported architecture: ${arch}"
            return 1
            ;;
    esac

    local buildx_file="buildx-${BUILDX_VERSION}.linux-${arch}"
    local download_url="https://github.com/docker/buildx/releases/download/${BUILDX_VERSION}/${buildx_file}"

    mkdir -p "${PKG_DIR}"

    # 3. Download buildx (use local cache if available)
    if [[ -f "${PKG_DIR}/${buildx_file}" ]]; then
        log_info "buildx package already exists: ${PKG_DIR}/${buildx_file}, skipping download"
    else
        log_info "Downloading buildx ${BUILDX_VERSION}: ${download_url}"
        if ! curl -k -fSL -o "${PKG_DIR}/${buildx_file}" "${download_url}"; then
            log_error "buildx download failed"
            return 1
        fi
        log_success "buildx download complete"
    fi

    # 4. Install to cli-plugins directory
    mkdir -p "${BUILDX_PLUGIN_DIR}"
    cp "${PKG_DIR}/${buildx_file}" "${buildx_bin}"
    chmod +x "${buildx_bin}"

    # 5. Configure daemon.json (insecure-registries)
    local daemon_json="/etc/docker/daemon.json"
    local need_restart=0

    if [[ ! -f "${daemon_json}" ]]; then
        cat > "${daemon_json}" <<'DAEMON_EOF'
{
    "insecure-registries": [
        "xxx.registry.com"
    ],
    "log-level": "debug",
    "experimental": true
}
DAEMON_EOF
        log_info "daemon.json created"
        need_restart=1
    else
        # Check if insecure-registries contains our registries
        if ! grep -q "xxx.registry.com" "${daemon_json}"; then
            log_warn "daemon.json exists but missing insecure-registries, updating..."
            # Backup existing daemon.json
            cp "${daemon_json}" "${daemon_json}.bak"
            cat > "${daemon_json}" <<'DAEMON_EOF'
{
    "insecure-registries": [
        "xxx.registry.com"
    ],
    "log-level": "debug",
    "experimental": true
}
DAEMON_EOF
            need_restart=1
        else
            log_info "daemon.json already configured"
        fi
    fi

    # Restart Docker daemon if needed to apply insecure-registries
    if [[ $need_restart -eq 1 ]] && pgrep -x dockerd > /dev/null; then
        log_info "Restarting Docker daemon to apply insecure-registries..."
        # Stop Docker completely
        pkill -9 -x dockerd || true
        sleep 3
        # Clean up any leftover socket files
        rm -f /var/run/docker.sock /run/docker.sock 2>/dev/null || true
        # Start Docker daemon fresh
        nohup dockerd > "${TEST_DIR}/dockerd-restart.log" 2>&1 &
        # Wait for Docker to be ready
        local max_wait=30
        local waited=0
        while ! docker info > /dev/null 2>&1; do
            sleep 1
            waited=$((waited + 1))
            if [[ $waited -ge $max_wait ]]; then
                log_error "Docker restart timeout"
                return 1
            fi
        done
        # Verify insecure-registries configuration
        if docker info 2>/dev/null | grep -q "xxx.registry.com"; then
            log_success "Docker daemon restarted with insecure-registries"
        else
            log_warn "insecure-registries may not be loaded correctly"
        fi
    fi

    export BUILDKIT_NO_CLIENT_TOKEN=true

    log_success "buildx ${BUILDX_VERSION} installation complete"
    return 0
}

# Configure buildkit builder (re-run after each Docker reinstall)
setup_buildkit_builder() {
    log_info "========== Configuring buildkit builder =========="

    # 1. Write buildkitd config
    mkdir -p /etc/buildkit
    cat > /etc/buildkit/buildkitd.toml <<'BUILDKIT_EOF'
debug = true
insecure-entitlements = ["security.insecure"]

[registry."xxx.registry.com"]
http = false
insecure = true

BUILDKIT_EOF
    log_info "buildkitd.toml written"

    # 2. Create buildx builder (remove old one with same name first)
    #    Do NOT use --use here, so docker build keeps using legacy builder
    docker buildx rm "${BUILDX_BUILDER_NAME}" > /dev/null 2>&1 || true
    if ! docker buildx create \
        --name "${BUILDX_BUILDER_NAME}" \
        --driver docker-container \
        --driver-opt network=host,image=${BUILDKIT_IMAGE} \
        --buildkitd-config /etc/buildkit/buildkitd.toml; then
        log_error "buildx builder creation failed"
        return 1
    fi
    log_info "builder '${BUILDX_BUILDER_NAME}' created"

    # 3. Pull buildkit image (check if already present locally)
    if docker image inspect "${BUILDKIT_IMAGE}" > /dev/null 2>&1; then
        log_info "buildkit image already exists, skipping pull"
    else
        log_info "Pulling buildkit image..."
        if ! docker pull "${BUILDKIT_IMAGE}"; then
            log_warn "buildkit image pull failed, builder will auto-pull"
        else
            docker tag "${BUILDKIT_IMAGE}" "moby/buildkit:buildx-stable-1" 2>/dev/null || true
            log_success "buildkit image ready"
        fi
    fi

    # 4. Bootstrap builder
    log_info "Bootstrapping builder..."
    docker buildx inspect --bootstrap

    # 5. List all builders
    docker buildx ls

    log_success "buildkit builder configuration complete"
    return 0
}

忽略容器镜像服务的证书校验主要有3个地方:

1、在docker的配置文件/etc/docker/daemon.json的insecure-registries中增加你容器镜像服务的地址:

{

"insecure-registries": [

"xxx.registry.com"

],

"log-level": "debug",

"experimental": true

}

2、在buildx的配置文件中/etc/buildkit/buildkitd.toml增加你容器镜像服务地址的忽略证书校验。

registry."xxx.registry.com"

http = false

insecure = true

3、最后一个地方,获取jwttoken的时候需要忽略证书校验,设置环境变量:

export BUILDKIT_NO_CLIENT_TOKEN=true

相关推荐
去伪存真20251 小时前
数字工厂与产线孪生的平台能力深度拆解
大数据·运维·人工智能·机器人
闲云自留地1 小时前
课后作业-20260806-Linux iSCSI服务器
linux·运维·服务器
风雨_831 小时前
轻量级 Nginx 日志分析和可视化平台 NginxPulse安装
运维·nginx
智购科技智能售货柜2 小时前
自动售货机商品识别YOLO模型训练实战:从6万张图片到98%识别率的完整复盘~YH
运维·服务器·数据库·人工智能·redis·物联网·yolo
X1A0RAN2 小时前
自动化流水线提效·宏观篇:5 大提效方向实战
运维·自动化
胖大和尚2 小时前
网页访问服务器,只有粘贴板可用
运维·服务器
zhang133830890752 小时前
CG-85D 水工大坝渗压监测振弦式传感器
运维·服务器·网络·人工智能·自动化
艾莉丝努力练剑3 小时前
Mac 远程桌面体验:6 个工具的 macOS 适配情况整理
linux·运维·服务器·macos·面试
酷可达拉斯3 小时前
Linux操作系统-tcpdump抓包定位网络问题实战
linux·运维·服务器·网络·tcpdump