Docker Compose 实战:一键部署你的完整应用环境

作者:王仕宇(JavaPub)


前言

在学习 Docker 初期,我们经常使用:

bash 复制代码
docker run nginx

启动一个服务。

但是实际开发项目中,一个应用通常不可能只有一个容器。

例如一个普通后端项目:

复制代码
用户请求

    ↓

Nginx

    ↓

Go / Java 后端

    ↓

MySQL

    ↓

Redis

    ↓

消息队列

如果手动启动:

bash 复制代码
docker run mysql

docker run redis

docker run nginx

docker run backend

不仅麻烦,而且容易出现:

  • 参数忘记配置
  • 网络无法通信
  • 环境变量丢失
  • 部署流程复杂

这时候就需要 Docker Compose。


一、什么是 Docker Compose?

Docker Compose 是 Docker 官方提供的多容器编排工具。

简单理解:

用一个 YAML 文件,定义整个项目需要哪些容器,以及它们如何运行。

以前:

bash 复制代码
docker run mysql

docker run redis

docker run nginx

docker run backend

现在:

yaml 复制代码
docker-compose.yml

定义:

yaml 复制代码
mysql

redis

nginx

backend

然后:

bash 复制代码
docker compose up -d

一次启动全部服务。


二、Docker Compose 核心结构

一个 Compose 文件主要包含:

yaml 复制代码
services:

volumes:

networks:

例如:

yaml 复制代码
version: "3"

services:

  web:
    image: nginx

  db:
    image: mysql


volumes:

networks:

对应关系:

复制代码
services
    |
    |
    +--- 容器

volumes
    |
    |
    +--- 数据持久化


networks
    |
    |
    +--- 容器通信

三、安装 Docker Compose

现在新版 Docker 已经内置:

查看:

bash 复制代码
docker compose version

输出:

复制代码
Docker Compose version v2.x

以前版本:

bash 复制代码
docker-compose version

注意:

新版推荐:

bash 复制代码
docker compose

而不是:

bash 复制代码
docker-compose

四、第一个 Docker Compose 项目

创建目录:

bash 复制代码
mkdir compose-demo

cd compose-demo

创建:

复制代码
docker-compose.yml

内容:

yaml 复制代码
services:

  nginx:

    image: nginx

    ports:
      - "8080:80"

启动:

bash 复制代码
docker compose up -d

查看:

bash 复制代码
docker ps

访问:

复制代码
http://localhost:8080

成功看到 nginx 页面。


五、Compose 常用命令

启动服务

bash 复制代码
docker compose up

后台启动:

bash 复制代码
docker compose up -d

停止服务

bash 复制代码
docker compose down

区别:

stop:

复制代码
停止容器

down:

复制代码
停止 + 删除容器 + 网络

查看运行状态

bash 复制代码
docker compose ps

例如:

复制代码
NAME

mysql

redis

backend

查看日志

全部服务:

bash 复制代码
docker compose logs

实时:

bash 复制代码
docker compose logs -f

指定服务:

bash 复制代码
docker compose logs -f mysql

重启服务

bash 复制代码
docker compose restart

重新构建镜像

代码修改后:

bash 复制代码
docker compose build

或者:

bash 复制代码
docker compose up -d --build

六、部署一个完整后端项目

假设:

复制代码
项目

├── backend

├── nginx

└── docker-compose.yml

架构:

复制代码
              用户

               |

              Nginx

               |

            Backend

          /        \

       MySQL      Redis

七、MySQL + Redis + 后端 Compose 示例

docker-compose.yml:

yaml 复制代码
services:


  mysql:

    image: mysql:8.0

    container_name: mysql

    environment:

      MYSQL_ROOT_PASSWORD: 123456

      MYSQL_DATABASE: app


    volumes:

      - mysql-data:/var/lib/mysql


    ports:

      - "3306:3306"



  redis:

    image: redis:7

    container_name: redis


    ports:

      - "6379:6379"



  backend:

    image: my-backend


    container_name: backend


    depends_on:

      - mysql

      - redis


    ports:

      - "8080:8080"


    environment:

      DB_HOST: mysql

      REDIS_HOST: redis



volumes:


  mysql-data:

启动:

bash 复制代码
docker compose up -d

最终:

复制代码
mysql

redis

backend

全部启动。


八、Compose 网络原理

很多新人疑惑:

为什么 backend 可以访问:

复制代码
mysql

而不是:

复制代码
127.0.0.1

原因:

Compose 会自动创建网络。

例如:

复制代码
app_default


     |

 -----------------

 |       |       |

mysql  redis backend

所以:

backend:

连接:

properties 复制代码
MYSQL_HOST=mysql

Redis:

properties 复制代码
REDIS_HOST=redis

不用填写 IP。


九、环境变量管理

生产项目:

不要直接写:

yaml 复制代码
MYSQL_ROOT_PASSWORD:123456

推荐:

