docker compose up --build

docker compose up --build 是一个 Docker Compose 命令,用于 构建并启动 多容器应用程序。让我详细解释每个部分:

命令分解:

1. docker compose

  • Docker Compose 工具的命令
  • 用于管理多容器 Docker 应用
  • 新版语法(V2),旧版是 docker-compose(带横线)

2. up

  • 启动服务
  • 创建并启动 docker-compose.yml 中定义的所有容器
  • 如果没有容器存在,会自动创建
  • 如果容器已存在,会重启它们

3. --build

  • 重新构建镜像
  • 在启动前强制重新构建 Docker 镜像
  • 即使镜像已存在,也会重新构建
  • 确保使用最新的代码和配置

完整功能:

docker compose up --build

相当于执行:

  1. 构建:读取 Dockerfile,构建新的 Docker 镜像
  2. 创建:基于镜像创建容器
  3. 启动:启动所有容器
  4. 连接网络:设置容器间网络
  5. 挂载卷:设置数据卷
  6. 端口映射:映射主机端口到容器端口
  7. 日志输出:在前台显示所有容器日志

工作流程:

docker compose up --build
    ↓
1. 读取 docker-compose.yml
    ↓
2. 为每个服务的 build 配置
    - 找到 Dockerfile
    - 重新构建镜像
    - 标记为最新版本
    ↓
3. 创建并启动容器
    - web 容器(基于新构建的镜像)
    - redis 容器(从 Docker Hub 拉取)
    ↓
4. 设置网络连接
    - 创建默认网络
    - web 容器能通过主机名 "redis" 访问 Redis
    ↓
5. 启动服务
    - 运行容器内的命令
    - 显示日志到终端

实际例子:

# docker-compose.yml
services:
  web:
    build: .           # 从当前目录的 Dockerfile 构建
    ports:
      - "5000:5000"    # 主机:容器端口映射
  
  db:
    image: postgres    # 使用现有镜像
    environment:
      POSTGRES_PASSWORD: secret

运行:

docker compose up --build

相关命令对比:

命令 功能 是否构建 是否启动
docker compose up 启动服务 ❌ 不构建 ✅ 启动
docker compose up --build 构建并启动 ✅ 重新构建 ✅ 启动
docker compose build 只构建不启动 ✅ 构建 ❌ 不启动
docker compose start 启动已存在的容器 ❌ 不构建 ✅ 启动

常用选项:

# 后台运行(分离模式)
docker compose up --build -d

# 强制重建并启动
docker compose up --build --force-recreate

# 只构建特定服务
docker compose up --build web  # 只构建和启动 web 服务

# 排除特定服务
docker compose up --build --no-deps redis  # 启动 redis 但不启动依赖服务

在您项目中的具体作用:

对于您的 Flask + Redis 项目:

docker compose up --build

会:

  1. 构建 Web 镜像

    • 基于 Dockerfile 构建 Python Flask 应用镜像
    • 安装 requirements.txt 中的依赖
    • 复制 f.py 到容器中
  2. 启动两个容器

    • web 容器:运行 Flask 应用(端口 15000→5000)
    • redis 容器:运行 Redis 数据库
  3. 连接它们

    • Flask 应用可以通过 redis://redis:6379 连接到 Redis
    • 访问 http://localhost:15000 可以看到应用

常见使用场景:

# 开发时:每次代码变更后
docker compose up --build

# 部署时:确保使用最新代码
docker compose up --build -d

# 调试时:查看构建和启动过程
docker compose up --build --verbose

这就是为什么在您之前的操作中,这个命令会尝试:

  1. 下载 Python 基础镜像
  2. 构建包含 Flask 和 Redis 客户端的应用镜像
  3. 拉取 Redis 镜像
  4. 启动两个容器并连接它们

运行docker compose up --build

image

