Docker Compose與私有倉(cāng)庫(kù)部署指南
引言
在現(xiàn)代應(yīng)用開發(fā)和部署中,容器化技術(shù)已經(jīng)成為標(biāo)配。然而,隨著微服務(wù)架構(gòu)的普及,單一容器已難以滿足復(fù)雜應(yīng)用的需求。本文將帶領(lǐng)大家深入掌握Docker Compose編排工具和企業(yè)級(jí)私有倉(cāng)庫(kù)Harbor,實(shí)現(xiàn)從單體應(yīng)用到復(fù)雜服務(wù)的高效管理與部署。
一、Docker Compose:?jiǎn)螜C(jī)編排的利器
1. Docker Compose在容器編排生態(tài)中的位置

關(guān)鍵觀點(diǎn):
- Docker Compose:學(xué)習(xí)門檻低,適合入門和快速原型開發(fā)
- Kubernetes:功能強(qiáng)大但復(fù)雜,需要專門團(tuán)隊(duì)維護(hù)
- 漸進(jìn)式路徑:Compose → Kubernetes是最佳學(xué)習(xí)路徑
2. Docker Compose快速安裝指南
# 1. 下載Docker Compose二進(jìn)制文件(國(guó)內(nèi)加速) $ curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` \ -o /usr/local/bin/docker-compose # 2. 賦予執(zhí)行權(quán)限 $ chmod +x /usr/local/bin/docker-compose # 3. 驗(yàn)證安裝 $ docker-compose --version docker-compose version 1.29.2, build 5becea4c
3. WordPress實(shí)戰(zhàn)部署:從零到一
3.1 項(xiàng)目結(jié)構(gòu)規(guī)劃
wordpress-site/
├── docker-compose.yml # 編排配置文件
├── .env # 環(huán)境變量文件(敏感信息)
├── db_data/ # MySQL數(shù)據(jù)目錄
│ └── [自動(dòng)創(chuàng)建]
├── web_data/ # WordPress文件目錄
│ └── [自動(dòng)創(chuàng)建]
└── nginx-conf/ # Nginx配置(可選擴(kuò)展)
└── wordpress.conf3.2 完整的docker-compose.yml配置
# docker-compose.yml
version: '3.8'
# 定義網(wǎng)絡(luò)(創(chuàng)建獨(dú)立的橋接網(wǎng)絡(luò))
networks:
wordpress-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
# 定義數(shù)據(jù)卷(持久化存儲(chǔ))
volumes:
db_data:
web_data:
# 定義服務(wù)
services:
# MySQL數(shù)據(jù)庫(kù)服務(wù)
db:
image: mysql:5.7
container_name: wp-mysql
restart: unless-stopped
volumes:
- db_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化SQL腳本
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_INITDB_SKIP_TZINFO: 1
networks:
- wordpress-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--max_allowed_packet=64M
# WordPress應(yīng)用服務(wù)
wordpress:
image: wordpress:php7.4-apache
container_name: wp-app
restart: unless-stopped
depends_on:
db:
condition: service_healthy
volumes:
- web_data:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini # PHP配置
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: ${DB_USER}
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: ${DB_NAME}
WORDPRESS_TABLE_PREFIX: wp_
WORDPRESS_CONFIG_EXTRA: |
define('WP_SITEURL', 'http://${DOMAIN}');
define('WP_HOME', 'http://${DOMAIN}');
define('WP_DEBUG', ${WP_DEBUG});
define('WP_MEMORY_LIMIT', '256M');
networks:
wordpress-network
labels:
- "traefik.enable=true"
- "traefik.http.routers.wordpress.rule=Host(`${DOMAIN}`)"
- "traefik.http.services.wordpress.loadbalancer.server.port=80"
# Nginx反向代理(可選)
nginx:
image: nginx:alpine
container_name: wp-nginx
restart: unless-stopped
depends_on:
- wordpress
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx-conf:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
- web_data:/var/www/html:ro
networks:
- wordpress-network3.3 環(huán)境變量配置(.env文件)
# 數(shù)據(jù)庫(kù)配置 DB_ROOT_PASSWORD=R00t!Passw0rd#2024 DB_NAME=wordpress_db DB_USER=wp_user DB_PASSWORD=WpUser!Secure#2024 # WordPress配置 DOMAIN=localhost # 生產(chǎn)環(huán)境修改為實(shí)際域名 WP_DEBUG=false # 網(wǎng)絡(luò)配置 NETWORK_SUBNET=172.20.0.0/16 # 時(shí)區(qū)設(shè)置 TZ=Asia/Shanghai
3.4 一鍵部署與管理
#!/bin/bash
# deploy-wordpress.sh - WordPress一站式部署腳本
set -e
echo "?? 開始部署WordPress..."
# 1. 創(chuàng)建項(xiàng)目目錄
PROJECT_DIR="~/wordpress-site"
mkdir -p $PROJECT_DIR/{db_data,web_data,nginx-conf,ssl}
cd $PROJECT_DIR
# 2. 生成配置文件
if [ ! -f docker-compose.yml ]; then
echo "生成docker-compose.yml..."
# 這里可以加入自動(dòng)生成邏輯
fi
# 3. 檢查環(huán)境變量
if [ ! -f .env ]; then
echo " 警告: 未找到.env文件"
cp .env.example .env
echo "請(qǐng)編輯.env文件配置環(huán)境變量"
nano .env
fi
# 4. 啟動(dòng)服務(wù)
echo "啟動(dòng)Docker Compose服務(wù)..."
docker-compose up -d
# 5. 健康檢查
echo "等待服務(wù)啟動(dòng)..."
sleep 10
for service in db wordpress; do
echo "檢查 $service 狀態(tài)..."
if docker-compose ps $service | grep -q "Up"; then
echo " $service 啟動(dòng)成功"
else
echo " $service 啟動(dòng)失敗"
docker-compose logs $service
exit 1
fi
done
# 6. 輸出訪問信息
echo ""
echo "======================================"
echo " WordPress部署完成!"
echo ""
echo " 訪問地址: http://localhost"
echo " 管理后臺(tái): http://localhost/wp-admin"
echo ""
echo " 服務(wù)狀態(tài):"
docker-compose ps
echo ""
echo " 查看日志: docker-compose logs -f"
echo " 停止服務(wù): docker-compose down"
echo "======================================"3.5 Docker Compose管理命令大全
# 基礎(chǔ)操作 dc up -d # 啟動(dòng)服務(wù)(后臺(tái)運(yùn)行) dc down # 停止并移除服務(wù) dc ps # 查看服務(wù)狀態(tài) dc logs -f # 跟蹤日志輸出 # 服務(wù)管理 dc start # 啟動(dòng)已停止的服務(wù) dc stop # 停止運(yùn)行中的服務(wù) dc restart # 重啟服務(wù) dc pause # 暫停服務(wù) dc unpause # 恢復(fù)服務(wù) # 監(jiān)控與調(diào)試 dc top # 查看容器進(jìn)程 dc exec <service> sh # 進(jìn)入容器Shell dc config # 驗(yàn)證配置語法 dc port <service> # 查看端口映射 # 擴(kuò)展與維護(hù) dc up --scale web=3 # 擴(kuò)展服務(wù)實(shí)例(web服務(wù)3個(gè)副本) dc build # 重新構(gòu)建鏡像 dc pull # 拉取最新鏡像 dc images # 查看項(xiàng)目相關(guān)鏡像 # 清理維護(hù) dc down -v # 停止并刪除數(shù)據(jù)卷 dc rm -f # 強(qiáng)制移除容器 dc down --rmi all # 停止并刪除所有鏡像
二、Docker私有倉(cāng)庫(kù):從Registry到Harbor
1. 私有倉(cāng)庫(kù)生態(tài)系統(tǒng)對(duì)比

