甲骨文免费VPS提供两种主流实例:ARM的Ampere A1和x86微实例,两者资源差异很大。如果只为了跑一两个轻量应用,用Docker部署是可行的,但前提是不要把普通VPS的使用习惯直接搬过来。以下这几个点是实际部署中容易卡住的地方,建议在动手前先对照检查。
先确认实例架构,再选镜像
甲骨文免费VPS分为两种主要实例类型:基于Ampere A1的ARM实例和老的x86微实例。由于架构不同,Docker拉取镜像时需要留意镜像是否提供arm64版本。可以在终端执行`uname -m`确认架构,如果输出是`aarch64`,则优先选择带`linux/arm64`标签的镜像;如果镜像只提供amd64版本,可以用`docker pull --platform linux/amd64`强制拉取,但会损失性能并可能增加内存占用。对于x86微实例,建议不要部署大型镜像,因为资源限制很严,容易在构建或启动时直接卡死。
如果你的应用是自写代码,建议直接构建多架构镜像,或者使用支持多平台的构建工具。如果是第三方镜像,先看看仓库的Tags或README里有没有标注支持架构。有些镜像不提供arm64版本,强行运行会报`exec format error`,这时候不要浪费时间去改容器参数,先换一个替代镜像更实际。
端口映射后外部不通,先查安全列表再查iptables
免费VPS的端口开放不仅依赖Oracle云控制台的安全列表,还受实例内部Iptables规则影响。很多用户开通了安全列表端口,却忘记检查系统防火墙,导致Docker容器端口即使做了`-p 8080:80`映射,外部也无法访问。排查时先确认安全列表已放行,再登录实例执行`iptables -L -n`查看INPUT链;如果发现默认策略是DROP或缺少放行规则,需要添加`iptables -I INPUT -p tcp --dport 你的端口 -j ACCEPT`。注意Oracle自有的云防护机制可能还会拦截异常流量,属于正常现象。
这里有一个容易混淆的点:Oracle云控制台的安全列表相当于云防火墙,实例内部的iptables是系统防火墙,只有两层都放行才能访问。如果安全列表放行,iptables也放行了,但外部还是不通,检查容器内部的服务监听地址,用`docker exec 容器名 netstat -tlnp`查看,确认监听的是`0.0.0.0`而不是`127.0.0.1`。另外,如果实例系统是Ubuntu,先执行`ufw status`,不要只看iptables。
资源限制一定要显式设置
免费实例的内存和CPU都有限,ARM实例核心数较多但单核性能并不强,在Docker中同时运行多个应用时容易被OOM杀死。建议在启动容器时显式设置资源上限,比如用`docker run --memory=256m --cpus=0.5`来控制内存和CPU,或者使用docker-compose的`mem_limit`和`cpus`字段。日常监控可以通过`docker stats`查看每个容器的实时占用,若接近临界值,及时调整或关闭多余容器。不要依赖系统默认的无限限制,否则一旦出现内存泄漏,整个实例都会变得卡顿。
设置`--cpus=0.5`表示这个容器最多使用半个CPU核心,注意这个值与实例的总核心数无关,是独立的配额。如果应用是Java或Node.js这类内存占用高的,建议看实际启动后的峰值,再结合应用特点留出余量。另外,`docker stats`显示的数值只是当前实时占用,并不代表峰值,可以结合`docker inspect`查看容器的`OOMKilled`字段是否为true。
数据卷、存储空间和实例回收
容器默认把数据写在可写层,容器删除后数据就没了。即使免费实例的根卷是持久化的,但实例如果因为闲置被回收,系统盘的内容也可能全部丢失。所以部署有状态应用时,一定要用`-v`把数据挂载到宿主机目录,比如MySQL的数据目录。挂载时要注意磁盘总容量,免费实例的根卷有上限,常用`df -h`检查占用。如果实在不够,可以加块存储,但免费额度有限,别盲目扩容。
空闲回收机制主要面向长时间CPU和网络占用极低的情况,触发后实例会被停止,Docker当然也就停了。如果你想避免,就定期从外部访问应用的健康检查接口。注意从实例本机访问不算外部流量,必须让实例外的IP来请求。最简单的办法是在另一台服务器上设置crontab,每隔几分钟curl一次健康检查URL。但不要刷得太猛,否则可能被判定为异常。容器本身加上`--restart unless-stopped`,这样实例重启后能自动拉起容器。
安装Docker时避免几个坑
免费VPS自带的系统镜像里可能有老版本Docker,不建议直接用。最好从Docker官方仓库安装,Oracle Linux需要先配置`ol7_addons`或按官方指引添加仓库源,Ubuntu则需要保证内核模块和GPG key正常。另外,免费实例I/O性能一般,拉取大镜像或构建镜像时可能很慢,甚至超时。建议先在本地机上把镜像构建好,再用`docker save`/`docker load`迁移,或者用Docker Hub的自动化构建。不要为了测试一个不熟悉的镜像在服务器上反复拉取,浪费流量也容易把实例搞卡。
安装后先执行`docker info`,确认存储驱动、Cgroup版本以及是否有警告。如果实例的可用内存很小,不要把Docker的日志文件无限增长,在`/etc/docker/daemon.json`里设置`"log-driver": "json-file"`和`"log-opts"`的`max-size: "10m"`,避免日志占满系统盘。
甲骨文免费VPS用Docker部署应用,关键不是把Docker跑起来,而是理解实例的资源边界和网络规则。架构不匹配、端口不通、内存被打满、数据没挂载,这几个问题按顺序排查,大部分都能解决。