腾讯云轻量服务器Docker容器化部署实战:从零搭建多应用环境
1. 项目概述为什么我们需要容器化部署刚接触服务器运维的朋友可能都有过这样的经历为了部署一个博客、一个网盘或者一个数据库在服务器上折腾半天又是装环境又是配依赖好不容易跑起来了结果发现和另一个应用的环境冲突了端口被占用了或者系统库版本不兼容。更头疼的是一旦服务器系统需要重装或者迁移所有应用都得重新部署一遍过程繁琐且容易出错。这就是我当初从传统部署转向 Docker 容器化的直接动力。今天要聊的就是如何利用腾讯云轻量应用服务器这种性价比极高的“小水管”通过 Docker 技术实现“一机多用”——在一台服务器上稳定、隔离地运行多个应用。轻量服务器通常配置不高比如 2核4G但价格亲民非常适合个人开发者、小微团队或个人站长。传统部署方式下多个应用混在一起资源争抢、环境污染是常态而 Docker 提供的容器化方案恰恰能完美解决这些问题。简单来说你可以把 Docker 容器想象成一个个标准化的、轻量级的“软件集装箱”。每个集装箱里都打包好了一个应用及其运行所需的所有环境代码、运行时、系统工具、库。这些集装箱相互隔离互不干扰但又能共享宿主机的操作系统内核因此比虚拟机更轻便、启动更快、资源开销更小。在腾讯云轻量服务器上实践 Docker意味着你可以用有限的资源同时运行你的 WordPress 博客、Nextcloud 私有云、MySQL 数据库、乃至一些自研的微服务并且管理起来井井有条。这篇文章我将以一个从零开始的视角带你完成从购买服务器、安装 Docker到部署多个容器应用的全过程。我会重点分享在轻量服务器这种资源受限环境下如何优化配置、避免踩坑以及如何编排容器让它们协同工作。无论你是想搭建个人技术栈还是为小项目构建测试环境这套方法都能让你事半功倍。2. 核心概念与准备工作理解 Docker 与轻量服务器在动手之前我们有必要先理清几个核心概念并做好准备工作。这能帮助你在后续操作中知其然更知其所以然。2.1 Docker 核心三要素镜像、容器、仓库Docker 的运作围绕着三个核心概念理解它们就等于理解了 Docker 的一半。镜像Image这是一个只读的模板类似于安装软件的“光盘”或“安装包”。它包含了运行某个软件所需的所有内容代码、运行时环境、库、环境变量和配置文件。例如nginx:latest就是一个包含了 Nginx Web 服务器的镜像。镜像是创建容器的基础。容器Container这是镜像的运行实例。你可以把它理解为从镜像这张“光盘”安装并运行起来的“软件”。容器是独立、可执行的单元拥有自己的文件系统、网络和进程空间。我们操作和交互的对象主要就是容器。仓库Repository用于集中存放镜像的地方类似于代码仓库 GitHub。Docker 官方的公共仓库是 Docker Hub上面有海量官方和个人维护的镜像。腾讯云等云厂商也提供容器镜像服务在国内访问速度更快。它们的关系是从仓库拉取Pull镜像到本地然后通过镜像创建并运行Run容器。2.2 腾讯云轻量应用服务器选型与初始化腾讯云轻量应用服务器Lighthouse主打简单易用、性价比高预装了常见应用镜像但对于 Docker 环境我建议选择“系统镜像”而非“应用镜像”以便获得纯净的操作系统环境。服务器选购建议地域选择离你的目标用户最近的地域国内用户通常选“广州”、“上海”、“北京”。镜像强烈推荐选择 Ubuntu Server 22.04 LTS 或 CentOS 7.9。这两个系统社区支持完善Docker 文档丰富。本文将以Ubuntu 22.04为例进行演示。配置对于入门和跑多个轻量级应用如博客、静态网站、小型数据库2核CPU、4GB内存、80GB SSD盘的配置是甜点级选择性价比最高。如果预算充足或应用较重可以考虑4核8G。服务器初始化安全设置购买完成后第一件事不是安装 Docker而是加固服务器安全。设置 SSH 密钥登录必做在腾讯云控制台为服务器创建或绑定 SSH 密钥并禁用密码登录。这能极大避免暴力破解。配置防火墙安全组腾讯云轻量服务器有自带的防火墙。初期只开放必要端口22SSH、80HTTP、443HTTPS。其他应用端口如数据库的3306切勿直接对公网开放应通过后续 Docker 网络或 SSH 隧道访问。系统更新登录服务器后首先执行sudo apt update sudo apt upgrade -yUbuntu更新系统软件包。注意牢记“最小权限原则”。不要用 root 用户直接操作 Docker。我们将创建一个具有 sudo 权限的普通用户来管理 Docker。2.3 本地环境准备SSH 客户端与工具你需要一个 SSH 客户端来连接服务器。Windows推荐使用PowerShellWin10/11 自带或Windows Terminal它们现在都原生支持 SSH 命令。也可以使用老牌的 PuTTY。macOS/Linux直接使用系统自带的终端Terminal。连接命令通常为ssh -i /path/to/your/private_key.pem ubuntu你的服务器公网IP。其中ubuntu是 Ubuntu 系统的默认用户名如果是 CentOS则为root或centos。3. Docker 引擎安装与基础配置实战现在我们开始在纯净的 Ubuntu 22.04 服务器上安装 Docker。3.1 使用官方脚本安装 Docker Engine虽然 Ubuntu 仓库里有 Docker 包但版本往往较旧。我们采用 Docker 官方提供的便捷安装脚本。# 1. 更新 apt 包索引并安装依赖让 apt 可以通过 HTTPS 使用仓库 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release # 2. 添加 Docker 的官方 GPG 密钥用于验证软件包签名 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 3. 设置稳定的 Docker 仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 4. 再次更新 apt 包索引并安装 Docker 引擎及相关组件 sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin安装完成后Docker 服务会自动启动。你可以运行sudo systemctl status docker来检查服务状态看到active (running)就说明成功了。3.2 管理权限配置与免 sudo 执行 Docker 命令默认情况下执行docker命令需要sudo权限。为了避免每次都要输入sudo我们可以将当前用户加入docker用户组。# 将当前登录用户如 ubuntu添加到 docker 用户组 sudo usermod -aG docker $USER重要提示执行此命令后你必须完全退出当前 SSH 会话然后重新登录用户组变更才会生效。重新登录后你就可以直接运行docker version来验证安装和权限了。3.3 配置 Docker 镜像加速器由于网络原因从 Docker Hub 拉取镜像可能会非常慢。我们需要配置国内镜像加速器。这里以腾讯云镜像加速为例其他厂商如阿里云、中科大也有类似服务。登录腾讯云容器镜像服务控制台在“镜像加速器”页面获取你的专属加速器地址。编辑 Docker 守护进程配置文件sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://mirror.ccs.tencentyun.com ] } EOF重新加载配置并重启 Docker 服务sudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效运行docker info在输出结果中查找Registry Mirrors如果看到你配置的地址说明成功。3.4 Docker 基本命令速览与理解安装配置好后我们来熟悉几个最核心的命令这是后续所有操作的基础。docker pull nginx:latest从仓库拉取名为nginx标签为latest的镜像。docker images列出本地已下载的所有镜像。docker run -d -p 80:80 --name my-nginx nginx:latest这是最关键的运行命令。-d后台运行detached mode。-p 80:80端口映射将宿主机的 80 端口映射到容器的 80 端口。--name my-nginx给容器起一个名字方便管理。nginx:latest基于哪个镜像来创建容器。docker ps查看正在运行的容器。加-a参数查看所有包括已停止的。docker stop my-nginx停止指定容器。docker start my-nginx启动已停止的容器。docker rm my-nginx删除已停止的容器加-f可强制删除运行中的。docker rmi nginx:latest删除本地镜像。实操心得docker run命令参数很多不必死记硬背。记住最常用的-d、-p、--name、-v数据卷后面会讲即可。其他参数用到时随时查文档docker run --help。4. 单容器部署实战以 Nginx 和 MySQL 为例理论说再多不如动手跑一个。我们从最简单的单容器部署开始目标是跑起一个 Nginx 网站和一个 MySQL 数据库。4.1 部署第一个容器Nginx 静态网站我们的目标是在服务器 80 端口提供一个简单的网页。拉取镜像docker pull nginx:latest运行容器docker run -d \ --name my-web \ -p 80:80 \ nginx:latest执行后访问你的服务器公网 IP应该就能看到 Nginx 的欢迎页面了。自定义网页内容默认页面没意思我们把自己的网页放进去。这里引入 Docker 另一个核心概念数据卷挂载Volume。它可以将宿主机上的一个目录“映射”到容器内部从而实现数据持久化和动态修改。在宿主机上创建一个目录存放网站文件mkdir -p ~/web/html创建一个简单的index.htmlecho h1Hello from Docker on Lighthouse!/h1 ~/web/html/index.html停止并删除旧容器docker stop my-web docker rm my-web重新运行容器并挂载数据卷docker run -d \ --name my-web \ -p 80:80 \ -v /home/ubuntu/web/html:/usr/share/nginx/html:ro \ nginx:latest-v /home/ubuntu/web/html:/usr/share/nginx/html:ro将宿主机的/home/ubuntu/web/html目录挂载到容器的/usr/share/nginx/htmlNginx 默认网站根目录。:ro表示“只读”防止容器内进程误修改宿主机文件。现在刷新浏览器就能看到你自己编写的 “Hello from Docker on Lighthouse!” 页面了。以后只需在宿主机~/web/html目录下更新文件网站内容就会实时变化容器无需重启。4.2 部署有状态应用MySQL 数据库数据库的数据必须持久化不能随着容器销毁而丢失。同时数据库的配置和密码也需要妥善管理。拉取镜像docker pull mysql:8.0建议指定版本号而非 latest以保证环境一致性运行 MySQL 容器docker run -d \ --name my-mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourStrongPassword123! \ -e MYSQL_DATABASEmyapp \ -e MYSQL_USERmyuser \ -e MYSQL_PASSWORDMyUserPassword456! \ -v mysql_data:/var/lib/mysql \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci-e设置环境变量。这是向容器传递配置如密码的标准方式。务必使用强密码并避免在命令历史中留下痕迹生产环境应用更安全的方式。-v mysql_data:/var/lib/mysql这里使用了命名数据卷mysql_data。Docker 会自动在宿主机创建一个管理区域来存储这个卷数据会持久化在此即使容器被删除。使用docker volume ls可以查看所有数据卷。最后的--character-set-server...参数是直接传递给mysqld进程的用于设置默认字符集为utf8mb4支持完整的 Unicode如表情符号。连接测试首先非常重要我们映射了-p 3306:3306这意味着数据库端口暴露在了公网。在生产环境中这是极其危险的行为这里仅为演示。正确做法是不要映射 3306 端口让其他容器通过 Docker 内部网络访问后面会讲或通过 SSH 隧道连接。你可以使用本地 MySQL 客户端如 MySQL Workbench通过服务器IP:3306连接验证数据库是否正常运行。注意事项环境变量中的密码是明文。对于生产环境更安全的做法是使用 Docker Secrets在 Swarm 模式下或将敏感信息存放在文件中通过--env-file参数传入。对于单机也要确保配置文件权限为600。5. 多容器应用编排使用 Docker Compose当我们需要同时管理多个关联的容器例如一个 Web 应用需要搭配数据库和缓存时反复使用docker run命令会非常低效且容易出错。Docker Compose 正是为了解决这个问题而生。它通过一个 YAML 文件docker-compose.yml来定义和运行多容器应用。5.1 Docker Compose 安装与概念我们在安装 Docker 时已经通过docker-compose-plugin安装了 Compose 的 V2 版本。可以通过docker compose version来验证。Compose 的核心是docker-compose.yml文件。在这个文件里你可以定义服务Services每个容器就是一个服务你可以定义它的镜像、端口、环境变量、数据卷等。网络Networks为这些服务创建独立的网络让它们能通过服务名互相通信而无需知道 IP。数据卷Volumes定义命名的数据卷供多个服务共享或单独使用。5.2 编写第一个 Compose 文件WordPress 博客系统让我们部署一个经典的 WordPress 博客它需要两个容器WordPressPHP 应用和 MySQL数据库。创建一个项目目录并进入mkdir ~/wordpress cd ~/wordpress创建docker-compose.yml文件version: 3.8 # 指定 Compose 文件格式版本 services: # 数据库服务 db: image: mysql:8.0 container_name: wp_db restart: always # 总是重启确保服务高可用 environment: MYSQL_ROOT_PASSWORD: some_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: some_wordpress_password volumes: - db_data:/var/lib/mysql # 使用命名卷持久化数据库 networks: - wp_network command: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci # WordPress 应用服务 wordpress: depends_on: - db # 声明依赖先启动 db image: wordpress:latest container_name: wp_app restart: always ports: - 8080:80 # 将宿主机的 8080 端口映射到容器的 80 端口 environment: WORDPRESS_DB_HOST: db # 关键这里用服务名“db”连接数据库 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: some_wordpress_password WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html # 持久化 WordPress 程序文件主题、插件等 networks: - wp_network # 定义命名数据卷 volumes: db_data: wp_data: # 定义自定义网络 networks: wp_network: driver: bridge关键点解析WORDPRESS_DB_HOST: dbWordPress 容器通过服务名db来访问 MySQL 容器而不是 IP 地址。这是因为它们在同一个自定义网络wp_network下Docker 内置了 DNS 解析。depends_on确保db服务先于wordpress服务启动但并不等待数据库真正初始化完成。对于数据库应用层需要有连接重试机制。ports: - 8080:80因为宿主机的 80 端口可能已被之前的 Nginx 占用我们映射到 8080 端口。你可以根据需要修改。在docker-compose.yml所在目录一键启动所有服务docker compose up -d-d表示后台运行。Compose 会自动拉取镜像如果本地没有、创建网络、数据卷并按依赖顺序启动容器。访问http://你的服务器IP:8080你应该能看到 WordPress 的著名安装界面了。按照提示完成安装。5.3 Compose 常用管理命令docker compose up -d创建并启动所有服务。docker compose down停止并移除所有容器、网络默认不移除数据卷。docker compose down -v停止并移除所有容器、网络以及数据卷数据会丢失。docker compose ps查看本项目下的容器状态。docker compose logs [service_name]查看指定服务的日志加-f可以实时跟踪。docker compose exec db mysql -u root -p在名为db的服务容器中执行命令这里示例是进入 MySQL 交互终端。使用 Docker Compose整个多容器应用就像一个整体启停、更新、配置都变得异常简单。你可以把docker-compose.yml文件纳入版本控制Git轻松实现部署环境的复制和迁移。6. 网络、存储与资源管理进阶当在一台服务器上运行多个容器时如何组织网络通信、管理持久化数据以及合理分配资源就成为必须考虑的问题。6.1 Docker 网络模式详解与容器互联Docker 提供了几种网络模式默认情况下使用docker run创建的容器会连接到默认的bridge网络。Bridge桥接模式默认模式。Docker 会创建一个虚拟网桥docker0每个容器会分配一个独立的网络命名空间和 IP。容器之间可以通过 IP 通信但需要做端口映射才能从宿主机外部访问。我们之前用的-p参数就是基于此模式。Host主机模式使用--networkhost。容器不会虚拟出自己的网卡而是直接使用宿主机的 IP 和端口。性能最好但端口冲突风险高且网络隔离性差。自定义网络这是多容器应用推荐的网络方案。就像我们在 Compose 里做的。它提供了自动 DNS 解析容器之间可以通过服务名/容器名互相访问。更好的隔离性不同自定义网络间的容器默认不能通信。可附加的网络别名。手动创建自定义网络并连接容器# 1. 创建一个自定义桥接网络 docker network create my_app_net # 2. 运行一个 MySQL 容器连接到该网络并指定网络别名“mysql” docker run -d --name mysql8 --network my_app_net --network-alias mysql -e MYSQL_ROOT_PASSWORD123456 mysql:8.0 # 3. 运行一个临时测试容器如 busybox连接到同一网络并尝试通过别名“mysql” ping 通数据库容器 docker run -it --rm --network my_app_net busybox ping mysql你会发现在busybox容器里可以直接ping mysql成功这就是自定义网络 DNS 解析的威力。6.2 数据持久化策略Bind Mount 与 Volume数据持久化是容器化有状态应用数据库、文件存储的生命线。Docker 主要有两种方式Bind Mount绑定挂载将宿主机上的一个特定路径挂载到容器内。我们之前挂载 Nginx 网页用的就是这种方式-v /home/ubuntu/web/html:/usr/share/nginx/html。优点直观宿主机文件易管理、易备份。缺点依赖宿主机特定目录结构移植性稍差需要管理宿主机目录的权限。Volume数据卷由 Docker 完全管理的存储单元。数据存储在宿主机上但路径由 Docker 控制通常在/var/lib/docker/volumes/下。我们之前 MySQL 例子用的就是命名卷-v mysql_data:/var/lib/mysql。优点移植性好与宿主机文件系统解耦可以通过 Docker CLI 或 API 管理是备份和迁移的首选。缺点在宿主机上查找文件不如 Bind Mount 直接。选择建议开发环境常用Bind Mount方便在宿主机上直接修改代码容器内实时生效。生产环境强烈推荐使用命名 Volume来持久化数据库、上传的文件等关键数据。配置文件可以考虑使用 Bind Mount 或只读 Volume。6.3 资源限制与监控避免单个容器“吃光”服务器轻量服务器资源有限必须防止某个容器失控占用全部 CPU 或内存导致其他应用甚至宿主机崩溃。在docker run或docker-compose.yml中设置资源限制# 在 docker-compose.yml 的 service 部分 services: my-app: image: some-image deploy: # 注意在 Compose v3 格式下资源限制通常在 deploy 下用于 Swarm单机 run 时用下面的 resources resources: limits: cpus: 0.5 # 最多使用 0.5 个 CPU 核 memory: 512M # 最多使用 512MB 内存 reservations: cpus: 0.1 memory: 256M对于docker run使用--cpus、--memory参数。使用docker stats命令实时监控容器资源使用情况docker stats这个命令会动态显示所有运行中容器的 CPU、内存、网络 I/O、磁盘 I/O 使用率是排查性能问题的第一站。实操心得对于内存限制建议设置一个比应用实际峰值稍高的值并密切监控。如果容器内存使用超过限制Linux 内核的 OOM Killer 可能会终止容器进程。CPU 限制则相对宽松它控制的是 CPU 时间的权重。7. 轻量服务器优化与生产环境考量在资源紧张的轻量服务器上运行多个 Docker 容器需要一些优化技巧来保证整体稳定性和性能。7.1 系统层面优化交换空间Swap如果服务器内存较小如 2GB可以考虑启用适当的 Swap 分区或文件作为内存不足时的缓冲防止系统直接被 OOM Kill。但注意 Swap 使用磁盘速度慢不能替代物理内存。# 创建一个 2GB 的 Swap 文件根据磁盘空间调整 sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 为了永久生效需要将配置写入 /etc/fstab日志轮转Log RotationDocker 容器默认的日志驱动json-file不会自动清理日志长期运行可能占满磁盘。可以配置 Docker 守护进程的日志驱动选项或使用logrotate工具。编辑/etc/docker/daemon.json添加日志限制{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }这表示每个容器日志文件最大 10MB最多保留 3 个文件即总共不超过 30MB 日志。修改后需重启 Dockersudo systemctl restart docker。7.2 使用 Nginx 作为反向代理统一入口我们之前可能将不同应用映射到宿主机的不同端口如 8080, 8081。这既不优雅需要带端口访问也不安全暴露过多端口。更专业的做法是使用一个Nginx 反向代理容器监听 80/443 端口然后根据域名或路径将请求转发到内部对应的应用容器。优势一个端口对外只需开放 80/443。基于域名的路由可以用blog.yourdomain.com访问 WordPress用files.yourdomain.com访问 Nextcloud。SSL 终端在 Nginx 层面统一配置 HTTPS 证书如使用 Let‘s Encrypt后端应用容器无需处理 SSL。简易 Nginx 反向代理配置示例创建一个目录存放 Nginx 配置mkdir -p ~/nginx-proxy/conf.d创建主配置文件~/nginx-proxy/nginx.confevents {} http { include /etc/nginx/conf.d/*.conf; }为 WordPress 创建站点配置~/nginx-proxy/conf.d/wordpress.confserver { listen 80; server_name blog.yourdomain.com; # 你的域名 location / { proxy_pass http://wp_app:80; # 使用 Compose 中的服务名 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }使用 Docker Compose 运行 Nginx 并链接到 WordPress 网络version: 3.8 services: nginx-proxy: image: nginx:latest container_name: nginx_proxy restart: always ports: - 80:80 - 443:443 # 预留 HTTPS 端口 volumes: - ./nginx-proxy/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx-proxy/conf.d:/etc/nginx/conf.d:ro - ./nginx-proxy/certs:/etc/nginx/certs:ro # 用于存放 SSL 证书 networks: - wp_network # 加入 WordPress 的同一个网络 # 原有的 db 和 wordpress 服务定义... db: ... wordpress: ... networks: - wp_network networks: wp_network: external: true # 如果网络已创建声明为外部网络这样访问http://blog.yourdomain.com的请求就会被 Nginx 转发到 WordPress 容器。7.3 备份与迁移策略容器化的一大优势是易于迁移。备份的核心是两部分数据卷和镜像定义文件。备份数据卷使用docker run启动一个临时容器挂载需要备份的数据卷和宿主机备份目录然后执行打包命令。# 备份名为 ‘mysql_data’ 的数据卷 docker run --rm -v mysql_data:/source -v /host/backup/path:/backup alpine tar czf /backup/mysql_data_backup_$(date %Y%m%d).tar.gz -C /source .备份 Compose 文件你的docker-compose.yml就是应用的定义文件务必纳入版本控制如 Git。迁移在新服务器上安装好 Docker 和 Docker Compose复制docker-compose.yml和备份的数据卷归档文件恢复数据卷然后运行docker compose up -d即可。8. 常见问题排查与运维技巧实录在实际操作中你肯定会遇到各种问题。这里记录一些我踩过的坑和解决方法。8.1 容器启动失败如何查看日志这是最常见的问题。容器跑不起来首先看日志。# 查看容器最近日志 docker logs 容器名或ID # 实时跟踪日志输出类似 tail -f docker logs -f 容器名或ID # 如果容器启动瞬间就退出可以尝试交互式运行来调试 docker run -it --rm 镜像名 /bin/sh8.2 端口冲突“Bind for 0.0.0.0:80 failed: port is already allocated”这意味着宿主机 80 端口已被占用。可能是之前运行的 Nginx 容器没删干净或者系统本身有服务如 Apache在运行。排查sudo netstat -tulpn | grep :80查看哪个进程在监听 80 端口。解决停止占用端口的进程或容器或者为你新的容器映射到另一个空闲端口如-p 8080:80。8.3 磁盘空间不足Docker 占满磁盘Docker 的镜像、容器、数据卷和日志都会占用磁盘空间。定期清理很重要。# 查看 Docker 磁盘使用概况 docker system df # 清理所有已停止的容器、未被任何容器引用的网络、悬空镜像未被任何标签引用的中间层镜像和构建缓存 docker system prune -a # 谨慎操作删除所有未被使用的数据卷可能会删除重要数据 # docker volume prune警告docker system prune -a会删除所有未被使用的镜像包括可能以后会用到的。生产环境慎用建议配合标签有选择地删除。8.4 容器内无法连接外部网络或速度慢这可能是 DNS 解析问题。Docker 容器默认使用宿主机的 DNS 配置有时宿主机 DNS 设置不当会导致容器内网络异常。解决在运行容器时指定 DNS 服务器或修改 Docker 守护进程配置。临时指定docker run --dns 8.8.8.8 --dns 8.8.4.4 ...永久修改在/etc/docker/daemon.json中添加dns: [8.8.8.8, 114.114.114.114]然后重启 Docker。8.5 如何更新容器应用应用出了新版本如何安全更新拉取新镜像docker pull wordpress:latest停止并删除旧容器docker stop wp_app docker rm wp_app注意如果容器有数据卷绑定rm操作不会删除数据卷数据是安全的。用新镜像重新运行容器使用与之前相同的docker run命令或docker compose up -dCompose 会自动检测镜像更新并重建容器。对于 Compose更简单的方法是docker compose pull拉取新镜像然后docker compose up -d重建并启动容器。最佳实践在docker-compose.yml中为镜像指定明确的版本标签如wordpress:6.2而不是latest。这样更新是受控的。更新时修改 yaml 文件中的标签版本再执行docker compose up -d。