要图形界面、要一键建站和SSL,装宝塔;只想跑一两个容器、愿意敲命令,就在VPS上装Docker。vps安装docker这件事,入口Docker官方是按发行版分页给的,Ubuntu有单独一页,地址是docs.docker.com/engine/install/ubuntu/,装完照NGINX官方示例跑docker run --name mynginx1 -p 80:80 -d nginx,第一个容器就起来了。
装Docker的意义在这儿:环境装在容器里,出问题删掉容器重来,不用重装整台机器。机器上的东西越简单,半夜出岔子的概率越低。
- 官方安装入口按发行版分页,Ubuntu单独一页,装Engine和装Compose是两个页面。
- 端口映射-p第一个参数是宿主机端口,第二个是容器里暴露的端口,写反了映射就不对。
- Nginx反向代理用proxy_pass,默认会改Host和Connection两个头。
- Docker还是宝塔,同一台机器装前装后各跑一次free -m,用读数自己算。
这篇从装Engine讲到跑容器、映射端口、配Nginx反代,最后给一个Docker和宝塔怎么选的判断标准。
机器还没买、登录还没通的,先把vps主机和SSH上手步骤走一遍,登录这步通了再往下。
本文目录
在VPS上装Docker,官方给的是哪几个入口
Docker官方文档有一个Install Docker Engine总览页,把Ubuntu、Debian、RHEL、Fedora、CentOS这些系统分开列。先认清楚手上这台机器是什么系统,再去点对应的那一页。

总览页的作用是分流,教程在每一页里。系统名和页面名对不上,后面每一步都会别扭。
Docker Engine安装页按发行版分,Ubuntu单独一页
Ubuntu有专门的安装页,标题是Install Docker Engine on Ubuntu,地址docs.docker.com/engine/install/ubuntu/。Debian、CentOS这些系统各自有自己的页面,从总览页点进去。
按系统分的原因不复杂:每个发行版的包管理器和依赖不一样,同一串命令换个系统就跑不通。命令照那一页当时写的抄,过几个月再看一眼有没有变就行。
Compose是另一个安装页,不和Engine混在一起
Compose的安装总览页标题是Overview of installing Docker Compose,地址docs.docker.com/compose/install/。它和Engine的安装页是两条线,装完Engine不等于Compose也装好了。
分开的道理一样:Engine是跑容器的底层,Compose是编排多容器的一套命令行工具。你先装哪个,看手上要跑什么。
网络文档里Port publishing and mapping是独立主题
Docker网络文档把端口发布和映射单列成一个主题,和Bridge、Host、IPvlan、Macvlan、None、Overlay这些网络驱动并列。端口怎么从宿主机通到容器,有单独一套规则。
你后面写-p的时候,用的就是这套规则。先知道它单独成篇,出问题才知道去哪一页回查。
装Engine这一步怎么走:先认发行版,再照官方页做
SSH登进VPS,第一件事是确认系统。跑cat /etc/os-release,能看到系统名和版本号。Ubuntu、Debian、CentOS这几个名字对上了,再去总览页找同名的那一页。
- SSH登录VPS,跑cat /etc/os-release,记下系统名和版本号。
- 打开docs.docker.com/engine/install/,在列表里找到和你系统同名的那一页。
- 进那一页,从上往下照做,命令整段复制,不要自己改参数。
- 装完跑docker version或docker ps,能出结果就算装上了。
- 装不上,先看报错停在哪一步,再回官方页对一遍那一步的前置条件。
走错页的后果是包不匹配。在Ubuntu机器上照CentOS那页的命令走,包管理器对不上,第一步就报错。官方按系统分页,就是为了避免这件事。
连不上机器,先别怀疑Docker,按VPS连不上怎么排查从网络和SSH两头查。下载失败,先看网络环境:宝塔的安装文档里写过,前置脚本如果需要从Github这类网站下载源码,请自行考虑网络环境是否稳定,下载失败会导致安装失败。这个道理对任何从外网拉包的安装都一样。
买机器这件事,稳妥的做法是先用月付试水,确认晚高峰表现、退款规则和IP状态,再考虑年付。机器稳不稳定,装之前就该心里有数。
Compose要不要装:什么时候需要,装在哪一页
一个容器能解决的事,docker run就够。只跑一个Nginx,或者一个Nginx加一个后端,两条docker run也能起来。Compose解决的是多容器一起编排:几个服务、启动顺序、网络、卷,写进一个文件,一条命令起停。
判断标准很简单:手上是不是有多个容器要一起管。只有一个,先不装,省得记两套命令。
要装就去docs.docker.com/compose/install/,这是Compose的安装总览页,和Engine的安装页分开。两个页面两条线,别在Engine页里找Compose的安装命令。
Compose命令报错,先确认Engine装好了没有。回查顺序是先docker ps看Engine正不正常,再看Compose。
跑第一个容器:docker run和-p端口映射怎么写
NGINX官方文档给的启动命令是这一条:
docker run --name mynginx1 -p 80:80 -d nginx
--name mynginx1给容器起名,-p 80:80做端口映射,-d让容器在后台跑,最后的nginx是镜像名。
-d是detached模式,容器会一直运行,但不接管你的命令行。命令敲完回到提示符,容器在后台活着。要停它用docker stop mynginx1。
-p第一个参数是宿主机端口,第二个参数是容器里暴露的端口。请求先到宿主机,再进容器,所以前面写外面的,后面写里面的。
跑docker ps,看PORTS字段,这里会显示映射关系,例如0.0.0.0:80->80/tcp。看到这个,说明端口映射已经设上了。
访问不了,先看-p两个数字有没有写反。写反了容器可能起来了,但外面访问不到。再看防火墙:安全组和系统防火墙是两层,两层都要放行,只开一层照样进不来。
容器和卷的数据都在机器上,机器没了数据就没了。跑起服务之后,按多久备一次、本地异地怎么放定个频率。
用Nginx做反向代理:proxy_pass三段配置怎么填
反向代理要解决的问题:外面访问的是Nginx的80,Nginx把请求转给后面某个服务,再把结果返回。后面那个服务可以是一个容器,也可以是本机另一个端口。