[root@s22 docker-compose-files]#docker compose up --build
[+] Building 11.1s (11/11) FINISHED                                                                                                                                                                                                                                                                                                                       docker:default
 => [web internal] load build definition from flaskdockerfile                                                                                                                                                                                                                                                                                                       0.0s
 => => transferring dockerfile: 254B                                                                                                                                                                                                                                                                                                                                0.0s
 => [web internal] load metadata for docker.io/library/python:3.11-alpine                                                                                                                                                                                                                                                                                           1.8s
 => [web auth] library/python:pull token for registry-1.docker.io                                                                                                                                                                                                                                                                                                   0.0s
 => [web internal] load .dockerignore                                                                                                                                                                                                                                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                                                                                     0.0s
 => [web 1/5] FROM docker.io/library/python:3.11-alpine@sha256:d174db33fa506083fbd941b265f7bae699e7c338c77c415f85dddff4f176d1de                                                                                                                                                                                                                                     0.0s
 => [web internal] load build context                                                                                                                                                                                                                                                                                                                               0.0s
 => => transferring context: 61B                                                                                                                                                                                                                                                                                                                                    0.0s
 => CACHED [web 2/5] WORKDIR /app                                                                                                                                                                                                                                                                                                                                   0.0s
 => CACHED [web 3/5] COPY requirements.txt .                                                                                                                                                                                                                                                                                                                        0.0s
 => [web 4/5] RUN pip install --no-cache-dir -r requirements.txt                                                                                                                                                                                                                                                                                                    8.8s
 => [web 5/5] COPY f.py .                                                                                                                                                                                                                                                                                                                                           0.2s 
 => [web] exporting to image                                                                                                                                                                                                                                                                                                                                        0.1s 
 => => exporting layers                                                                                                                                                                                                                                                                                                                                             0.1s 
 => => writing image sha256:be88783424ece19b4faa55e09d07310d2bb431a9f8752c9031be91baa013ec16                                                                                                                                                                                                                                                                        0.0s 
 => => naming to docker.io/library/docker-compose-files-web                                                                                                                                                                                                                                                                                                         0.0s 
[+] Running 2/2                                                                                                                                                                                                                                                                                                                                                          
 ✔ Container docker-compose-files-redis-1  Created                                                                                                                                                                                                                                                                                                                  0.2s 
 ✔ Container docker-compose-files-web-1    Created                                                                                                                                                                                                                                                                                                                  0.1s 
Attaching to redis-1, web-1
redis-1  | 1:C 09 Dec 2025 13:20:38.560 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-1  | 1:C 09 Dec 2025 13:20:38.560 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-1  | 1:C 09 Dec 2025 13:20:38.560 * Redis version=7.4.7, bits=64, commit=00000000, modified=0, pid=1, just started
redis-1  | 1:C 09 Dec 2025 13:20:38.560 * Configuration loaded
redis-1  | 1:M 09 Dec 2025 13:20:38.560 * monotonic clock: POSIX clock_gettime
redis-1  | 1:M 09 Dec 2025 13:20:38.561 * Running mode=standalone, port=6379.
redis-1  | 1:M 09 Dec 2025 13:20:38.561 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * Server initialized
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * Reading RDB base file on AOF loading...
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * Loading RDB produced by version 7.4.7
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * RDB age 405 seconds
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * RDB memory usage when created 0.90 Mb
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * RDB is base AOF
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * Done loading RDB, keys loaded: 0, keys expired: 0.
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * DB loaded from append only file: 0.001 seconds
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
redis-1  | 1:M 09 Dec 2025 13:20:38.567 * Ready to accept connections tcp
web-1    |  * Serving Flask app 'f'
web-1    |  * Debug mode: off
web-1    | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web-1    |  * Running on all addresses (0.0.0.0)
web-1    |  * Running on http://127.0.0.1:5000
web-1    |  * Running on http://172.20.0.3:5000
web-1    | Press CTRL+C to quit

主机浏览器访问http://192.168.30.142:15000/

image

image

posted @ 2025-12-09 21:26  Haloiwuhan  阅读(16)  评论(0)    收藏  举报