在 OCI 部署第一个容器化服务
在完成安全加固的 OCI 实例上,用 Docker Compose 和 Caddy 部署一个支持 ARM64、可验证且可回滚的 HTTPS 服务。
#type / howto
#status / growing
#tech / ops
#resource / oracle-cloud
#resource / docker
#resource / caddy
#platform / server
[!abstract] 成功状态 域名通过 HTTPS 返回测试服务,容器不直接公开内部端口,80/443 同时经过 OCI 和 UFW 放行,重启后服务恢复,配置可以从备份重建。
在 OCI 部署第一个容器化服务
前置条件
- 已完成 安全加固 OCI Linux 服务器;
- 有一个域名和可编辑 DNS;
- 域名
A/AAAA将指向实例; - OCI NSG 和 UFW 可开放 TCP 80/443;
- 目标镜像支持
linux/arm64; - 已阅读 Debian 安装 Docker 和 [[caddy|Caddy]]。
1. 确认架构与资源
uname -m
free -h
df -h /
A1 通常输出 aarch64。选择镜像前检查:
docker buildx imagetools inspect traefik/whoami:latest
docker buildx imagetools inspect caddy:2
必须包含 linux/arm64。
2. 安装 Docker
按 Debian 安装 Docker 使用 Docker 官方仓库安装 Engine 和 Compose plugin。验证:
docker version
docker compose version
sudo docker run --rm hello-world
把用户加入 docker 组等同于授予接近 root 的权限。只给可信管理员,并重新登录后验证。
3. 创建部署目录
sudo install -d -m 750 -o operator -g operator /opt/oci-first-service
cd /opt/oci-first-service
创建 compose.yaml:
services:
app:
image: traefik/whoami:latest
restart: unless-stopped
networks: [web]
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
networks: [web]
depends_on: [app]
networks:
web:
volumes:
caddy_data:
caddy_config:
app 没有 ports,只能由同网络 Caddy 访问。
4. 配置 Caddy
创建 Caddyfile:
example.com {
encode zstd gzip
reverse_proxy app:80
log {
output stdout
format console
}
}
替换为自己的域名。先验证:
docker run --rm -v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" caddy:2 caddy validate --config /etc/caddy/Caddyfile
docker compose config
5. 配置 DNS 与防火墙
DNS:
A example.com -> 实例公网 IPv4- 已验证 IPv6 时再添加
AAAA
OCI NSG/Security List 和 UFW 均允许 TCP 80/443:
sudo ufw allow 80/tcp comment 'HTTP for Caddy'
sudo ufw allow 443/tcp comment 'HTTPS for Caddy'
sudo ufw allow 443/udp comment 'HTTP3 for Caddy'
sudo ufw status verbose
确认 DNS 已解析到该实例:
getent ahosts example.com
6. 启动并观察
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 caddy
等待证书签发后:
curl -I http://example.com
curl --fail --show-error https://example.com
预期 HTTP 跳转 HTTPS,HTTPS 返回 whoami 内容。
7. 验证重启和最小暴露
sudo ss -lntup
docker compose ps
sudo reboot
重连后再次执行:
docker compose -f /opt/oci-first-service/compose.yaml ps
curl --fail https://example.com
ss 不应显示应用内部端口直接绑定公网。
8. 备份与升级
备份:
compose.yaml、Caddyfile;- Caddy 数据卷(包含证书状态);
- 实际应用数据卷;
- 镜像标签或 digest。
升级采用:
docker compose pull
docker compose up -d
docker image prune
生产服务不要永久使用 latest,应锁定明确版本并记录回滚镜像。
回滚
cd /opt/oci-first-service
docker compose down
sudo ufw delete allow 80/tcp
sudo ufw delete allow 443/tcp
sudo ufw delete allow 443/udp
确认不再使用后再删除卷;docker compose down -v 会删除数据,不能当作普通停止命令。
Related notes
- 所属 MOC:甲骨文云服务器 MOC
- 负载选择:OCI 免费服务器负载选择
- 容器:Docker MOC
- 反向代理:Caddy 反向代理与自动 HTTPS