Docker Compose 入门:一个文件拉起多容器服务
只用 docker run 管一个容器还行,容器一多就乱了套:先起数据库、再起后端、最后起前端,每个容器都要记一串端口映射、环境变量和挂载参数,换台机器重来一遍还容易漏。Docker Compose 就是来收拾这个烂摊子的:用一个 YAML 文件把多个容器的配置写在一起,一条命令全部拉起。
先确认本机装没装。较新的 Docker Desktop 和 Linux 发行版自带 Compose 插件,跑一条命令验证:
docker compose version
能打出版本号就说明可用。注意现在官方写法是 docker compose(中间空格、作为 Docker 的子命令),老教程里的 docker-compose(带横杠的独立程序)是上一代,新版已经不再推荐。
最小例子:一个 Web 服务加一个缓存服务。新建目录,写一个 docker-compose.yml:
services:
web:
image: nginx:latest
ports:
- "8080:80"
cache:
image: redis:7-alpine
在这个目录下执行:
docker compose up -d
Compose 会先拉取两个镜像,再建一个专属网络,把两个容器接进去,然后以后台方式启动。浏览器访问本机的 8080 端口就能看到 Nginx 的欢迎页。服务之间互相访问不用记 IP,直接用服务名当主机名——web 容器里访问 cache:6379 就能连上 Redis,因为 Compose 内置了 DNS 解析。
日常最常用的几条命令,建议记熟:
docker compose ps # 看当前项目里容器的状态
docker compose logs -f # 跟踪所有服务的日志
docker compose stop # 停掉容器但不删除
docker compose down # 停掉并删除容器和网络
docker compose down -v # 连数据卷一起删干净
注意 down 默认不删数据卷,数据库的数据还在,下次 up 还能接着用;只有加 -v 才会清空,生产数据千万别手滑。
再看一个稍完整的例子:带数据库的 Web 应用。数据库需要密码,用环境变量传进去:
services:
app:
image: nginx:latest
ports:
- "8080:80"
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example-password
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
这里有两个要点。第一,depends_on 只保证启动顺序——先起 db 再起 app,但不保证数据库已经就绪,应用如果启动时就连库,第一次可能会连失败,生产用法要再加健康检查。第二,volumes 把数据库文件落到具名卷里,容器删了数据还在。
密码别直接写进 YAML 文件提交到代码仓库。Compose 支持同目录的 .env 文件,写成 MYSQL_ROOT_PASSWORD=... 这样的键值对,YAML 里用 ${MYSQL_ROOT_PASSWORD} 引用即可,.env 再加进 .gitignore。
新版 Compose 还有一个小变化:文件开头的 version 字段已经废弃,不写也没关系,写了反而可能收到警告,直接从 services 开始写就行。
总结一下使用节奏:一个项目一个目录、一个 docker-compose.yml 管全部服务,up -d 拉起、ps 和 logs 排查、down 收尾。把命令和参数都沉淀进文件里,换机器部署就是复制目录加一条命令的事。下一步可以试着把自己常用的两个服务写进同一个文件,先从 Nginx 加 Redis 这样的组合练手。
- 点赞
- 收藏
- 关注作者
评论(0)