尧图精选

Docker Compose快速入门笔记

🕒 发布时间:2026/9/5 8:36:12 📁 来源:尧图网络
一、Docker Compose 是干什么的简单理解Docker Compose 就是用一个 YAML 文件把多个 Docker 容器一起定义、启动、停止和管理。比如你的 Spring Cloud 项目可能有Nacos MySQL Redis RabbitMQ Gateway System服务 Order服务 User服务不用 Compose 的话你可能需要一个个docker run ... docker run ... docker run ... docker run ...用了 Compose只需要docker compose up -d一次性启动。官方也是把 Compose 定位为管理多容器应用的工具。二、最基本的 Compose 文件现在推荐文件名compose.yaml也支持compose.yml docker-compose.yaml docker-compose.yml其中compose.yaml是现在推荐的名称。最简单的例子services: nginx: image: nginx:latest ports: - 8080:80 redis: image: redis:7目录docker-demo/ └── compose.yaml进入目录cd docker-demo启动docker compose up -d查看docker compose ps停止docker compose down查看日志docker compose logs这些都是 Compose 官方提供的核心生命周期命令。三、核心结构一个 Compose 文件你可以先记住这个结构services: 服务1: image: container_name: ports: volumes: environment: networks: restart: depends_on: 服务2: image: ports: volumes: networks: volumes:最重要的是services:它下面定义的每一个东西就是一个服务。例如services: mysql: image: mysql:8.0 redis: image: redis:7 nginx: image: nginx:latest这里实际上定义了三个服务mysql redis nginxCompose 会根据这些配置创建对应的容器。服务之间可以通过 Docker 网络进行通信。四、image最常用的配置services: redis: image: redis:7意思是使用 redis:7 镜像 创建 redis 服务例如 MySQLservices: mysql: image: mysql:8.0RabbitMQservices: rabbitmq: image: rabbitmq:3-managementNginxservices: nginx: image: nginx:latest五、container_name可以指定容器名称services: redis: image: redis:7 container_name: teng-redis启动以后docker ps可以看到teng-redis否则 Compose 默认会按照项目名、服务名等生成容器名称。六、ports这个非常重要。ports: - 8080:80格式宿主机端口:容器端口所以ports: - 8080:80表示Windows/Linux服务器 │ │ 8080 ↓ Docker容器 │ │ 80 ↓ Nginx浏览器访问http://服务器IP:8080实际访问容器里的80例如 MySQLmysql: image: mysql:8.0 ports: - 3306:3306Redisredis: image: redis:7 ports: - 6379:6379Nacosnacos: image: nacos/nacos-server ports: - 8848:8848七、environment配置环境变量。例如 MySQLservices: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: teng_cloud相当于告诉 MySQLroot密码 123456 创建数据库 teng_cloud也可以写成environment: - MYSQL_ROOT_PASSWORD123456 - MYSQL_DATABASEteng_cloud两种写法都可以。我个人更推荐environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: teng_cloud可读性更好。八、volumes这个特别重要。因为容器删除以后容器里面的数据可能也没了。所以数据库一般必须做数据持久化。例如services: mysql: image: mysql:8.0 volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:这里mysql_data:/var/lib/mysql表示Docker Volume │ ↓ mysql_data │ ↓ /var/lib/mysql │ ↓ MySQL容器即使docker compose down然后重新docker compose up -d数据库数据仍然可以保留。九、restart生产环境非常常用restart: always例如redis: image: redis:7 restart: always意思是容器异常退出或者 Docker 重启后让 Docker 尽量自动重新启动这个容器。常见restart: no restart: always restart: on-failure restart: unless-stopped生产服务器通常可以考虑restart: unless-stopped十、networksCompose 中非常重要。例如services: mysql: image: mysql:8.0 networks: - teng-network redis: image: redis:7 networks: - teng-network networks: teng-network:这样两个容器就在同一个 Docker 网络里面。更重要的是容器之间不要使用localhost通信。例如Spring Boot ↓ MySQLSpring Boot 配置不能写localhost:3306而应该写mysql:3306因为services: mysql: image: mysql:8.0这里的mysql就是 Compose 网络里的服务名可以作为主机名使用。所以你的 Spring Bootspring: datasource: url: jdbc:mysql://mysql:3306/teng_cloudRedisspring: data: redis: host: redis port: 6379这是以后部署你的 Spring Cloud 项目时非常关键的一点。十一、depends_on例如services: mysql: image: mysql:8.0 system: image: teng-system:1.0 depends_on: - mysql意思是system ↓ 依赖 ↓ mysqlCompose 会按照依赖关系创建/启动服务。但是要注意depends_on: - mysql不代表 MySQL 已经完全可以接受业务连接。它主要解决启动顺序问题。如果需要等待 MySQL 真正健康需要结合healthcheck:十二、healthcheck例如services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 healthcheck: test: [ CMD, mysqladmin, ping, -h, localhost, -uroot, -p123456 ] interval: 10s timeout: 5s retries: 5然后system: image: teng-system:1.0 depends_on: mysql: condition: service_healthy这样就比简单的depends_on: - mysql更加可靠。十三、build如果你不是直接使用 Docker Hub 镜像而是自己的 Spring Boot 项目可以services: system: build: context: ./system dockerfile: Dockerfile意思是./system ↓ Dockerfile ↓ 构建镜像 ↓ 启动容器例如project │ ├── compose.yaml │ ├── gateway │ └── Dockerfile │ ├── system │ └── Dockerfile │ └── order └── DockerfileComposeservices: gateway: build: context: ./gateway system: build: context: ./system order: build: context: ./order然后docker compose up -d --build就可以重新构建并启动。十四、一个完整的小案例把前面的知识组合起来services: mysql: image: mysql:8.0 container_name: teng-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: teng_cloud ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql networks: - teng-network redis: image: redis:7 container_name: teng-redis restart: unless-stopped ports: - 6379:6379 volumes: - redis_data:/data networks: - teng-network nginx: image: nginx:latest container_name: teng-nginx restart: unless-stopped ports: - 80:80 networks: - teng-network volumes: mysql_data: redis_data: networks: teng-network:启动docker compose up -d查看docker compose ps看到teng-mysql teng-redis teng-nginx查看日志docker compose logs只看 MySQLdocker compose logs mysql实时看docker compose logs -f mysql停止docker compose stop重新启动docker compose start删除容器和网络docker compose down如果连 Volume 也删除docker compose down -v这个-v要特别小心生产数据库不要随便执行。十五、你现在最应该记住的命令命令作用docker compose up -d后台启动docker compose up -d --build构建并启动docker compose down停止并删除容器、网络docker compose stop停止容器docker compose start启动已经存在的容器docker compose restart重启docker compose ps查看状态docker compose logs查看日志docker compose logs -f实时日志docker compose exec mysql bash进入 MySQL 容器docker compose pull拉取镜像docker compose build构建镜像docker compose config检查/解析 Compose 配置官方 CLI 目前提供了这些以及更多子命令。十六、结合你现在的 Spring Cloud 项目你现在如果准备把之前的项目部署到服务器我建议最终结构可以做成Nginx │ ↓ Gateway │ ┌───────────┼───────────┐ ↓ ↓ ↓ System Order User │ │ │ └───────────┼───────────┘ ↓ ┌───────┴───────┐ ↓ ↓ Redis MySQL │ ↓ RabbitMQ Nacos然后用一个compose.yaml统一管理MySQL Redis RabbitMQ Nacos Nginx Gateway System Order User ...官方完整 Compose 文档可以直接看Docker Compose 官方文档
上一篇/下一篇内容由系统自动关联 返回资讯列表 →