2. Docker原生Registry快速搭建
2.1 基礎(chǔ)安裝與配置
#!/bin/bash
# setup-registry.sh - Docker Registry快速安裝
# 1. 創(chuàng)建數(shù)據(jù)目錄
mkdir -p /data/docker-registry
chmod 755 /data/docker-registry
# 2. 創(chuàng)建認(rèn)證文件(可選)
mkdir -p /auth
docker run --entrypoint htpasswd registry:2 \
-Bbn admin "SecurePass123!" > /auth/htpasswd
# 3. 啟動(dòng)Registry容器
docker run -d \
--name=private-registry \
--restart=unless-stopped \
-p 5000:5000 \
-v /data/docker-registry:/var/lib/registry \
-v /auth:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
registry:2
# 4. 客戶端配置(所有要使用該倉(cāng)庫(kù)的機(jī)器)
cat << EOF > /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.100:5000"],
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF
# 5. 重啟Docker服務(wù)
systemctl daemon-reload
systemctl restart docker
# 6. 驗(yàn)證安裝
curl -X GET http://192.168.1.100:5000/v2/_catalog
echo "Registry安裝完成!"2.2 鏡像推送到私有倉(cāng)庫(kù)
# 1. 登錄到私有倉(cāng)庫(kù)
docker login 192.168.1.100:5000
Username: admin
Password: SecurePass123!
# 2. 給鏡像打標(biāo)簽(關(guān)鍵步驟?。?
# 格式:docker tag SOURCE_IMAGE[:TAG] REGISTRY_HOST:PORT/REPOSITORY[:TAG]
docker tag nginx:latest 192.168.1.100:5000/library/nginx:latest
docker tag mysql:8.0 192.168.1.100:5000/apps/mysql:8.0
# 3. 推送到倉(cāng)庫(kù)
docker push 192.168.1.100:5000/library/nginx:latest
docker push 192.168.1.100:5000/apps/mysql:8.0
# 4. 查看倉(cāng)庫(kù)內(nèi)容
curl -X GET http://192.168.1.100:5000/v2/_catalog
# 輸出:{"repositories":["library/nginx","apps/mysql"]}
curl -X GET http://192.168.1.100:5000/v2/library/nginx/tags/list
# 輸出:{"name":"library/nginx","tags":["latest"]}
# 5. 從私有倉(cāng)庫(kù)拉取
docker pull 192.168.1.100:5000/library/nginx:latest
# 6. 清理本地緩存
docker image prune -f3. Harbor企業(yè)級(jí)私有倉(cāng)庫(kù)
3.1 Harbor架構(gòu)概覽

