记录一下用 Docker 跑一个小服务的完整过程,主要是给自己留个模板。

安装

Ubuntu 上最省事的是官方脚本:

curl -fsSL https://get.docker.com | sh
docker version

如果拉镜像慢,可以配一个镜像加速器,编辑 /etc/docker/daemon.json:

{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}

然后 systemctl restart docker。

用 compose 而不是 docker run

一开始都是 docker run,参数越写越长,后来全换成 compose:

services:
  app:
    image: nginx:alpine
    container_name: app
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./data:/data
    environment:
      TZ: Asia/Shanghai

启动:

docker compose up -d
docker compose ps
docker compose logs -f

三个容易踩的坑

① 数据没有挂出来

容器删了数据就没了。所有需要持久化的目录都要 volumes 挂到宿主机。

② 时区不对

容器默认 UTC,日志时间差 8 小时。加 TZ=Asia/Shanghai。

③ 日志把磁盘写满

Docker 默认不限制日志大小,跑几个月能吃掉几十 G。在 daemon.json 里加:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

常用命令

docker ps                        # 运行中的容器
docker ps -a                     # 包括已停止的
docker logs -f --tail 100 app    # 看日志
docker exec -it app sh           # 进容器
docker stats --no-stream         # 资源占用
docker system df                 # 磁盘占用
docker system prune -a           # 清理无用镜像和容器

一点体会

Docker 最大的好处不是「轻量」,而是环境一致。同一套 compose 在本地和服务器上跑出来的结果一样,省掉了很多「在我机器上是好的」的问题。

但也不是万能的,网络、权限、存储这几块该踩的坑一个不少。慢慢积累吧。