在 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 部署第一个容器化服务

前置条件

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.yamlCaddyfile
  • 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 会删除数据,不能当作普通停止命令。

创建于 2026/7/20 更新于 2026/7/20