Docker compose详细介绍以及编写
1. Docker compose介绍
Docker Compose 是 Docker 官方提供的一个工具,用于定义和管理多容器应用。它使用
YAML
文件来描述多个 Docker 容器的配置,并通过一条命令来创建和管理这些容器。
- Docker compose适用于
- 微服务架构(例如Nginx + PHP + Mysql)
- 测试环境(快速搭建应用)
- CI/CD流程(自动化部署)
- Docker Compose解决了什么问题
- 手动运行多个
docker run
命令:
- 需要为每个容器手动指定网络、端口映射、环境变量等
- 容易出错,难以维护
- 使用
Shell
脚本:
- 通过 Bash 或 Python 脚本管理多个
docker run
命令- 仍然缺乏灵活性,维护成本较高。
Docker Compose 通过 YAML 配置文件(docker-compose.yml)来简化多容器管理,让运维更搞笑!
2. Docker Compose 安装
Docker Compose 通常已经集成在 Docker CLI 中,可以直接使用
docker compose
命令。如果需要单独安装,可以执行以下命令:curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
检查是否安装成功,并检查版本:
docker-compose version
3. Docker Compose 核心概念
Docker Compose 主要由一个 YAML配置文件 和 命令行工具 组成
YAML配置文件(docker-compose.yml)
- 用于描述应用的所有 服务(容器)、网络 、数据卷 等。
核心命令(CLI)
启动所有容器
docker-compose run
停止并删除容器
docker-compose down
查看日志
docker-compose logs
查看容器状态
docker-compose ps
4. docker-compose.yml
假设要部署一个wordpress网站,包含:
- Nginx + PHP + Wordpress (web服务)
- Mysql(数据库服务)
docker-compose.yml 示例:
version: '3.8' services: wordpress: image: wordpress:latest restart: always ports: - "8080:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: mypassword WORDPRESS_DB_NAME: wordpress depends_on: - db db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: mypassword MYSQL_DATABASE: wordpress
解析:
services
:定义了两个服务(wordpress 和 db)images
:指定使用的Docker镜像ports
:映射端口(如8080:80
,访问localhost:8080
就能打开wordpressenvironment
:设置环境变量depends_on
:确保 db 服务先启动
5. Docker Compose 常用命令
命令 | 作用 |
---|---|
docker-compose up -d |
以后台模式启动所有服务 |
docker-compose down |
停止并删除所有容器 |
docker-compose ps |
查看正在运行的容器 |
docker-compose logs -f |
实时查看容器日志 |
docker-compose restart |
重新启动所有服务 |
docker-compose stop |
停止所有容器 |
docker-compose start |
启动已停止的容器 |
docker-compose exec 服务名 bash |
进入容器 |
6. 数据持久化(Volumes)
如果不使用数据卷,数据库数据会丢失 。
在 docker-compose.yml 中添加 volumes 来解决:
services: db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: mypassword MYSQL_DATABASE: wordpress volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
这样即使 docker-compose down,数据仍然保留
7. 使用 .env
文件管理环境变量
可以创建一个
.env
文件:DB_PASSWORD=mypassword
然后
docker-compose.yml
这样写environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
这样可以更加安全地管理密码文件,而不直接写在
docker-compose.yml
里。
8. Docker Compose 与 Dockerfile 结合
首先可以自定义一个镜像,例如 PHP + Wordpress 镜像:
services: wordpress: build: . ports: - "8080:80" depends_on: - db
同时编写
Dockerfile
:FROM wordpress:latest RUN apt update && apt install -y vim
然后运行:
docker compose up --build -d
这样就可以用 自己的 Dockerfile 来构建镜像了。
9. Docker Compose 网络(Network)
默认情况下,Docker Compose 会为所有服务构建一个 独立的网络,并允许它们通过 服务名互相通信。
也可以自己手动定义网络,如果不手动定义网络那么在Docker compose文件中的主机都会处于同一个网络
networks: mynetwork: driver: bridge services: wordpress: networks: - mynetwork db: networks: - mynetwork
这样可以管理不同服务的通信
10. docker-compose.yml文件模版
version: "3.8" # 指定 Docker Compose 版本
services:
# 1️⃣ Nginx 反向代理
nginx:
image: nginx:latest
container_name: nginx_proxy
ports:
- "80:80" # 访问 http://localhost
- "443:443" # 访问 https://localhost
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # Nginx 主配置文件
- ./nginx/conf.d:/etc/nginx/conf.d:ro # 站点配置
- ./nginx/logs:/var/log/nginx # Nginx 日志持久化
depends_on:
- tomcat
networks:
- backend_network
restart: always # 自动重启
# 2️⃣ Tomcat 服务器(运行 Java Web 应用)
tomcat:
image: tomcat:9.0
container_name: tomcat_server
ports:
- "8080:8080" # Tomcat 端口
volumes:
- ./app:/usr/local/tomcat/webapps # 挂载 Web 应用目录
- ./tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml:ro # Tomcat 配置
- ./tomcat/logs:/usr/local/tomcat/logs # Tomcat 日志持久化
environment:
- TZ=Asia/Shanghai # 设置时区
networks:
- backend_network
restart: always
# 3️⃣ MySQL 数据库
mysql:
image: mysql:8.0
container_name: mysql_db
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: myapp_db
MYSQL_USER: myapp_user
MYSQL_PASSWORD: myapp_pass
volumes:
- mysql_data:/var/lib/mysql # 持久化 MySQL 数据
networks:
- backend_network
restart: always
# 4️⃣ Redis 缓存数据库
redis:
image: redis:latest
container_name: redis_cache
command: ["redis-server", "--appendonly", "yes"]
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- backend_network
restart: always
# 5️⃣ Prometheus 监控系统
prometheus:
image: prom/prometheus:latest
container_name: prometheus_server
ports:
- "9090:9090" # Prometheus Web 访问地址
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml # 配置文件
networks:
- monitoring_network
restart: always
# 6️⃣ Grafana 数据可视化
grafana:
image: grafana/grafana:latest
container_name: grafana_dashboard
ports:
- "3000:3000" # Grafana Web 界面
volumes:
- grafana_data:/var/lib/grafana
networks:
- monitoring_network
restart: always
networks:
backend_network:
driver: bridge
monitoring_network:
driver: bridge
volumes:
mysql_data:
redis_data:
grafana_data:
个人学习使用