docker-compose
·
docker-compose容器编排工具
docker-compose.yaml 是 Docker Compose 的核心配置文件,采用 YAML 格式,用于定义多容器应用的服务、网络、数据卷等资源。它允许你通过单一文件描述整个应用的架构(如 Web 服务、数据库、缓存等组件),并通过 docker-compose up 一键启动所有服务,实现多容器的协同部署与管理。
安装docker-compose
- ubt安装
apt update && apt install -y ca-certificates curl gnupg
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update && apt install -y docker-compose
[root@ubt-backup ~]#docker-compose version
docker-compose version 1.29.2, build unknown
docker-py version: 5.0.3
CPython version: 3.10.12
OpenSSL version: OpenSSL 3.0.2 15 Mar 2022
-
kylin安装
-
docker-compose,会有依赖警告,不影响使用
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y python3-pip
pip3 install --default-timeout=100 -i https://mirrors.aliyun.com/pypi/simple/ docker-compose
docker-compose version
- docker compose v2版本
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-compose-plugin
docker compose version
二进制安装docker-compose
上传docker-compose-linux-x86_64-2.30.3
[root@docker01 ~]# ls docker-compose-linux-x86_64-2.30.3
docker-compose-linux-x86_64-2.30.3
mv docker-compose-linux-x86_64-2.30.3 /bin/docker-compose
chmod +x /bin/docker-compose
docker-compose --version
核心配置项详解
docker-compose.yaml 的配置项分为顶级配置和服务级配置,以下是最常用的配置说明:
顶级配置
| 配置项 | 作用 | 示例 |
|---|---|---|
version | 指定 Compose 文件格式版本(需与 Docker 引擎版本兼容,推荐 3.x 系列) | version: '3.8' |
services | 定义应用的各个服务(核心配置,每个子项对应一个容器) | services: web: ... db: ... |
networks | 定义应用的自定义网络(实现服务间隔离或通信) | networks: app-network: driver: bridge |
volumes | 定义持久化数据卷(用于存储服务数据,容器删除后数据保留) | volumes: db-data: driver: local |
configs | 定义配置文件(用于向服务传递配置) | configs: app-config: file: ./config.json |
secrets | 定义敏感信息(如密码、密钥,避免明文暴露) | secrets: db-password: file: ./password.txt |
- 服务级配置(
services下的子项)
每个服务对应一个容器,支持容器创建的几乎所有配置:
| 配置项 | 作用与语法 | 示例 |
|---|---|---|
image | 指定服务使用的镜像(优先于 build) | image: nginx:1.25 / image: mysql:8.0 |
build | 从 Dockerfile 构建镜像(指定上下文路径或 Dockerfile 位置) | build: ./web 或 build: {context: ./web, dockerfile: Dockerfile.prod} |
command | 覆盖容器启动的默认命令 | command: ["python", "app.py"] / command: npm run dev |
ports | 端口映射(主机端口:容器端口) | ports: - "80:80" - "443:443" |
expose | 暴露端口(仅声明,不映射到主机,供服务间通信) | expose: - "3306" |
volumes | 数据卷挂载(主机路径 / 命名卷:容器路径) | volumes: - ./html:/usr/share/nginx/html - db-data:/var/lib/mysql |
environment | 设置环境变量(键值对或列表形式) | environment: MYSQL_ROOT_PASSWORD: root 或 environment: - MYSQL_USER=admin |
env_file | 从文件加载环境变量(避免明文暴露) | env_file: .env / env_file: [.env, .db.env] |
depends_on | 定义服务依赖(启动顺序:先启动依赖服务) | depends_on: - db - redis |
networks | 指定服务所属的网络(关联顶级 networks 配置) | networks: - app-network |
restart | 服务重启策略(同 docker run --restart) | restart: unless-stopped |
user | 指定容器运行的用户 | user: "1000:1000" / user: appuser |
healthcheck | 服务健康检查(判断容器是否正常运行) | healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s |
deploy | 部署配置(用于 Swarm 集群,如副本数、资源限制) | deploy: replicas: 3 resources: limits: cpus: '1' memory: 512M |
docker-compose.yaml模板
version: '3.8' # 兼容 Docker 19.03+
# 自定义网络:确保服务间通信隔离
networks:
app-network:
driver: bridge
# 数据卷:持久化存储(MySQL数据、Nginx日志、PHP代码)
volumes:
mysql-data: # MySQL数据持久化(容器删除后数据不丢失)
nginx-logs: # Nginx日志存储
php-code: # PHP代码目录(可本地挂载)
services:
# 1. MySQL 数据库服务
mysql:
image: mysql:8.0 # 稳定版本,按需替换为 5.7
container_name: app-mysql
networks:
- app-network
volumes:
- mysql-data:/var/lib/mysql # 数据持久化
- ./mysql/init:/docker-entrypoint-initdb.d # 初始化SQL脚本目录(可选)
- ./mysql/conf:/etc/mysql/conf.d # 自定义MySQL配置(可选)
environment:
- MYSQL_ROOT_PASSWORD=root@123 # root密码(务必修改)
- MYSQL_DATABASE=app_db # 预创建应用数据库
- MYSQL_USER=app_user # 应用专用数据库用户
- MYSQL_PASSWORD=app@123 # 应用用户密码(务必修改)
- TZ=Asia/Shanghai # 时区配置
ports:
- "3306:3306" # 主机端口:容器端口(外部可访问,生产环境建议关闭)
restart: unless-stopped # 容器退出后自动重启(除非手动停止)
healthcheck: # 健康检查:确保数据库就绪
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 3
logging: # 日志限制:避免磁盘占满
driver: "json-file"
options:
max-size: "10m" # 单个日志文件最大10MB
max-file: "3" # 最多保留3个日志文件
# 2. PHP-FPM 服务(运行PHP代码)
php:
image: php:8.2-fpm # 对应PHP版本,按需替换为 7.4-fpm、8.1-fpm
container_name: app-php
networks:
- app-network
volumes:
- php-code:/var/www/html # PHP代码目录(本地./www可挂载到此)
- ./php/conf:/usr/local/etc/php/conf.d # 自定义PHP配置(如php.ini)
- nginx-logs:/var/log/nginx # 共享Nginx日志目录(可选)
environment:
- TZ=Asia/Shanghai # 时区配置
- DB_HOST=mysql # 数据库主机名(对应MySQL服务名,无需改IP)
- DB_PORT=3306
- DB_NAME=app_db
- DB_USER=app_user
- DB_PASSWORD=app@123
depends_on:
- mysql # 启动顺序:先启动MySQL,再启动PHP
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 扩展安装:如需安装mysqli、pdo_mysql等扩展,可添加以下构建配置
# build:
# context: ./php
# dockerfile: Dockerfile # 自定义PHP镜像的Dockerfile路径
# 3. Nginx 服务(处理HTTP请求,反向代理PHP)
nginx:
image: nginx:latest
container_name: app-nginx
networks:
- app-network
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # Nginx站点配置(核心)
- php-code:/var/www/html # 共享PHP代码目录(与PHP服务一致)
- nginx-logs:/var/log/nginx # Nginx日志存储
- ./nginx/ssl:/etc/nginx/ssl # HTTPS证书目录(可选)
ports:
- "80:80" # HTTP端口
- "443:443" # HTTPS端口(可选,需配置SSL证书)
depends_on:
- php # 启动顺序:先启动PHP,再启动Nginx
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
常用命令
1.启动服务
- 创建并启动所有容器
docker-compose up -d # -d 后台运行
2.查看服务状态
docker-compose ps
3.查看服务日志
docker-compose logs -f web # -f 实时查看web服务日志
4.停止服务(保留容器和数据卷)
docker-compose stop
5.停止并删除服务(容器、网络,保留数据卷)
docker-compose down
6.停止并删除所有资源(包含数据卷)
docker-compose down -v
案例-zrlog容器化编排
环境准备
#创建zrlog数据卷
docker volume create mysql-zrlog-data
#使用自定义网络
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
6758367116f0 app-network bridge local
编写数据库镜像
目录结构
mysql_blog/
├── Dockerfile
└── init.sql
dockerfile
FROM mysql:8.0-debian
LABEL maintaniner='song 13938454021@qq.com' author=hong
ENV MYSQL_ROOT_PASSWORD=123
COPY init.sql /docker-entrypoint-initdb.d/
CMD ["mysqld"]
init.sql
create database zrlog;
create user 'zrlog'@'%' identified by '123';
grant all on zrlog.* to 'zrlog'@'%';
flush privileges;
- 构建
docker build -t mysql:zrlog .
部署zrlog镜像
ZrLog 博客程序 - Java 开源博客系统,轻量快速,支持 Markdown 与插件扩展
目录结构
[root@docker01 /server/Dockerfile]# tree 2-zrlog-java/
2-zrlog-java/
├── docker-compose.yaml
├── Dockerfile
└── zrlog.war
Dockerfile
FROM tomcat:9.0-jdk8
LABEL maintaniner='song 13938454021@qq.com' author=hong
ENV DIR /usr/local/tomcat/
ADD zrlog.war ./webapps/ROOT.war
EXPOSE 8080
CMD ["catalina.sh","run"]
HEALTHCHECK --interval=2s --timeout=20s --retries=2 \
CMD curl 127.0.0.1:8080
编排docker-compose.yaml
[root@docker01 /server/docker-compose/zrlog]# cat docker-compose.yaml
#version: 3.8
networks:
app-network:
driver: bridge
volumes:
mysql-zrlog-data:
driver: local
services:
mysql:
image: "mysql:zrlog"
container_name: app-mysql
networks:
- app-network
volumes:
- mysql-zrlog-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123
ports:
- 3306:3306
restart: always
tomcat:
image: "zrlog:java"
container_name: app-zrlog
networks:
- app-network
ports:
- 8080:8080
restart: always
- 启动
docker-compose up -d
浏览器访问10.0.0.81:8080

