记录一下用 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 在本地和服务器上跑出来的结果一样,省掉了很多「在我机器上是好的」的问题。
但也不是万能的,网络、权限、存储这几块该踩的坑一个不少。慢慢积累吧。