ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker 容器实战系列(七):Docker Compose 多容器编排实战

Docker 容器实战系列(七):Docker Compose 多容器编排实战 Docker 容器实战系列七Docker Compose 多容器编排实战前言前面我们学会了容器基础命令、镜像构建、数据卷、容器网络。但是有个痛点一个项目往往不止一个容器。比如后端服务 MySQL Redis每次启动都要敲一长串docker run命令还要手动创建网络、挂载数据卷容器多了非常麻烦而且不好统一管理。Docker Compose 就是用来解决多容器应用编排的工具。只需要写一个docker-compose.yml配置文件一条命令就能启动 / 停止整套项目环境。提示新版 Docker 已经内置 Compose命令是docker compose中间空格老版本是docker-compose横杠。一、Compose 核心概念服务 (service)对应一个容器。比如 mysql 服务、redis 服务。项目 (project)一组关联的服务默认以当前文件夹名称作为项目名。yaml 配置文件docker-compose.yml定义所有服务的镜像、端口、挂载、网络、依赖关系。二、最简示例Nginx MySQL 测试环境新建文件夹在里面创建docker-compose.yml文件version: 3.8 services: nginx: image: nginx:alpine ports: - 8080:80 volumes: - ./nginx/html:/usr/share/nginx/html depends_on: - mysql restart: always mysql: image: mysql:8.0 ports: - 3306:3306 volumes: - mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: demo_db restart: always volumes: mysql-data:文件简单解释services定义所有容器服务image使用哪个镜像ports端口映射和docker run -p一致volumes数据卷持久化数据environment环境变量用来设置数据库密码等depends_on依赖代表 nginx 会等待 mysql 先启动注意只是等容器启动不等数据库服务就绪restart: always容器退出自动重启生产常用底部volumes声明全局数据卷三、常用 Compose 命令高频记这几个足够# 在yml文件所在目录启动整套服务后台运行 docker compose up -d # 查看运行状态 docker compose ps # 查看日志-f 实时跟踪日志 docker compose logs -f # 只查看某个服务日志例如mysql docker compose logs -f mysql # 停止服务容器不删除 docker compose stop # 停止并删除容器、网络数据卷不会自动删 docker compose down # 停止删除容器、网络删除数据卷谨慎会清空数据库数据 docker compose down -v四、Compose 自带网络重点当你执行docker compose up的时候Compose 会自动创建一个自定义网桥当前 yml 里所有服务都会加入这个网络服务名直接作为域名互相访问例如nginx 容器内部可以直接用mysql:3306访问 mysql 服务不需要写 IP这就是多容器项目最方便的地方不用手动创建docker network。⚠️注意depends_on只能控制容器启动顺序不能保证 mysql 服务初始化完成。业务代码里仍然需要做重试机制避免后端启动时报数据库连接失败。五、开发与生产小技巧开发环境可以绑定本地目录挂载修改代码实时生效生产环境尽量使用自己构建好的镜像不要直接挂载代码目录密码、密钥不要硬写在 yaml 里可以使用.env环境变量文件在同目录新建.env文件存放变量compose 会自动读取不要把docker-compose.yml上传到公开代码仓库如果里面有明文密码.env 简单示例MYSQL_ROOT_PASSWORDroot123456然后在 yml 中引用environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}六、常见踩坑yaml 缩进非常严格必须用空格不能用 Tab缩进错直接启动失败depends_on不等于服务就绪只是容器启动顺序docker compose down默认不会删除 volumes数据库数据会保留端口冲突宿主机端口被占用修改 ports 前面的宿主机端口即可本期总结Docker Compose 通过 yaml 文件管理多容器告别一堆 docker run 命令services定义容器内置网络服务名直接互相通信核心命令up -d启动、ps查看、logs看日志、down销毁depends_on 只控制容器启动顺序业务要自己处理服务就绪判断下期预告Docker 容器实战系列八镜像安全、镜像清理与生产最佳实践讲镜像漏洞、无用镜像 / 容器清理、镜像分层优化以及生产环境使用 Docker 的安全规范收尾整个基础容器系列。
返回列表