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 --from=builder /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依赖服务,控制启动顺序
restartalways / on-failure / no
networks接入的网络(默认建一个项目级网络)
command覆盖默认启动命令
hostname容器主机名
Loading...