案例-自定义镜像-学之思项目
需要项目文件
需要的镜像
node:16-buster
maven:3-eclipse-temurin-11-alpine
java:8u111-jdk
nginx:1.24
mysql:8.0-debian
后端backend
目录结构
[root@docker01 /server/Dockerfile]# tree -L 1 8_xzs_backend/
8_xzs_backend/
├── application-prod.yml
├── docker-compose.yaml
├── Dockerfile
├── enriy.sh
├── xzs
└── xzs-mysql-master.zip
Dockerfile
ARG VERSION=3.9.0
FROM maven:3-eclipse-temurin-11-alpine AS build
ENV CODE /app/code/
ARG VERSION
ENV JAR xzs-${VERSION}.jar
ADD xzs/source/xzs/ ${CODE}
RUN cd /app/code/ && \
mvn clean package
FROM java:8u111-jdk
LABEL author=hong desc="web xzs backend-jar"
ARG VERSION
ENV JAR xzs-${VERSION}.jar
ENV CODE /app/code/xzs/
ENV PORT 8000
COPY --from=build /app/code/target/xzs-${VERSION}.jar ${CODE}
ADD application-prod.yml ${CODE}
WORKDIR ${CODE}
ADD enriy.sh ${CODE}
EXPOSE 8000
CMD ["/app/code/xzs/enriy.sh"]
application-prod.yml
server:
port: 8000
undertow:
io-threads: 16
worker-threads: 4000
buffer_size: 1024
direct-buffers: true
compression:
enabled: true
min-response-size: 1
#日志
logging:
path: /usr/log/xzs/
#数据库,redis配置
spring:
datasource:
url: jdbc:mysql://xzs-mysql:3306/xzs?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true
username: xzs
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver
enriy.sh
#!/bin/bash
cd ${CODE}
java -jar -Dfile.encoding=UTF-8 -Dspring.profiles.active=prod ${JAR}
前端frontend
目录结构
[root@docker01 /server/Dockerfile]# tree -L 1 9_xzs_frontend/
9_xzs_frontend/
├── Dockerfile
├── xzs-admin
├── xzs.song.com.conf
└── xzs-student
Dockerfile
FROM node:16-buster AS build
ENV CODE /app/code/
ADD ./xzs-admin ${CODE}xzs-admin/
ADD ./xzs-student ${CODE}xzs-student/
WORKDIR ${CODE}xzs-admin/
RUN set -e;\
npm config set sass_binary_site https://registry.npmmirror.com;\
npm install --registry https://registry.npmmirror.com ;\
npm run build;
WORKDIR ${CODE}xzs-student/
RUN set -e;\
npm config set sass_binary_site https://registry.npmmirror.com;\
npm install --registry https://registry.npmmirror.com ;\
npm run build;
FROM nginx:1.24
LABEL author=song desc="xzs frontend"
ENV CODE /app/code/frontend/
RUN mkdir -p ${CODE} && \
rm -f /etc/nginx/conf.d/default.conf
COPY --from=build /app/code/xzs-admin/admin ${CODE}admin/
COPY --from=build /app/code/xzs-student/student ${CODE}student/
ADD xzs.song.com.conf /etc/nginx/conf.d/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
xzs.song.com.conf
server{
listen 80;
server_name admin.song.com;
location /{
root /app/code/frontend/admin/;
index index.html;
}
location /api {
proxy_pass http://backend:8000;
}
}
server{
listen 80;
server_name stu.song.com;
location /{
root /app/code/frontend/student/;
index index.html;
}
location /api {
proxy_pass http://backend:8000;
}
}
docker-compose.yaml
docker network create app-network
docker volume create mysql-xzs-data
#version: 3.8
networks:
app-network:
driver: bridge
volumes:
mysql-xzs-data:
driver: local
services:
mysql:
image: "mysql:8.0-debian"
container_name: xzs-mysql
networks:
- app-network
volumes:
- /server/Dockerfile/mysql_blog/xzs-mysql.sql:/docker-entrypoint-initdb.d/xzs-mysql.sql
environment:
- MYSQL_ROOT_PASSWORD=123
- MYSQL_DATABASE=xzs
- MYSQL_USER=xzs
- MYSQL_PASSWORD=123
ports:
- 3306:3306
restart: always
backend:
image: "xzs:backend"
container_name: web-xzs
volumes:
- /var/log/xzs/:/usr/log/xzs/
networks:
- app-network
ports:
- 8000:8000
restart: always
frontend:
image: "xzs:frontend"
container_name: fonr-xzs
networks:
- app-network
ports:
- 80:80
depends_on:
- backend
restart: always
浏览器访问

更多推荐

所有评论(0)