本内容聚焦**Docker Compose**实操应用,精简基础容器命令,主打多容器编排部署,汇总项目启停、配置编写、服务管理、环境调试等常用操作,适配日常项目快速搭建与运维场景。 ## 查看容器 **查看所有可用字段** ```bash ## 查看所有可用字段 docker ps --format "{{json .}}" { "Command": "\"/entrypoint.sh mysq…\"", "CreatedAt": "2026-02-01 21:47:18 +0800 CST", "HealthStatus": "healthy", "ID": "6591d25f9ae8", "Image": "mysql/mysql-server:5.7", "Labels": "com.docker.compose.config-hash=0d064f827a3e4a9d3bb3b2f01a6e80b32644cae8d996dfdb3d5a67f2c1ce843c,com.docker.compose.container-number=1,com.docker.compose.depends_on=,com.docker.compose.image=sha256:a4ad24fe52cdf82a35c6f2dae7670cfebf39357de983cb909db07c8b56df4dd1,com.docker.compose.oneoff=False,com.docker.compose.project.config_files=/www/server/panel/data/compose/app-compose/docker-compose.yaml,com.docker.compose.project.working_dir=/www/server/panel/data/compose/app-compose,com.docker.compose.project=app-compose,com.docker.compose.replace=mysql57,com.docker.compose.service=mysql57,com.docker.compose.version=2.39.1", "LocalVolumes": "1", "Mounts": "app-compose_my…", "Names": "mysql57", "Networks": "app-compose_default-network", "Platform": null, "Ports": "33060/tcp, 0.0.0.0:3307-\u003e3306/tcp, [::]:3307-\u003e3306/tcp", "RunningFor": "3 months ago", "Size": "88B (virtual 432MB)", "State": "running", "Status": "Up 9 hours (healthy)" } ``` **以表格形式(带标题)输出全部容器并指定字段** ```bash docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Size}}\t{{.State}}" -a 4155921bc878 watchtower 0B (virtual 17.4MB) exited 4cec5eb6ccf4 mysql80 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060-33061/tcp 90B (virtual 496MB) running 6591d25f9ae8 mysql57 33060/tcp, 0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp 88B (virtual 432MB) running ``` --- **配置默认格式,避免每次都要写** ```bash # ~/.docker/config.json 中添加 { "psFormat":"table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Size}}\t{{.State}}" } ``` **ps的等价命令** ```bash docker container ls -a CONTAINER ID NAMES PORTS SIZE STATE ff566067f269 interview-redis 0B (virtual 117MB) exited 0496f4af3dc7 interview-postgres 0B (virtual 438MB) exited 45feb05752c2 interview-rustfs 4.59kB (virtual 283MB) exited ``` ## 清理 **1.查看占用情况** ```bash docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 27 20 118.6GB 30.01GB (25%) Containers 20 11 8.126GB 7.91GB (97%) Local Volumes 11 9 4.139GB 83.92kB (0%) Build Cache 195 0 16.43GB 16.43GB ``` **2.查看所有容器** ```bash docker ps -a CONTAINER ID NAMES PORTS SIZE STATE ff566067f269 interview-redis 0B (virtual 117MB) exited 0496f4af3dc7 interview-postgres 0B (virtual 438MB) exited 45feb05752c2 interview-rustfs 4.59kB (virtual 283MB) exited 23bde4019011 litellm-litellm-1 18MB (virtual 1.91GB) exited 232c2fc8a015 litellm_db 0B (virtual 451MB) exited d21315add029 litellm-prometheus-1 0B (virtual 423MB) exited 746443e7e1e2 comfyui 0.0.0.0:8188->8188/tcp, [::]:8188->8188/tcp 70.9kB (virtual 24.8GB) running 042242fda663 trendradar-mcp 3333/tcp 25.4MB (virtual 379MB) running b5e42b4495ca open-webui 0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp 144MB (virtual 11.1GB) running 3ca0e6e24ca3 trendradar 0.0.0.0:8111->8080/tcp, [::]:8111->8080/tcp 23.8MB (virtual 395MB) running 25a072d4254c open-terminal 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp 236kB (virtual 3.59GB) running 966353720f1a rsshub-rsshub-1 0.0.0.0:1200->1200/tcp, [::]:1200->1200/tcp 22MB (virtual 1.08GB) running 7f333b32c20f pdfmathtranslate-next 1.53GB (virtual 3.97GB) exited 4155921bc878 watchtower 0B (virtual 17.4MB) exited e3d3dd5db852 books2audio 6.36GB (virtual 41.9GB) exited ebb43b3e78ef rsshub-real-browser-1 0.0.0.0:3001->3000/tcp, [::]:3001->3000/tcp 0B (virtual 1.98GB) running 1f25c6d1ae9f rsshub-browserless-1 3000/tcp 11B (virtual 3.06GB) running b6590ba1232d rsshub-redis-1 6379/tcp 0B (virtual 94.7MB) running 4cec5eb6ccf4 mysql80 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060-33061/tcp 90B (virtual 496MB) running 6591d25f9ae8 mysql57 33060/tcp, 0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp 88B (virtual 432MB) running ``` **3.查看所有卷** ```bash docker volume ls DRIVER VOLUME NAME local app-compose_mysql57 local app-compose_mysql80 local docker_chatterbox-models local docker_chatterbox-voices local interview_postgres_data local interview_redis_data local interview_rustfs_data local litellm_postgres_data local litellm_prometheus_data local open-webui local rsshub_redis-data ``` **4.查看所有网络** ```bash docker network ls \NETWORK ID NAME DRIVER SCOPE bebd1f2d39de app-compose_default-network bridge local 12c1fdcde363 baota_net bridge local 8ce21ad2033f book2audio-dev_default bridge local e3a084f959a2 bridge bridge local 5ac3bf6e2820 docker_default bridge local eb4ebd07320f host host local 338944cde06e interview_default bridge local 354a79465980 litellm_default bridge local 20a8f0d79d6c none null local aa94fe1ac046 rsshub_default bridge local 70f70089cc33 tools_default bridge local 2c0089785ed7 translate-tools_default bridge local ``` **5.查看当前上下文(连接的是哪里的docker)** ```bash docker context ls NAME DESCRIPTION DOCKER ENDPOINT ERROR default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock desktop-linux Docker Desktop npipe:////./pipe/dockerDesktopLinuxEngine ``` default后面带个 `*`说明这是当前正在使用的Docker引擎,也就是本地的。 而第二个 `desktop-linux`是Docker Desktop 安装时会自动创建 `desktop-linux` 这个 context,用来连接它内置的 Linux 虚拟机。 由于我现在完全使用WSL,所以决定删除 `desktop-linux`,但在这之前需要再次确认它已经失效: ```bash docker context use desktop-linux docker ps ``` 结果显示 `Failed to initialize: protocol not available`说明已经不可用了,可用放心删除了。 ```bash docker context rm desktop-linux ``` **6.查看所有镜像** ```bash docker image ls i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA awwaawwa/pdfmathtranslate-next:latest 9462f7dfbc82 2.44GB 0B U books2audio:latest f8e880e0d490 35.5GB 0B U browserless/chrome:latest c6321df7e375 3.06GB 0B U containrrr/watchtower:latest e7dd50d07b86 14.7MB 0B ``` **7.删除容器** 删除**已停止**的容器 `docker container prune` 强制删除**单个**容器 `docker rm -f ` 删除**所有**容器(包括运行中) `docker rm -f $(docker ps -aq)` 批量删除匹配名称的 `docker ps -aqf "name=xxx" \| xargs docker rm -f` ```bash # 删除interview、litellm、rsshub开头的几个CONTAINER docker ps -aqf "name=interview" | xargs docker rm -f docker ps -aqf "name=litellm" | xargs docker rm -f docker ps -aqf "name=rsshub" | xargs docker rm -f ``` **8.删除image** 删除**悬空镜像**(无标签) `docker image prune` 删除**所有未使用**镜像 `docker image prune -a` 强制删除单个镜像 `docker rmi -f ` 批量删除匹配仓库的 `docker images -q "repo/*" \| xargs docker rmi` **9.删除卷** | 场景 | 命令 | ⚠️ 风险 | | -------------------- | ------------------------- | -------------- | | 删除**未被挂载**的卷 | `docker volume prune` | **数据会丢失** | | 删除**指定**卷 | `docker volume rm ` | 确认无容器使用 | | 查看卷占用空间 | `docker system df -v` | 仅查看,不删除 | **10.删除网络** | 场景 | 命令 | | --------------------------------------- | -------------------------- | | 删除**未被使用**的网络 | `docker network prune` | | 删除手动创建的指定网络 | `docker network rm ` | | 注意:默认的`bridge/host/none` 不会被删 | | ## 启动 我喜欢再docker-compose.yaml中配置好一切后一键启动。 ```yaml name: default networks: default-network: # 内部别名 external: true # 引用外部已有的网络 name: shared-network #全局可见的真实名称 volumes: open-webui: external: true # 该名称为全局的 不会添加项目前缀 name: open-webui # 显式写一眼就知道全局真实名称 mysql57: external: true name: mysql57 mysql80: external: true name: mysql80 services: open-webui: image: ghcr.io/open-webui/open-webui:cuda container_name: open-webui # 手动指定容器名称,全局唯一 restart: unless-stopped ports: - "3000:8080" extra_hosts: - "host.docker.internal:host-gateway" volumes: - open-webui:/app/backend/data deploy: resources: reservations: devices: - driver: nvidia count: all # 你只有一张卡,写 1 即可 capabilities: [gpu] networks: - default-network labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 mysql80: image: mysql/mysql-server:8.0 container_name: mysql80 # 手动指定容器名称,全局唯一 restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" ports: - "3306:3306" volumes: - mysql80:/var/lib/mysql networks: - default-network environment: MYSQL_ROOT_PASSWORD: root mysql57: image: mysql/mysql-server:5.7 container_name: mysql57 # 手动指定容器名称,全局唯一 restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" ports: - "3307:3306" volumes: - mysql57:/var/lib/mysql networks: - default-network environment: MYSQL_ROOT_PASSWORD: root comfyui: # 使用针对最新显卡优化的 cu124 镜像 image: yanwk/comfyui-boot:cu128-megapak-pt29 container_name: comfyui restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" networks: - default-network ports: - "8188:8188" environment: - HTTP_PROXY=http://${WINDOWS_HOST_IP}:10808 - HTTPS_PROXY=http://${WINDOWS_HOST_IP}:10808 - NO_PROXY=localhost,127.0.0.1,.local,host.docker.internal,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - TZ=Asia/Shanghai # 自动更新 ComfyUI 主程序 - AUTO_UPDATE=true # 针对 4060 Ti 的建议启动参数:开启监听,启用预览 - CLI_ARGS=--listen --preview-method auto --use-sage-attention --disable-xformers volumes: # 核心程序逻辑 - /mnt/g/AITools/comfy/comfy_docker:/root # 模型分流存储 - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/models:/root/ComfyUI/models - /mnt/g/AITools/comfy/comfy_docker/ComfyUI/custom_nodes:/root/ComfyUI/custom_nodes - /mnt/c/Users/fqq13/.cache/huggingface/hub:/root/.cache/huggingface/hub - /mnt/c/Users/fqq13/.cache/torch/hub:/root/.cache/torch/hub # 用户数据与成果 - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/input:/root/ComfyUI/input - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/output:/root/ComfyUI/output - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/user/default/workflows:/root/ComfyUI/user/default/workflows deploy: resources: reservations: devices: - driver: nvidia count: all # 你只有一张卡,写 1 即可 capabilities: [gpu] labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 trendradar: image: wantcat/trendradar:latest container_name: trendradar restart: unless-stopped networks: - default-network extra_hosts: - "host.docker.internal:host-gateway" ports: - "8111:8080" volumes: - /mnt/g/code/2TOOL/trendRadar/config:/app/config:ro - /mnt/g/code/2TOOL/trendRadar/output:/app/output environment: - HTTP_PROXY=http://${WINDOWS_HOST_IP}:10808 - HTTPS_PROXY=http://${WINDOWS_HOST_IP}:10808 - NO_PROXY=localhost,127.0.0.1,.local,host.docker.internal,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - TZ=Asia/Shanghai # Web 服务器 - ENABLE_WEBSERVER=${ENABLE_WEBSERVER:-false} - WEBSERVER_PORT=8080 - CRON_SCHEDULE=${CRON_SCHEDULE:-*/30 * * * *} - RUN_MODE=${RUN_MODE:-cron} - IMMEDIATE_RUN=${IMMEDIATE_RUN:-true} labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 trendradar-mcp: image: wantcat/trendradar-mcp:latest container_name: trendradar-mcp restart: unless-stopped networks: - default-network extra_hosts: - "host.docker.internal:host-gateway" # ports: # - "3333:3333" volumes: - /mnt/g/code/2TOOL/trendRadar/config:/app/config:ro - /mnt/g/code/2TOOL/trendRadar/output:/app/output environment: - TZ=Asia/Shanghai - HTTP_PROXY=http://${WINDOWS_HOST_IP}:10808 - HTTPS_PROXY=http://${WINDOWS_HOST_IP}:10808 - NO_PROXY=localhost,127.0.0.1,.local,host.docker.internal,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 ``` **在docker-compose.yaml同目录下执行** ```bash docker compose up -d ``` ## 停止 **移除容器及其网络** ```bash docker-compose down ``` **移除容器同时移除卷** 但这个命令不会删除配置了`external: true`的卷 ```bash docker-compose down -v ``` 这里有个问题,在WSL下直接down,但是Forwarded port来不及处理,/usr/bin/docker-proxy进程没有关闭导致docker认为相关network还在使用中所以不会清理。 所以最好是先stop再down,如果已经出现了如上情况可以按照以下操作来清理无用的docker-proxy进程。 ```bash # 先删除相关network docker network rm # 杀死docker-proxy进程 sudo killall -9 docker-proxy # 重启docker sudo systemctl restart docker # 重新检查端口映射是否正确 不含无效映射 ps aux | grep docker-proxy ``` ## 运维 ```bash # 查看所有运行中的compose projects docker compose ls docker compose stop|restart|start # compose中每个容器的资源占用情况 docker compose stats # 查看compose日志,实时日志 docker compose logs --tail 1000 -f # 查看指定容器的日志 docker logs -f # 查看容器的具体状态(卷,网络等) docker inspect # 查看磁盘占用情况 docker system df ``` 日常运维我更喜欢直接用**vscode**上的EXTENSIONS 名为:`Container Tools`,功能齐全,所有操作的命令会体现在TERMINAL中。CONTAINERS面板中可以直接查看容器的文件目录。 docker compose则以文件夹的形式展示,一个文件夹下包含其所有服务,很难不爱。 Loading... 本内容聚焦**Docker Compose**实操应用,精简基础容器命令,主打多容器编排部署,汇总项目启停、配置编写、服务管理、环境调试等常用操作,适配日常项目快速搭建与运维场景。 ## 查看容器 **查看所有可用字段** ```bash ## 查看所有可用字段 docker ps --format "{{json .}}" { "Command": "\"/entrypoint.sh mysq…\"", "CreatedAt": "2026-02-01 21:47:18 +0800 CST", "HealthStatus": "healthy", "ID": "6591d25f9ae8", "Image": "mysql/mysql-server:5.7", "Labels": "com.docker.compose.config-hash=0d064f827a3e4a9d3bb3b2f01a6e80b32644cae8d996dfdb3d5a67f2c1ce843c,com.docker.compose.container-number=1,com.docker.compose.depends_on=,com.docker.compose.image=sha256:a4ad24fe52cdf82a35c6f2dae7670cfebf39357de983cb909db07c8b56df4dd1,com.docker.compose.oneoff=False,com.docker.compose.project.config_files=/www/server/panel/data/compose/app-compose/docker-compose.yaml,com.docker.compose.project.working_dir=/www/server/panel/data/compose/app-compose,com.docker.compose.project=app-compose,com.docker.compose.replace=mysql57,com.docker.compose.service=mysql57,com.docker.compose.version=2.39.1", "LocalVolumes": "1", "Mounts": "app-compose_my…", "Names": "mysql57", "Networks": "app-compose_default-network", "Platform": null, "Ports": "33060/tcp, 0.0.0.0:3307-\u003e3306/tcp, [::]:3307-\u003e3306/tcp", "RunningFor": "3 months ago", "Size": "88B (virtual 432MB)", "State": "running", "Status": "Up 9 hours (healthy)" } ``` **以表格形式(带标题)输出全部容器并指定字段** ```bash docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Size}}\t{{.State}}" -a 4155921bc878 watchtower 0B (virtual 17.4MB) exited 4cec5eb6ccf4 mysql80 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060-33061/tcp 90B (virtual 496MB) running 6591d25f9ae8 mysql57 33060/tcp, 0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp 88B (virtual 432MB) running ``` --- **配置默认格式,避免每次都要写** ```bash # ~/.docker/config.json 中添加 { "psFormat":"table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Size}}\t{{.State}}" } ``` **ps的等价命令** ```bash docker container ls -a CONTAINER ID NAMES PORTS SIZE STATE ff566067f269 interview-redis 0B (virtual 117MB) exited 0496f4af3dc7 interview-postgres 0B (virtual 438MB) exited 45feb05752c2 interview-rustfs 4.59kB (virtual 283MB) exited ``` ## 清理 **1.查看占用情况** ```bash docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 27 20 118.6GB 30.01GB (25%) Containers 20 11 8.126GB 7.91GB (97%) Local Volumes 11 9 4.139GB 83.92kB (0%) Build Cache 195 0 16.43GB 16.43GB ``` **2.查看所有容器** ```bash docker ps -a CONTAINER ID NAMES PORTS SIZE STATE ff566067f269 interview-redis 0B (virtual 117MB) exited 0496f4af3dc7 interview-postgres 0B (virtual 438MB) exited 45feb05752c2 interview-rustfs 4.59kB (virtual 283MB) exited 23bde4019011 litellm-litellm-1 18MB (virtual 1.91GB) exited 232c2fc8a015 litellm_db 0B (virtual 451MB) exited d21315add029 litellm-prometheus-1 0B (virtual 423MB) exited 746443e7e1e2 comfyui 0.0.0.0:8188->8188/tcp, [::]:8188->8188/tcp 70.9kB (virtual 24.8GB) running 042242fda663 trendradar-mcp 3333/tcp 25.4MB (virtual 379MB) running b5e42b4495ca open-webui 0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp 144MB (virtual 11.1GB) running 3ca0e6e24ca3 trendradar 0.0.0.0:8111->8080/tcp, [::]:8111->8080/tcp 23.8MB (virtual 395MB) running 25a072d4254c open-terminal 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp 236kB (virtual 3.59GB) running 966353720f1a rsshub-rsshub-1 0.0.0.0:1200->1200/tcp, [::]:1200->1200/tcp 22MB (virtual 1.08GB) running 7f333b32c20f pdfmathtranslate-next 1.53GB (virtual 3.97GB) exited 4155921bc878 watchtower 0B (virtual 17.4MB) exited e3d3dd5db852 books2audio 6.36GB (virtual 41.9GB) exited ebb43b3e78ef rsshub-real-browser-1 0.0.0.0:3001->3000/tcp, [::]:3001->3000/tcp 0B (virtual 1.98GB) running 1f25c6d1ae9f rsshub-browserless-1 3000/tcp 11B (virtual 3.06GB) running b6590ba1232d rsshub-redis-1 6379/tcp 0B (virtual 94.7MB) running 4cec5eb6ccf4 mysql80 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060-33061/tcp 90B (virtual 496MB) running 6591d25f9ae8 mysql57 33060/tcp, 0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp 88B (virtual 432MB) running ``` **3.查看所有卷** ```bash docker volume ls DRIVER VOLUME NAME local app-compose_mysql57 local app-compose_mysql80 local docker_chatterbox-models local docker_chatterbox-voices local interview_postgres_data local interview_redis_data local interview_rustfs_data local litellm_postgres_data local litellm_prometheus_data local open-webui local rsshub_redis-data ``` **4.查看所有网络** ```bash docker network ls \NETWORK ID NAME DRIVER SCOPE bebd1f2d39de app-compose_default-network bridge local 12c1fdcde363 baota_net bridge local 8ce21ad2033f book2audio-dev_default bridge local e3a084f959a2 bridge bridge local 5ac3bf6e2820 docker_default bridge local eb4ebd07320f host host local 338944cde06e interview_default bridge local 354a79465980 litellm_default bridge local 20a8f0d79d6c none null local aa94fe1ac046 rsshub_default bridge local 70f70089cc33 tools_default bridge local 2c0089785ed7 translate-tools_default bridge local ``` **5.查看当前上下文(连接的是哪里的docker)** ```bash docker context ls NAME DESCRIPTION DOCKER ENDPOINT ERROR default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock desktop-linux Docker Desktop npipe:////./pipe/dockerDesktopLinuxEngine ``` default后面带个 `*`说明这是当前正在使用的Docker引擎,也就是本地的。 而第二个 `desktop-linux`是Docker Desktop 安装时会自动创建 `desktop-linux` 这个 context,用来连接它内置的 Linux 虚拟机。 由于我现在完全使用WSL,所以决定删除 `desktop-linux`,但在这之前需要再次确认它已经失效: ```bash docker context use desktop-linux docker ps ``` 结果显示 `Failed to initialize: protocol not available`说明已经不可用了,可用放心删除了。 ```bash docker context rm desktop-linux ``` **6.查看所有镜像** ```bash docker image ls i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA awwaawwa/pdfmathtranslate-next:latest 9462f7dfbc82 2.44GB 0B U books2audio:latest f8e880e0d490 35.5GB 0B U browserless/chrome:latest c6321df7e375 3.06GB 0B U containrrr/watchtower:latest e7dd50d07b86 14.7MB 0B ``` **7.删除容器** 删除**已停止**的容器 `docker container prune` 强制删除**单个**容器 `docker rm -f <ID/Name>` 删除**所有**容器(包括运行中) `docker rm -f $(docker ps -aq)` 批量删除匹配名称的 `docker ps -aqf "name=xxx" \| xargs docker rm -f` ```bash # 删除interview、litellm、rsshub开头的几个CONTAINER docker ps -aqf "name=interview" | xargs docker rm -f docker ps -aqf "name=litellm" | xargs docker rm -f docker ps -aqf "name=rsshub" | xargs docker rm -f ``` **8.删除image** 删除**悬空镜像**(无标签) `docker image prune` 删除**所有未使用**镜像 `docker image prune -a` 强制删除单个镜像 `docker rmi -f <IMAGE_ID>` 批量删除匹配仓库的 `docker images -q "repo/*" \| xargs docker rmi` **9.删除卷** | 场景 | 命令 | ⚠️ 风险 | | -------------------- | ------------------------- | -------------- | | 删除**未被挂载**的卷 | `docker volume prune` | **数据会丢失** | | 删除**指定**卷 | `docker volume rm <NAME>` | 确认无容器使用 | | 查看卷占用空间 | `docker system df -v` | 仅查看,不删除 | **10.删除网络** | 场景 | 命令 | | --------------------------------------- | -------------------------- | | 删除**未被使用**的网络 | `docker network prune` | | 删除手动创建的指定网络 | `docker network rm <NAME>` | | 注意:默认的`bridge/host/none` 不会被删 | | ## 启动 我喜欢再docker-compose.yaml中配置好一切后一键启动。 ```yaml name: default networks: default-network: # 内部别名 external: true # 引用外部已有的网络 name: shared-network #全局可见的真实名称 volumes: open-webui: external: true # 该名称为全局的 不会添加项目前缀 name: open-webui # 显式写一眼就知道全局真实名称 mysql57: external: true name: mysql57 mysql80: external: true name: mysql80 services: open-webui: image: ghcr.io/open-webui/open-webui:cuda container_name: open-webui # 手动指定容器名称,全局唯一 restart: unless-stopped ports: - "3000:8080" extra_hosts: - "host.docker.internal:host-gateway" volumes: - open-webui:/app/backend/data deploy: resources: reservations: devices: - driver: nvidia count: all # 你只有一张卡,写 1 即可 capabilities: [gpu] networks: - default-network labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 mysql80: image: mysql/mysql-server:8.0 container_name: mysql80 # 手动指定容器名称,全局唯一 restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" ports: - "3306:3306" volumes: - mysql80:/var/lib/mysql networks: - default-network environment: MYSQL_ROOT_PASSWORD: root mysql57: image: mysql/mysql-server:5.7 container_name: mysql57 # 手动指定容器名称,全局唯一 restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" ports: - "3307:3306" volumes: - mysql57:/var/lib/mysql networks: - default-network environment: MYSQL_ROOT_PASSWORD: root comfyui: # 使用针对最新显卡优化的 cu124 镜像 image: yanwk/comfyui-boot:cu128-megapak-pt29 container_name: comfyui restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" networks: - default-network ports: - "8188:8188" environment: - HTTP_PROXY=http://${WINDOWS_HOST_IP}:10808 - HTTPS_PROXY=http://${WINDOWS_HOST_IP}:10808 - NO_PROXY=localhost,127.0.0.1,.local,host.docker.internal,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - TZ=Asia/Shanghai # 自动更新 ComfyUI 主程序 - AUTO_UPDATE=true # 针对 4060 Ti 的建议启动参数:开启监听,启用预览 - CLI_ARGS=--listen --preview-method auto --use-sage-attention --disable-xformers volumes: # 核心程序逻辑 - /mnt/g/AITools/comfy/comfy_docker:/root # 模型分流存储 - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/models:/root/ComfyUI/models - /mnt/g/AITools/comfy/comfy_docker/ComfyUI/custom_nodes:/root/ComfyUI/custom_nodes - /mnt/c/Users/fqq13/.cache/huggingface/hub:/root/.cache/huggingface/hub - /mnt/c/Users/fqq13/.cache/torch/hub:/root/.cache/torch/hub # 用户数据与成果 - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/input:/root/ComfyUI/input - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/output:/root/ComfyUI/output - /mnt/g/AITools/comfy/ComfyUI_windows_portable/ComfyUI/user/default/workflows:/root/ComfyUI/user/default/workflows deploy: resources: reservations: devices: - driver: nvidia count: all # 你只有一张卡,写 1 即可 capabilities: [gpu] labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 trendradar: image: wantcat/trendradar:latest container_name: trendradar restart: unless-stopped networks: - default-network extra_hosts: - "host.docker.internal:host-gateway" ports: - "8111:8080" volumes: - /mnt/g/code/2TOOL/trendRadar/config:/app/config:ro - /mnt/g/code/2TOOL/trendRadar/output:/app/output environment: - HTTP_PROXY=http://${WINDOWS_HOST_IP}:10808 - HTTPS_PROXY=http://${WINDOWS_HOST_IP}:10808 - NO_PROXY=localhost,127.0.0.1,.local,host.docker.internal,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - TZ=Asia/Shanghai # Web 服务器 - ENABLE_WEBSERVER=${ENABLE_WEBSERVER:-false} - WEBSERVER_PORT=8080 - CRON_SCHEDULE=${CRON_SCHEDULE:-*/30 * * * *} - RUN_MODE=${RUN_MODE:-cron} - IMMEDIATE_RUN=${IMMEDIATE_RUN:-true} labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 trendradar-mcp: image: wantcat/trendradar-mcp:latest container_name: trendradar-mcp restart: unless-stopped networks: - default-network extra_hosts: - "host.docker.internal:host-gateway" # ports: # - "3333:3333" volumes: - /mnt/g/code/2TOOL/trendRadar/config:/app/config:ro - /mnt/g/code/2TOOL/trendRadar/output:/app/output environment: - TZ=Asia/Shanghai - HTTP_PROXY=http://${WINDOWS_HOST_IP}:10808 - HTTPS_PROXY=http://${WINDOWS_HOST_IP}:10808 - NO_PROXY=localhost,127.0.0.1,.local,host.docker.internal,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 labels: - com.centurylinklabs.watchtower.enable=true # 标记该容器需要被 Watchtower 自动更新 ``` **在docker-compose.yaml同目录下执行** ```bash docker compose up -d ``` ## 停止 **移除容器及其网络** ```bash docker-compose down ``` **移除容器同时移除卷** 但这个命令不会删除配置了`external: true`的卷 ```bash docker-compose down -v ``` 这里有个问题,在WSL下直接down,但是Forwarded port来不及处理,/usr/bin/docker-proxy进程没有关闭导致docker认为相关network还在使用中所以不会清理。 所以最好是先stop再down,如果已经出现了如上情况可以按照以下操作来清理无用的docker-proxy进程。 ```bash # 先删除相关network docker network rm <NAME> # 杀死docker-proxy进程 sudo killall -9 docker-proxy # 重启docker sudo systemctl restart docker # 重新检查端口映射是否正确 不含无效映射 ps aux | grep docker-proxy ``` ## 运维 ```bash # 查看所有运行中的compose projects docker compose ls docker compose stop|restart|start # compose中每个容器的资源占用情况 docker compose stats # 查看compose日志,实时日志 docker compose logs --tail 1000 -f # 查看指定容器的日志 docker logs -f <ID/Name> # 查看容器的具体状态(卷,网络等) docker inspect <Name|ID> # 查看磁盘占用情况 docker system df ``` 日常运维我更喜欢直接用**vscode**上的EXTENSIONS 名为:`Container Tools`,功能齐全,所有操作的命令会体现在TERMINAL中。CONTAINERS面板中可以直接查看容器的文件目录。 docker compose则以文件夹的形式展示,一个文件夹下包含其所有服务,很难不爱。 最后修改:2026 年 06 月 04 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 你的点赞将成为我坚持的动力,之一