创建:

复制代码
.env

内容:

env 复制代码
MYSQL_PASSWORD=123456

MYSQL_DATABASE=app

Compose:

yaml 复制代码
environment:

  MYSQL_ROOT_PASSWORD:
    ${MYSQL_PASSWORD}

优势:

  • 开发环境一套
  • 测试环境一套
  • 生产环境一套

十、数据持久化

错误:

yaml 复制代码
mysql:

 image:mysql

删除容器:

bash 复制代码
docker compose down

数据丢失。

正确:

yaml 复制代码
volumes:

 mysql-data:


services:


 mysql:

   volumes:

     - mysql-data:/var/lib/mysql

数据:

复制代码
容器删除

      ↓

数据还存在

十一、使用 Dockerfile 构建自己的服务

项目:

复制代码
backend

├── Dockerfile

├── main.go

└── go.mod

Dockerfile:

dockerfile 复制代码
FROM golang:1.23


WORKDIR /app


COPY .

RUN go build -o server


CMD ["./server"]

Compose:

yaml 复制代码
backend:

  build:

    context: ./backend


  ports:

    - "8080:8080"

启动:

bash 复制代码
docker compose up -d --build

流程:

复制代码
代码

↓

Dockerfile

↓

Image

↓

Container

十二、健康检查 Healthcheck

生产环境:

不能只看容器是否启动。

例如:

MySQL:

yaml 复制代码
mysql:

 image:mysql


 healthcheck:

   test:

    ["CMD","mysqladmin","ping"]


   interval:10s

效果:

复制代码
容器启动

↓

检查服务

↓

正常才连接

十三、部署前后端分离项目

常见结构:

复制代码
project


├── frontend

├── backend

├── mysql

├── redis

└── docker-compose.yml

Compose:

复制代码
frontend

    |

    nginx

    |

backend

    |

mysql redis

一条命令:

bash 复制代码
docker compose up -d

整个项目上线。


十四、生产环境最佳实践

1. 固定版本

不要:

yaml 复制代码
image:mysql:latest

推荐:

yaml 复制代码
image:mysql:8.0.36

2. 服务拆分

不要:

复制代码
一个大容器

里面运行:

nginx

mysql

redis

backend

推荐:

复制代码
一个服务

一个容器

3. 日志管理

查看:

bash 复制代码
docker compose logs

生产:

接入:

  • ELK
  • Loki
  • Prometheus

4. 限制资源

例如:

yaml 复制代码
deploy:

 resources:

  limits:

    cpus: "1"

    memory: 512M

防止单个服务拖垮服务器。


十五、Docker Compose 与 Kubernetes

Docker Compose:

适合:

复制代码
单机部署

开发环境

小型项目

测试环境

Kubernetes:

适合:

复制代码
多服务器

自动扩容

高可用

大型企业

关系:

复制代码
Docker Compose

        ↓

Docker

        ↓

Kubernetes

        ↓

云原生平台

十六、实际开发最常用组合

Web 项目

复制代码
Nginx

+

Backend

+

MySQL

+

Redis

AI 应用

复制代码
Frontend

+

API Server

+

模型服务

+

Redis

+

向量数据库

快速搭建开发环境

例如:

启动 MySQL:

bash 复制代码
docker compose up mysql

启动 Redis:

bash 复制代码
docker compose up redis

不用污染本机环境。


总结

Docker 解决:

如何运行应用。

Docker Compose 解决:

如何管理多个应用。

实际开发流程:

复制代码
编写 Dockerfile

        ↓

创建 docker-compose.yml

        ↓

docker compose up -d

        ↓

完整环境启动

对于后端开发者:

掌握 Docker Compose 后,

无论是:

  • Go 服务
  • Java SpringBoot
  • Node.js
  • Python
  • AI Agent 服务

都可以快速完成部署。


作者:王仕宇 JavaPub

相关推荐
风哥2号1 小时前
数据库教程FGMT18‑Oracle‑EMCC智能化集中运维管理系统
运维·数据库·oracle
少司府1 小时前
Linux系统篇(一)指令篇·一:初识Linux及其基本指令
linux·运维·服务器·网络·阿里云·linux系统
天远API2 小时前
零信任架构实战:基于天远企业四要素验证构建自动化供应商准入网关
运维·人工智能·架构·自动化
考虑考虑12 小时前
docker compose环境变量替换
运维·后端·自动化运维
Java陈序员12 小时前
轻量运维面板!一款现代化的服务器控制面板工具!
运维·服务器·python·react.js·github
bosins12 小时前
WSL 迁移指南:如何将 Linux 环境完整复制到另一台电脑
linux·运维·服务器
IT利刃出鞘13 小时前
Docker Compose--安装WordPress--方法/示例
运维·docker·容器
handler0114 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
新时代牛马15 小时前
实时 Linux:PREEMPT_RT、延迟来源与观测
linux·运维·服务器