3.2 Harbor安裝部署
3.2.1 環(huán)境準(zhǔn)備
#!/bin/bash
# prepare-harbor-env.sh
echo " 檢查系統(tǒng)環(huán)境..."
# 1. 檢查Docker和Docker Compose
if ! command -v docker &> /dev/null; then
echo " Docker未安裝,開始安裝..."
curl -fsSL https://get.docker.com | bash -s docker
fi
if ! command -v docker-compose &> /dev/null; then
echo " Docker Compose未安裝,開始安裝..."
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
fi
# 2. 檢查端口占用
PORTS=(80 443 4443)
for port in "${PORTS[@]}"; do
if ss -tulpn | grep ":${port}" > /dev/null; then
echo " 警告: 端口 ${port} 已被占用"
fi
done
# 3. 檢查存儲(chǔ)空間(至少20GB)
AVAILABLE_SPACE=$(df -BG / | tail -1 | awk '{print $4}' | tr -d 'G')
if [ "$AVAILABLE_SPACE" -lt 20 ]; then
echo " 磁盤空間不足,至少需要20GB"
exit 1
fi
# 4. 創(chuàng)建目錄結(jié)構(gòu)
mkdir -p /data/harbor/{data,cert,ca-download}
chmod -R 755 /data/harbor
echo " 環(huán)境檢查通過"3.2.2 離線安裝
#!/bin/bash
# install-harbor-offline.sh
HARBOR_VERSION="v2.5.1"
INSTALL_DIR="/opt/harbor"
DATA_DIR="/data/harbor"
echo " 開始安裝Harbor ${HARBOR_VERSION}..."
# 1. 下載離線安裝包
cd /tmp
wget https://github.com/goharbor/harbor/releases/download/${HARBOR_VERSION}/harbor-offline-installer-${HARBOR_VERSION}.tgz
# 2. 解壓安裝包
tar xzf harbor-offline-installer-${HARBOR_VERSION}.tgz -C /opt
mv /opt/harbor ${INSTALL_DIR}
# 3. 配置harbor.yml
cp harbor.yml.tmpl harbor.yml
cat > harbor.yml <<-EOF
hostname: harbor.local
http:
port: 80
https:
port: 443
certificate: /data/cert/harbor.crt
private_key: /data/cert/harbor.key
harbor_admin_password: Harbor12345
database:
password: root123
data_volume: /data
clair:
updaters_interval: 12
jobservice:
max_job_workers: 10
notification:
webhook_job_max_retry: 10
chart:
absolute_url: disabled
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
_version: 2.5.0
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- clair
EOF
# 4. 執(zhí)行安裝
./install.sh
# 5. 驗(yàn)證安裝
sleep 30
echo "檢查Harbor服務(wù)狀態(tài)..."
docker-compose ps
echo " Harbor安裝完成!"
echo " 訪問地址: https://harbor.local"
echo " 用戶名: admin"
echo " 密碼: Harbor12345"3.3 Harbor日常使用
#!/bin/bash # push-to-harbor-with-scan.sh HARBOR_HOST="harbor.local" PROJECT="myapp" IMAGE="nginx:1.21" TAG="v1.0" echo " 登錄到Harbor..." docker login $HARBOR_HOST -u admin -p Harbor12345 echo " 為鏡像打標(biāo)簽..." docker tag $IMAGE $HARBOR_HOST/$PROJECT/nginx:$TAG echo " 推送鏡像到Harbor..." docker push $HARBOR_HOST/$PROJECT/nginx:$TAG echo " 觸發(fā)安全掃描..." # 使用Harbor API觸發(fā)掃描 curl -X POST \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ "https://$HARBOR_HOST/api/v2.0/projects/$PROJECT/repositories/nginx/artifacts/$TAG/scan" \ -k echo " 等待掃描完成..." sleep 30 echo " 獲取掃描結(jié)果..." curl -X GET \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ "https://$HARBOR_HOST/api/v2.0/projects/$PROJECT/repositories/nginx/artifacts/$TAG/additions/vulnerabilities" \ -k | jq '.' echo " 鏡像推送完成"
三、實(shí)戰(zhàn)對(duì)比:Compose + Harbor完整方案
1. 企業(yè)級(jí)WordPress部署方案

