ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

腾讯云轻量服务器Docker容器化部署实战:从零到多应用管理

腾讯云轻量服务器Docker容器化部署实战:从零到多应用管理 1. 项目概述为什么我们需要容器化部署刚接触服务器运维的朋友可能都有过这样的经历为了部署一个博客、一个网盘或者一个数据库需要花上大半天甚至一两天的时间去安装各种依赖、配置环境变量、处理端口冲突最后还可能因为系统版本不兼容而前功尽弃。更头疼的是当你需要在同一台服务器上部署第二个、第三个应用时这种“环境打架”的问题会变得更加突出。传统的部署方式就像在一间毛坯房里同时进行装修、做饭和睡觉各种工具、材料和生活用品混在一起混乱且难以管理。这正是容器技术特别是Docker要解决的核心痛点。它就像为每个应用提供了一个独立的、标准化的“集装箱”。这个集装箱里装好了应用运行所需的一切——代码、运行时环境、系统工具、系统库和设置。无论你的服务器是Ubuntu、CentOS还是其他任何系统只要它能运行Docker就能以完全相同的方式运行这个“集装箱”。这彻底解决了“在我机器上能跑到你那就报错”的经典难题。而腾讯云轻量应用服务器对于个人开发者、初创团队或学生来说是一个极具性价比的起点。它预装了纯净的操作系统配置简单网络环境优质特别适合作为我们学习和实践容器化部署的“试验田”。本指南的目的就是带你从零开始在一台腾讯云轻量服务器上通过Docker技术优雅地部署和管理多个应用实现资源的最大化利用和运维效率的显著提升。你将学会的不仅是如何运行几个命令更是一套现代化的、可复制的应用部署方法论。2. 环境准备与基础概念扫盲在动手之前我们需要把“战场”打扫干净并理解几个关键概念。这能让你在后续操作中知其然更知其所以然遇到问题时也能快速定位。2.1 腾讯云轻量服务器选购与初始化登录腾讯云控制台进入“轻量应用服务器”页面。对于学习和小型项目部署我个人的经验是选择最新一代的机型如“通用型”地域选离你或你的目标用户近的镜像选择Ubuntu 22.04 LTS。为什么是Ubuntu因为它在云服务和个人开发者中占有率极高社区资源丰富遇到问题几乎都能找到解决方案。LTS长期支持版本意味着有5年的安全更新和维护非常稳定。配置上2核CPU、4GB内存、80GB SSD硬盘的套餐是一个甜点级选择。它足以流畅运行多个轻量级容器如WordPress博客、Nextcloud网盘、MySQL数据库等。购买完成后第一件事不是急着登录而是做好安全加固重置密码在控制台为系统管理员root或ubuntu用户设置一个强密码。配置防火墙安全组这是重中之重。轻量服务器默认有防火墙功能。我们只开放必要的端口。初期建议只开放22SSH、80HTTP、443HTTPS。其他所有端口一律拒绝。Docker容器会映射端口到主机我们后续会在容器层面控制端口暴露。使用SSH密钥登录强烈推荐在本地生成SSH密钥对ssh-keygen命令将公钥上传到服务器。这比密码登录安全得多。之后使用ssh -i [密钥路径] ubuntu[你的服务器IP]来登录。注意腾讯云轻量服务器的默认用户可能是ubuntu或root请以控制台显示为准。使用ubuntu用户时执行需要特权的命令需在前面加sudo。2.2 Docker核心概念快速理解安装Docker之前我们先花几分钟理清三个核心概念这能帮你更好地理解后续所有操作镜像Image一个只读的模板。它包含了运行某个软件所需的所有内容——代码、运行时、库、环境变量和配置文件。你可以把它理解为一个应用程序的“安装包”或“蓝图”。例如nginx:latest就是一个Nginx服务器的镜像。容器Container镜像的运行实例。当你用docker run命令启动一个镜像时Docker会创建一个可写的容器层让镜像中的程序跑起来。容器是独立、安全的进程空间。一个镜像可以创建出无数个相互隔离的容器。容器是“集装箱”本身。仓库Registry存放镜像的地方。最大的公共仓库是 Docker Hub 你可以从中拉取下载无数官方或社区维护的镜像。腾讯云也有自己的容器镜像服务TCR速度更快。它们的关系是从仓库拉取镜像 - 用镜像创建并运行容器。我们所有的部署工作几乎都是围绕着“寻找合适的镜像”和“配置并运行容器”来展开的。3. Docker安装与基础配置实战现在我们登录到服务器开始安装Docker。我将提供最稳定、最推荐的方式。3.1 在Ubuntu系统上安装Docker Engine不推荐直接使用apt install docker.io因为版本可能较旧。我们使用Docker官方提供的安装脚本它会自动配置稳定的仓库并安装最新社区版。# 1. 更新现有的软件包列表 sudo apt update # 2. 安装一些必要的工具让apt可以通过HTTPS使用仓库 sudo apt install -y ca-certificates curl gnupg lsb-release # 3. 添加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 # 4. 设置稳定的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 # 5. 再次更新软件包索引这次会包含Docker仓库 sudo apt update # 6. 安装Docker Engine、命令行工具CLI以及容器运行时接口containerd sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 7. 验证安装是否成功 sudo docker run hello-world如果看到“Hello from Docker!”等欢迎信息说明安装成功。这个命令会从Docker Hub拉取一个极小的测试镜像并运行它。3.2 关键配置让Docker用起来更顺手安装完成后有几个配置能极大提升体验和安全性将当前用户加入docker组避免每次都输sudosudo usermod -aG docker $USER执行后你需要完全退出当前SSH会话然后重新登录这个改动才会生效。之后运行docker ps等命令就不需要加sudo了。配置Docker镜像加速器从Docker Hub拉取镜像在国内可能较慢。我们可以配置国内镜像加速器比如腾讯云自己的镜像加速服务。 编辑Docker的配置文件sudo nano /etc/docker/daemon.json如果文件不存在就新建它。加入以下内容腾讯云镜像加速地址你需要将其中的[your-tencent-id]替换但通常使用下面的公共地址即可{ registry-mirrors: [ https://mirror.ccs.tencentyun.com ] }保存退出后重启Docker服务使配置生效sudo systemctl restart docker验证加速器是否生效docker info在输出中查找Registry Mirrors应该能看到你配置的地址。实操心得daemon.json是Docker引擎的核心配置文件除了镜像加速未来你还可以在这里配置日志驱动、存储驱动等。修改它之后务必重启Docker服务。4. 核心操作用Docker部署你的第一个应用理论准备就绪我们来实战部署一个最经典的应用Nginx Web服务器。通过这个过程你会掌握Docker最核心的命令行操作逻辑。4.1 从拉取镜像到运行容器我们的目标是运行一个Nginx容器将服务器的80端口映射到容器的80端口并能够通过浏览器访问。# 1. 拉取Nginx镜像如果不指定标签默认拉取latest标签 docker pull nginx # 2. 运行一个名为“my-web”的Nginx容器 docker run -d --name my-web -p 80:80 nginx分解一下这个docker run命令的参数-d让容器在“后台”运行detached mode。如果不加容器会占用你的终端前台运行。--name my-web给容器起一个名字方便后续管理启动、停止、查看日志等。如果不指定Docker会随机分配一个有趣的名字。-p 80:80端口映射格式为-p [主机端口]:[容器端口]。这里是把宿主服务器你的腾讯云轻量服务器的80端口映射到容器内部的80端口。这样当你访问服务器IP时流量就会转发到容器内的Nginx。最后一个nginx指定使用的镜像名。现在打开浏览器访问你的服务器公网IP如http://123.123.123.123你应该能看到Nginx的欢迎页面。恭喜你的第一个容器化应用已经上线了4.2 容器生命周期管理与数据持久化仅仅运行起来还不够我们需要知道如何管理它。查看容器状态docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器包括已停止的查看容器日志docker logs my-web # 查看标准输出日志 docker logs -f my-web # 持续跟踪日志输出类似 tail -f停止、启动、重启容器docker stop my-web # 停止容器 docker start my-web # 启动已停止的容器 docker restart my-web # 重启容器进入容器内部有时需要排查问题或修改配置。docker exec -it my-web /bin/bash-it是-i交互式和-t分配一个伪终端的组合让你可以像SSH一样操作容器内部。注意容器内通常是一个精简的Linux环境。删除容器docker rm my-web # 删除已停止的容器 docker rm -f my-web # 强制删除运行中的容器一个重要问题数据持久化默认情况下容器内产生的数据如Nginx的日志、网站文件或MySQL的数据库文件会随着容器的删除而消失。这显然不符合生产要求。我们需要将容器内的目录“挂载”到宿主机的磁盘上实现数据持久化。例如我们希望将宿主机的/home/ubuntu/web/html目录挂载到Nginx容器存放网站文件的/usr/share/nginx/html目录# 首先在宿主机创建目录 mkdir -p /home/ubuntu/web/html # 运行一个新的容器并挂载目录 docker run -d --name my-web-v2 \ -p 80:80 \ -v /home/ubuntu/web/html:/usr/share/nginx/html \ nginx-v参数就是挂载卷volume格式为-v [宿主机路径]:[容器内路径]。现在你在宿主机/home/ubuntu/web/html下放置的index.html文件会直接替换掉容器内默认的Nginx欢迎页。注意事项-v挂载时如果宿主机目录是空的容器内对应目录的内容会被“覆盖”为空。反之如果宿主机目录有内容则会“覆盖”容器内的内容。对于像MySQL这种需要初始化数据的目录更安全的做法是先使用docker run ... -v mysql_data:/var/lib/mysql命名卷的方式让Docker管理卷的位置或者先运行一个临时容器将数据复制出来。5. 单机多应用部署端口管理与网络隔离现在来到核心主题如何在一台服务器上跑多个应用关键在于端口管理和网络规划。5.1 端口映射策略每个容器内的应用通常监听一个或多个端口如Nginx监听80MySQL监听3306。我们需要为每个需要从外部访问的服务在宿主机上分配一个唯一的端口。假设我们要部署三个服务个人博客WordPress对外通过Web访问我们映射到宿主机的8080端口。文件同步服务Syncthing对外通过Web UI管理映射到8384端口。数据库MySQL通常不需要直接从外网访问仅供内部容器通信所以不映射到宿主机端口或者映射到本地的3306端口仅本机可访问。# 服务1: WordPress (映射主机8080 - 容器80) docker run -d --name my-blog -p 8080:80 wordpress # 服务2: Syncthing (映射主机8384 - 容器8384) docker run -d --name my-sync -p 8384:8384 -v /home/ubuntu/sync:/var/syncthing syncthing/syncthing # 服务3: MySQL (不映射到公网只供内部使用) docker run -d --name my-db \ -e MYSQL_ROOT_PASSWORDyour_strong_password \ -v mysql_data:/var/lib/mysql \ mysql:8.0这样你就可以通过http://你的服务器IP:8080访问博客通过http://你的服务器IP:8384管理Syncthing。MySQL服务则安全地隐藏在内部。5.2 使用Docker Compose编排多容器应用当应用变得复杂比如一个WordPress需要同时运行WordPress容器和MySQL容器并且它们需要互相通信时手动用docker run管理就非常繁琐了。这时Docker Compose是救星。它用一个YAML文件docker-compose.yml来定义和运行多个容器。我们在/home/ubuntu目录下创建一个wordpress文件夹并在其中创建docker-compose.yml文件version: 3.8 services: db: image: mysql:8.0 container_name: wp-db # 重启策略除非手动停止否则总是重启 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: your_strong_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: your_strong_wordpress_password volumes: - db_data:/var/lib/mysql # 自定义网络方便服务间通过服务名通信 networks: - wp-network wordpress: image: wordpress:latest container_name: wp-app restart: unless-stopped depends_on: - db # 确保先启动db服务 environment: WORDPRESS_DB_HOST: db:3306 # 这里直接用服务名“db” WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: your_strong_wordpress_password WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html ports: - 8080:80 # 映射到主机8080端口 networks: - wp-network # 定义命名卷用于数据持久化 volumes: db_data: wp_data: # 定义自定义网络 networks: wp-network: driver: bridge在这个文件中我们定义了两个服务db和wordpress它们共享一个自定义的wp-network网络。在wordpress服务的环境变量中WORDPRESS_DB_HOST的值是db:3306这里的db就是MySQL服务的名称Docker Compose会通过内置的DNS解析机制让wordpress容器能直接访问到db容器无需知道其IP地址。这比手动管理容器IP要优雅和稳定得多。运行这个应用栈只需要一条命令在docker-compose.yml所在目录执行docker compose up -d-d同样代表后台运行。Docker Compose会自动拉取镜像、创建网络、创建卷并启动所有服务。要停止并清理所有资源只需执行docker compose down。实操心得对于任何需要多个容器协作的项目如Web应用数据库缓存Docker Compose是首选。它把复杂的部署指令变成了一个可版本控制的配置文件迁移和复现环境变得极其简单。6. 进阶实战使用Nginx Proxy Manager实现反向代理通过端口号如:8080访问服务不够优雅也不利于记忆。我们更希望用域名来访问不同的服务例如blog.yourdomain.com访问博客sync.yourdomain.com访问同步工具。这就需要反向代理。Nginx Proxy ManagerNPM是一个带Web UI的反向代理管理工具配置起来比直接写Nginx配置文件友好得多。6.1 部署Nginx Proxy Manager我们依然用Docker Compose来部署NPM。创建一个新目录如/home/ubuntu/npm并创建docker-compose.ymlversion: 3.8 services: app: image: jc21/nginx-proxy-manager:latest container_name: nginx-proxy-manager restart: unless-stopped ports: # 将主机的80和443端口映射给NPM管理 - 80:80 - 443:443 # NPM自身的Web管理界面映射到主机的81端口 - 81:81 environment: # 修改这些为你自己的邮箱用于申请SSL证书 DB_MYSQL_HOST: db DB_MYSQL_PORT: 3306 DB_MYSQL_USER: npm DB_MYSQL_PASSWORD: npm DB_MYSQL_NAME: npm volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt depends_on: - db db: image: jc21/mariadb-aria:latest container_name: npm-db restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: npm MYSQL_DATABASE: npm MYSQL_USER: npm MYSQL_PASSWORD: npm volumes: - ./mysql:/var/lib/mysql运行docker compose up -d启动。稍等片刻即可通过http://你的服务器IP:81访问NPM的管理界面。默认登录邮箱adminexample.com密码changeme。登录后会强制你修改密码和邮箱。6.2 配置域名与SSL证书假设你有一个域名yourdomain.com并且已经将blog.yourdomain.com和sync.yourdomain.com的A记录解析到了你的腾讯云服务器IP。登录NPM后台http://服务器IP:81。添加代理主机点击 “Proxy Hosts” - “Add Proxy Host”。Domain Names: 输入blog.yourdomain.com。Scheme:http因为我们的WordPress容器内部是HTTP。Forward Hostname / IP: 填写你WordPress容器的服务名或内部IP。如果你WordPress是用Docker Compose部署的并且和NPM在同一个Docker网络下可以直接填服务名wp-app。如果不在同一网络需要填WordPress容器的实际IP用docker inspect wp-app | grep IPAddress查看。更常见的做法是将WordPress容器的端口映射到主机的某个端口如8080这里就填主机IP:8080。Forward Port:80容器端口。开启SSL证书在同一个配置页面切换到 “SSL” 标签。选择 “Request a new SSL Certificate”。勾选 “Force SSL” 和 “HTTP/2 Support”。输入你的邮箱用于证书到期提醒。点击 “Save”。NPM会自动通过Let‘s Encrypt为你申请并配置免费的HTTPS证书。重复以上步骤为sync.yourdomain.com添加代理指向你Syncthing容器的服务名或主机IP:8384。配置完成后你就可以通过https://blog.yourdomain.com和https://sync.yourdomain.com安全、优雅地访问你的服务了完全隐藏了背后的端口号。7. 运维、监控与常见问题排查部署完成只是开始稳定的运行同样重要。7.1 日常运维命令与脚本一键查看所有容器状态与资源占用docker stats这个命令会实时显示所有容器的CPU、内存、网络IO使用情况非常直观。清理无用资源Docker运行久了会积累很多停止的容器、未被使用的镜像、网络和构建缓存占用磁盘空间。# 删除所有已停止的容器 docker container prune # 删除所有未被任何容器使用的镜像悬空镜像 docker image prune # 一键清理所有无用资源交互式确认 docker system prune # 强制一键清理所有无用资源 docker system prune -a -f注意docker system prune -a会删除所有未被容器使用的镜像包括那些你可能以后还会用到的使用前请确认。备份与迁移数据持久化的核心在于你挂载的卷-v指定的宿主机目录或命名卷。定期备份这些目录即可。对于整个Compose项目备份整个项目目录包含docker-compose.yml和data/等目录是最简单的迁移方式。在新服务器上安装好Docker和Docker Compose把项目目录传过去运行docker compose up -d就能恢复服务。7.2 常见问题与排查技巧实录即使按照指南操作你也可能会遇到一些问题。这里记录几个我踩过的坑和解决方法问题docker run时报错port is already allocated原因宿主机上该端口已被其他进程可能是另一个容器占用。排查运行sudo netstat -tulpn | grep :80以80端口为例查看是哪个进程在监听。解决要么停止占用端口的进程要么在docker run时换一个宿主机端口如-p 8080:80。问题容器启动后立即退出docker ps看不到docker ps -a看到状态是Exited原因这是新手最常见的问题。容器内的主进程PID 1执行完毕或报错退出了容器自然就停止了。排查使用docker logs [容器名或ID]查看容器的日志输出里面通常有明确的错误信息。例如MySQL容器可能因为配置文件错误而启动失败。解决根据日志修正错误。对于需要长期运行的服务如Nginx、MySQL确保你使用的镜像是以后台守护进程方式运行的。问题容器之间无法通过服务名通信在Docker Compose中原因容器不在同一个自定义网络中。排查运行docker network ls查看网络再运行docker network inspect [网络名]查看有哪些容器连接到了该网络。解决确保在docker-compose.yml中所有需要通信的服务都定义在同一个networks块下并且服务配置中引用了该网络。问题磁盘空间不足原因Docker的镜像、容器日志、卷会占用大量空间尤其是日志。排查使用docker system df命令详细查看Docker各类型资源占用的空间。解决定期执行docker system prune清理。限制容器日志大小在docker run或docker-compose.yml中配置日志驱动和大小限制。# 在docker-compose.yml的service下 logging: driver: json-file options: max-size: 10m # 单个日志文件最大10MB max-file: 3 # 最多保留3个日志文件问题Nginx Proxy Manager申请SSL证书失败原因最常见的原因是域名解析未生效需要等待全球DNS刷新通常几分钟到几小时或者服务器的80/443端口被防火墙安全组阻挡导致Let‘s Encrypt的验证服务器无法访问你的站点。排查使用ping blog.yourdomain.com和dig blog.yourdomain.com检查域名是否已正确解析到服务器IP。检查腾讯云轻量服务器控制台的防火墙规则确保80和443端口已开放。在NPM的日志中查看具体错误信息可以通过docker logs nginx-proxy-manager查看。解决确保DNS解析正确且防火墙开放后在NPM的代理主机配置里删除旧的SSL证书申请记录重新保存一次以触发新的申请。将多个应用容器化部署在一台服务器上就像是拥有了一个功能强大且井然有序的工具箱。每个工具都待在属于自己的格子里互不干扰取用方便。从手动配置到容器化最大的转变是思维方式的升级从“如何安装一个软件”变成了“如何获取并运行一个标准化的应用镜像”。这个过程初期可能会有学习曲线但一旦掌握无论是部署效率、环境一致性还是迁移能力都会得到质的飞跃。我的体会是不要试图一次性把所有服务都容器化可以从一个简单的、无状态的应用如静态网站开始逐步扩展到有状态的服务如数据库最后再尝试用Docker Compose编排复杂的多服务应用。每次成功部署一个服务你对这套体系的理解就会加深一层。
返回列表