docker-compose部署项目
大约 3 分钟
docker-compose 部署项目
Docker Compose 通过一个 docker-compose.yml 声式地定义一组容器(服务),一条命令把整个项目启动/销毁,解决"手动 docker run 十几个容器"的痛点。
新版 Docker 已内置:
docker compose(带空格,作为 docker 子命令)。旧的独立二进制docker-compose仍广泛使用,配置文件完全兼容。
安装(旧版独立二进制)
# 下载 Docker Compose 的二进制文件
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装,查看版本号
docker-compose --version
配置文件
配置 docker-compose.yml 文件
version: "3"
services:
# 前端模块(本地构建)
frontend:
build:
context: .
dockerfile: Dockerfile
# 依赖的模块(只控制启动顺序,不等待服务就绪)
depends_on:
- nginx
networks:
- app-net
# nginx模块
nginx:
# 使用nginx镜像
image: nginx
# 主机端口号跟docker容器中端口号映射
ports:
- 9101:80
# 挂载数据卷
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./dist:/usr/share/nginx/html
networks:
- app-net
# 同一网络下,服务名(frontend/nginx)就是域名,可直接互访
networks:
app-net:
原笔记中的两个坑:依赖关键字是
depends_on(不是 depens_on);nginx 静态目录是/usr/share/nginx/html(不是 /user/share)。
配置 Dockerfile 文件(多阶段构建)
# 阶段1:使用 Node.js 镜像构建前端
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install --registry=https://registry.npmmirror.com
COPY . .
RUN npm run build
# 阶段2:使用 Nginx 镜像作为最终镜像
FROM nginx:1.21.3
# 从 builder 阶段复制构建产物到 Nginx 静态目录
COPY /app/dist /usr/share/nginx/html
# 暴露容器的 80 端口
EXPOSE 80
# 启动 Nginx 服务器
CMD ["nginx", "-g", "daemon off;"]
nginx 配置文件
# /nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
}
常用命令
# 启动
docker-compose up
# 后台启动
docker-compose up -d
# 停止
Ctrl C
# 重新构建(Dockerfile 变动后)
docker-compose up --build
# 删除容器和网络
docker-compose down
# 查看容器状态 / 日志
docker-compose ps
docker-compose logs -f 服务名
# 重启某个服务
docker-compose restart 服务名
Demo:一键部署"前端 + 后端 + MySQL"完整案例
目录结构:
blog/
├── docker-compose.yml
├── frontend/ # vue 项目
│ ├── Dockerfile
│ ├── nginx.conf
│ └── ...
└── backend/ # spring boot 项目
├── Dockerfile
└── app.jar
docker-compose.yml
version: "3"
services:
frontend:
build: ./frontend
ports:
- "8080:80"
depends_on:
- backend
backend:
build: ./backend
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/blog?useSSL=false
SPRING_DATASOURCE_PASSWORD: a123456
depends_on:
- mysql
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: a123456
MYSQL_DATABASE: blog
volumes:
- mysql-data:/var/lib/mysql # 具名卷持久化数据库
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # 首次启动建表
volumes:
mysql-data:
backend/Dockerfile
FROM openjdk:8-jre
WORKDIR /app
COPY app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
启动
docker-compose up -d --build # 一条命令拉起整套服务
docker-compose ps # 查看三个服务的状态
yml 常用字段速查
| 字段 | 说明 |
|---|---|
| image | 使用现成镜像 |
| build | 根据 Dockerfile 构建(context/dockerfile) |
| ports | 端口映射 - "8080:80"(建议加引号) |
| volumes | 数据卷挂载 |
| environment | 环境变量 |
| depends_on | 依赖服务,控制启动顺序 |
| restart | always / on-failure / no |
| networks | 接入的网络(默认建一个项目级网络) |
| command | 覆盖默认启动命令 |
| hostname | 容器主机名 |
Loading...