NGINX官方文档说,把请求传给HTTP后端,要在location里写proxy_pass。示例是location /some/path/里写proxy_pass http://www.example.com/link/;。
proxy_pass的地址可以带域名、IP和端口
地址可以是域名或IP,也可以带端口。所以proxy_pass http://127.0.0.1:3000;和proxy_pass http://后端域名;都是合法写法。
带不带URI结果不一样。地址后面带了URI,它会替换请求URI里和location匹配的那部分;不带URI,或者判断不出要替换哪一段,就把完整请求URI传过去。配完一定访问一次,看返回的内容对不对。
默认会改Host和Connection,要传原始Host得自己写
默认情况下,Nginx会改代理请求里的Host和Connection两个头,值为空字符串的头会被删掉。Host默认取$proxy_host,Connection默认设成close。
这意味着后端拿到的Host是你proxy_pass里那个地址,不是访客访问的域名。后端如果按Host判断站点,就会判断错。要传原始Host,在location里写proxy_set_header Host $host;。官方示例里还配了proxy_set_header X-Real-IP $remote_addr;,把真实访客IP也带过去。
默认开缓冲,慢客户端场景要手动关
默认Nginx会缓冲后端响应,proxy_buffering默认是on。响应会先存进内部缓冲区,收完整了再发给客户端。
慢客户端多的时候,这个缓冲会占内存。要关就在对应的location里写proxy_buffering off;。缓冲区大小和数量用proxy_buffers调,示例是proxy_buffers 16 4k;,响应头那块单独由proxy_buffer_size控制,示例是proxy_buffer_size 2k;。数字先照示例,跑起来看内存再改。
Docker还是宝塔:用free -m前后对比自己算
这个问题没有官方对比结论,Docker文档和宝塔文档各写各的。能做的是把两边能干什么列清楚,再在同一台机器上量一次内存,自己算。
两边各能干什么
宝塔面板官方文档写,面板集成Docker和Docker Compose管理,容器、镜像、网络、存储卷、应用商店一键部署,Web站点和Docker网站可以统一管理。装了宝塔,面板集成了Docker和Docker Compose管理。
纯Docker方案没有面板,容器、镜像、网络、卷都用命令行管,Nginx配置自己写。好处是机器上少一层东西,坏处是每一步都要知道自己在敲什么。
宝塔支持的系统是Linux(CentOS、Ubuntu、Debian、AlmaLinux、RockyLinux等)和Windows Server。你手上的Linux机器基本都在列表里。
算账方法:装前装后各跑一次free -m
要多少内存,别照别人给的数。方法是三次读数。
第一次,机器刚装好系统,跑free -m,记下available那一列。第二次,装宝塔那套(Nginx、PHP、MySQL)之后,再跑一次。第三次,换一台同配置机器,只装Docker跑起你要的容器,跑一次。三次对比,看这台机器还放不放得下。
读数看available那一列,free那一列是彻底没用的内存。两个数差很多是正常的,系统会拿空闲内存做缓存。
判断标准:要图形界面就宝塔,愿意写命令就纯Docker
只想跑一两个容器,愿意写命令,纯Docker更轻。要图形界面、要一键建站和SSL,宝塔省事,建站从面板里一步步走一遍就行。
两种方案都行、就是拿不定,先用纯Docker跑一周。命令行能接受就继续,接受不了再装宝塔,这时候你已经知道容器怎么跑,宝塔的Docker模块也看得懂。
宝塔做反代有几处要留意。目标URL必须是能正常访问的地址,否则直接返回错误;发送域名默认是目标URL的域名,设不对可能导致代理跑不起来。还有一条,设置反代后,访问限制里对应路径的规则会失效,原来靠访问限制挡的东西要换个方式挡。
以后换机器,按先打包、后切DNS、再逐项验证的顺序走,别在新机器上直接改老机器的东西。
数字和限制:做这件事会用到的几个数
把官方示例和官方限制里写死的数集中列一下,省得来回翻页。
| 项目 | 数值 | 用在哪 |
|---|---|---|
| NGINX镜像示例端口 | 容器80,宿主机80 | -p 80:80的写法 |
| proxy_buffers示例 | 16个4k缓冲区 | 调缓冲时参考 |
| proxy_buffer_size示例 | 2k | 响应头缓冲区 |
| 宝塔反代内容替换 | 最多3条 | 用宝塔做反代时 |
这几个数各有各的用处:端口那两个决定容器通不通,缓冲那两个只在调性能时动,3条是宝塔面板给的上限。
表里没列的,比如内存占用和安装耗时,没有统一答案。同一台机器装前装后量一次,比照别人给的数靠谱。
常见误区和排查顺序
下面几条都是官方文档里写明的,碰到对应症状,按顺序回查。
- 端口映射写反:访问不到先看-p两个参数的顺序,docker ps的PORTS字段会告诉你实际映射成了什么。
- 后端拿到的Host不对:先查location里有没有写proxy_set_header Host $host;。
- 反代后访问限制失效:设置反代后,访问限制里相应路径的规则会失效。原来靠它挡的路径,要另想办法。
- 安装中途下载失败:从外网拉源码或包,下载失败会导致安装失败。宝塔的安装文档里提醒过前置脚本从Github下载失败会导致安装失败,别的安装同理。
- 卸载宝塔是破坏性操作:输入2会清理面板相关环境,可能影响网站和数据库;输入其他值或不输入直接回车只卸载面板;卸载期间别关终端。
排查顺序按这个来:先看容器起没起(docker ps),再看端口映射对不对(PORTS字段),再看防火墙两层放没放行(安全组和系统防火墙两层放行),最后看Nginx的Host头。
加固放在装完之后做,四步加固清单按顺序走一遍,重点看Docker改过的iptables规则和暴露出去的端口。
真实案例:别人跑Docker服务都选什么机器
公开的VPS推荐页面里,开发者跑Docker服务这个场景,有页面把首选列成Hetzner和Netcup,备选是Vultr和DigitalOcean。理由是欧洲机房性价比高,Hetzner的ARM系列尤其突出;按小时计费适合测试,包月适合长期项目。
配置上,1核1G对静态站和轻量脚本通常够用;WordPress、数据库或者多个Docker服务,建议从2核2G起步,还要留出备份空间。
有长期写建站记录的人公开写过,自己用Vultr时间最长,适合正经业务站、外贸独立站和长期运行的WordPress网站,价格不算有优势,稳定性和性能一致性相对更好。RackNerd和RAKsmart的机器他也用过,配合WP Panel拦恶意访问,放一两个没流量的企业官网问题不大;网站有稳定流量了,还是换性能和稳定性更好的机器。
这些是别人公开页面上的经验,不是官方规定。机器选哪个,最后还是看你自己跑起来的表现。
用AI帮你核对安装页和配置
AI在这件事上干的是整理和对照,不是替你装。分三步。
- 把官方安装页的发行版分支整理成一张对照表,标出你这台VPS该进哪一页。
- 把docker run命令里的-p拆开,指出第一个参数和第二个参数分别是什么,检查有没有写反。
- 把Nginx反代的proxy_pass、proxy_set_header、proxy_buffering三段配置逐行注释,说明每行在干什么。
三条提示词,本文给的示例,复制过去把尖括号里的内容换成你自己的。
下面是一台VPS的系统信息,请对照Docker官方安装页的分页结构,告诉我该进哪个发行版的安装页,只列页面名称和网址,不要给安装命令。
这是我写的docker run命令:<粘贴命令>。请按官方文档对-p参数的说明,指出第一个参数和第二个参数分别是什么,并判断端口映射有没有写反。
这是我的一段Nginx配置:<粘贴配置>。请对照官方反向代理文档,逐行说明proxy_pass、proxy_set_header、proxy_buffering各自作用,不要新增我没写的指令。
有两件事必须你自己在机器上做。跑一次docker ps,看PORTS字段的映射是不是「宿主机端口对应容器端口」,据此决定端口映射改不改。在宝塔里填完反代后访问一次域名,看返回的是不是后端内容,据此决定发送域名改不改。
猎者出海的AI Agent在整理资料、对照官方文档这类活上能接一手,比如把Docker官方安装页和宝塔文档里跟端口、反代有关的条目拉出来对一遍。装和验还得你自己来。
常见问题
vps安装docker和docker compose要装两个东西吗?
装的是两个东西,入口也分开:Engine在docs.docker.com/engine/install/按发行版选页,Compose在docs.docker.com/compose/install/。只跑一个容器,先装Engine就够;多容器一起管再装Compose。
docker端口映射写反了会怎样?
容器可能照样起来,但外面访问不到你要的端口。跑docker ps看PORTS字段,显示的映射关系和你预期不一样,就是写反了。
docker nginx反向代理后后端拿到的Host为什么不对?
Nginx默认把Host设成$proxy_host,也就是proxy_pass里那个地址,不是访客访问的域名。要传原始Host,在location里写proxy_set_header Host $host;。
vps装宝塔还是docker,怎么判断?
要图形界面、要一键建站和SSL,选宝塔;只跑一两个容器、愿意写命令,选纯Docker。拿不准就在同一台机器上装前装后各跑一次free -m,看available还剩多少。
宝塔面板默认端口是什么?
现在安装会生成随机端口,以安装完成后显示的面板地址为准。要改端口用bt 8,改完在安全组和防火墙放行。
宝塔面板忘记用户名或密码怎么办?
SSH登录服务器,执行bt 5改密码,bt 6改用户名。改完用新账号登录面板。
机器上的事,装是一次性的,后面靠的是加固、备份和出问题能回查。装完别急着堆服务,先把一个容器和一条反代跑稳。

发表评论