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

相关推荐
Acrellea2 小时前
告别粗放式能耗管理!安科瑞EIOT平台助力产业园区智慧低碳运营
运维·安全·能源
Databuff2 小时前
五款主流 SSH 免费工具介绍
运维·ssh·运维开发
菜鸟学编程o2 小时前
Linux常见指令
linux·运维·服务器
pt10433 小时前
AIOps机器学习——当警报阈值被调高之后
运维·人工智能·自动化
迪康coolmu3 小时前
企业文件外发管控落地实践 —— 基于迪康端点安全一体化管理系统
运维·网络·经验分享·安全
见闻小天地4 小时前
四方电气DL300变频器面向雕铣机多工况的技术参数与适配验证
运维·人工智能·业界资讯
千舟软件5 小时前
【宿舍管理小程序】新生入住不靠纸质表
大数据·运维·服务器·科技·业界资讯
程序员老赵5 小时前
Docker 部署 XXL-JOB:轻松搭建分布式任务调度平台
后端·docker·开源
j7~6 小时前
【Linux网络加餐课】(篇八)网络版计算器(终篇):守护进程、标准 IO 重定向与部署打包
linux·运维·网络编程·tcp·守护进程·io重定向·部署打包
迹_start6 小时前
Docker
docker