2. 完整的docker-compose.yml(生產(chǎn)就緒)
# production-wordpress.yml
version: '3.8'
x-logging: &default-logging
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
x-common-labels: &common-labels
com.company.project: "wordpress"
com.company.environment: "production"
services:
# 使用Harbor中的鏡像
mysql:
image: harbor.company.com/infra/mysql:8.0
container_name: mysql-production
restart: unless-stopped
logging: *default-logging
labels: *common-labels
volumes:
- mysql_data:/var/lib/mysql
- ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER_FILE: /run/secrets/mysql_user
MYSQL_PASSWORD_FILE: /run/secrets/mysql_password
secrets:
- mysql_root_password
- mysql_user
- mysql_password
networks:
- backend
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 30s
timeout: 10s
retries: 3
wordpress:
image: harbor.company.com/apps/wordpress:6.0
container_name: wordpress-production
restart: unless-stopped
depends_on:
mysql:
condition: service_healthy
logging: *default-logging
labels: *common-labels
volumes:
- wp_content:/var/www/html/wp-content
- uploads:/var/www/html/wp-content/uploads
- ./config/php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_USER_FILE: /run/secrets/mysql_user
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/mysql_password
WORDPRESS_DB_NAME: wordpress
WORDPRESS_TABLE_PREFIX: wp_
WORDPRESS_DEBUG: "false"
WORDPRESS_CONFIG_EXTRA: |
define('WP_HOME', 'https://${DOMAIN}');
define('WP_SITEURL', 'https://${DOMAIN}');
define('FORCE_SSL_ADMIN', true);
define('WP_CACHE', true);
secrets:
- mysql_user
- mysql_password
networks:
- backend
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.wordpress.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.wordpress.entrypoints=websecure"
- "traefik.http.routers.wordpress.tls.certresolver=letsencrypt"
redis:
image: harbor.company.com/infra/redis:7.0-alpine
container_name: redis-cache
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- backend
# 反向代理(生產(chǎn)環(huán)境推薦Traefik)
traefik:
image: traefik:v2.9
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config/traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./config/traefik/config.yml:/etc/traefik/config.yml:ro
- acme_data:/acme
networks:
- proxy
secrets:
mysql_root_password:
file: ./secrets/mysql_root_password.txt
mysql_user:
file: ./secrets/mysql_user.txt
mysql_password:
file: ./secrets/mysql_password.txt
volumes:
mysql_data:
driver: local
driver_opts:
type: none
o: bind
device: /data/mysql
wp_content:
uploads:
redis_data:
acme_data:
networks:
backend:
driver: bridge
proxy:
external: true四、綜合對(duì)比與選擇指南
1. 技術(shù)選型決策矩陣

2. 技術(shù)棧對(duì)比表
維度 | Docker Compose + Registry | Docker Compose + Harbor | Kubernetes + Harbor |
|---|---|---|---|
學(xué)習(xí)曲線? | ??☆☆☆ (簡(jiǎn)單) | ???☆☆ (中等) | ????? (陡峭) |
部署速度? | ????? (分鐘級(jí)) | ????☆ (小時(shí)級(jí)) | ??☆☆☆ (天級(jí)) |
功能完整性? | ??☆☆☆ (基礎(chǔ)) | ????☆ (完善) | ????? (全面) |
擴(kuò)展性? | ??☆☆☆ (單機(jī)) | ???☆☆ (有限集群) | ????? (無限擴(kuò)展) |
維護(hù)成本? | ?☆☆☆☆ (很低) | ??☆☆☆ (較低) | ????? (很高) |
適合場(chǎng)景? | 個(gè)人項(xiàng)目/原型開發(fā) | 中小企業(yè)生產(chǎn)環(huán)境 | 大型企業(yè)/云原生轉(zhuǎn)型 |
結(jié)語
Docker Compose和私有倉(cāng)庫(kù)是現(xiàn)代容器化技術(shù)棧中的重要組成部分。通過本文的學(xué)習(xí),你應(yīng)該掌握了:
Docker Compose核心用法:從簡(jiǎn)單的WordPress部署到生產(chǎn)就緒的配置
私有倉(cāng)庫(kù)的選擇與應(yīng)用:從基礎(chǔ)的Registry到企業(yè)級(jí)的Harbor
鏡像生命周期管理:構(gòu)建、標(biāo)簽、推送、安全掃描的全流程
漸進(jìn)式演進(jìn)策略:從小規(guī)模起步到企業(yè)級(jí)架構(gòu)的平滑升級(jí)路徑
記住技術(shù)選擇的黃金法則:沒有最好的技術(shù),只有最適合的技術(shù)。根據(jù)你的團(tuán)隊(duì)規(guī)模、業(yè)務(wù)需求和資源預(yù)算,做出明智的選擇。
隨著云原生生態(tài)的快速發(fā)展,新的工具和技術(shù)不斷涌現(xiàn)。建議保持持續(xù)學(xué)習(xí)的習(xí)慣,關(guān)注:
- Docker Compose V2的新特性
- Harbor的最新版本和安全更新
- 新興的容器鏡像倉(cāng)庫(kù)解決方案
- GitOps和聲明式部署的趨勢(shì)
無論你是剛開始接觸容器技術(shù),還是已經(jīng)在生產(chǎn)環(huán)境中大規(guī)模使用,希望本文都能為你提供有價(jià)值的參考和指導(dǎo)。祝你在容器化的道路上越走越遠(yuǎn)!
相關(guān)文章
docker安裝OpenWebUI報(bào)錯(cuò)500的原因及解決方法
Open?WebUI是一個(gè)可擴(kuò)展、功能豐富且用戶友好的自托管WebUI,旨在完全離線操作,這篇文章主要介紹了docker安裝OpenWebUI報(bào)錯(cuò)500的原因及解決方法,需要的朋友可以參考下2025-07-07
Docker 容器全部停止的幾種方法實(shí)現(xiàn)
我們需要停止所有的容器時(shí),可以使用一些命令來實(shí)現(xiàn),本文主要介紹了Docker 容器全部停止的幾種方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Docker加載鏡像時(shí)報(bào)錯(cuò)no space left on device的徹底解
本文詳細(xì)記錄了在部署FastDDS鏡像時(shí)遇到磁盤空間不足的問題,并介紹了從排查到徹底解決的完整過程,通過分析根分區(qū)空間占用情況,將Docker數(shù)據(jù)根目錄遷移到大分區(qū),并修改daemon.json文件中的data-root配置,最終成功解決了問題,需要的朋友可以參考下2025-11-11
Docker連接超時(shí)的5種快速解決方法總結(jié)
在實(shí)際的開發(fā)和測(cè)試過程中,模擬網(wǎng)絡(luò)請(qǐng)求超時(shí)是非常有必要的,因?yàn)樵谡鎸?shí)的生產(chǎn)環(huán)境中,網(wǎng)絡(luò)請(qǐng)求超時(shí)是常見的情況之一,這篇文章主要介紹了Docker連接超時(shí)的5種快速解決方法,需要的朋友可以參考下2025-08-08
docker?run容器運(yùn)行的方法實(shí)現(xiàn)
本文主要介紹了docker?run容器運(yùn)行的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

