【转载】Docker compose up -d 与 Docker restart 的区别

文章分析了在Docker中实时修改代码和配置时,up-d与restart命令的使用场景和结果,强调了commit操作的重要性以保存临时更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker compose up -d 与 Docker restart 的区别

背景 - 有时需要临时在容器内进行修改

Docker给现场部署带来了很大的方便。我们可以把代码和依赖都封到 Docker 镜像里,然后通过Docker 加载成容器,轻松部署。

另外,我们还可以通过 Docker-compose 把多个容器,比如 Nginx 容器,应用容器,数据库容器给编织起来,形成一整套服务。

但是,有些时候,到了现场,我们需要对临时代码进行一些小的调整和修改。
调整之后,往往需要重启容器或服务,使修改生效。这时,人们往往会用到:

  • docker restart 容器名 , 或者
  • docker-compose up -d

进行容器重启。但是这两者有什么区别呢?

docker-compose up -d

如果我们对 docker-compose.yml 进行了修改,比如,增加或者修改了:

  • 暴露的端口
  • 映射出来的文件
  • 环境变量

这时,使用 docker-compose up -d 可以使这些修改生效。
但是要注意,docker-compose up -d 会:

  • 停止原来的容器
  • 删除原来的容器
  • 使用新的参数,结合原始镜像文件,创建一个新的容器提供服务

这时,在原有容器中做得修改,如果没有使用 docker-commit 做持久化,就会被冲掉,不会留下来

docker restart 容器名

如果使用 docker restart 容器名,对容器进行重启。则之前在 docker 容器中做得临时修改,不会被冲掉。docker 会使用修改后的代码提供服务。
但是,这种方式没有办法修改 docker-compose 中暴露的端口号,没有办法进行 volume 映射等操作。

使用 docker commit 保留临时的修改

如果现场测试后,觉得这些临时修改没有问题,希望保留,可以在宿主机上,使用 docker commit 容器名 镜像名:标签 ,把临时的修改 commit 到镜像中。

这样,即使之后再使用 docker-compose up -d,只要在 docker-compose.yml 文件中,使用 commit 后的 镜像名:标签,之前的修改也可以保留。

举例

在容器里临时修改代码

如果在现场,我们发现 docker 容器中的一段 python 代码需要修改,可以
docker exec -it 容器名 /bin/sh 进入容器,找到相应的代码进行修改。

修改之后,可以在宿主机上,使用 docker restart 容器名 进行重启。修改的代码会生效。

调整 docker-compose.yml 中的配置

如果在现场,发现要修改容器的端口,或者增加或修改环境变量配置。则需要修改 docker-compose.yml。然后使用 docker-compose up -d 使修改后的配置生效。
但是,要注意:docker-compose up -d 会 停止并删除原有的镜像,并使用系统中原有的镜像,结合 docker-compose.yml 中的新配置来 生成一个新的镜像,提供服务。

这时,如果原有容器中,有临时修改,比如在原容器里修改了某一段 python 代码,则这些修改会被 冲掉。

所以,在使用时,要千万小心。

使用 docker commit 把容器的修改保存到镜像中

比如,我们在现场的 my_container 容器中,修改了一些代码,我们希望把这些修改保留下来。
假设这个容器对应的镜像名是 my_image:1.0.1,则我们可以在宿主机上,使用:
docker commit my_container my_image:1.0.1
把修改保存到原镜像中。当然,你也可以把修改保存到 my_image:1.0.2 。
但要记得对 docker-compose.yml 文件中,把对应的镜像名称,也改为 my_image:1.0.2。

以上描述的方式,比较适合现场没有互联网连接的场景。

<think>我们被要求解释`docker compose up --build -d`命令中各个选项的作用。根据引用[1]和用户的问题,我们可以分解这个命令命令:`docker compose up --build -d` 1. `up`: 这是docker-compose的核心命令,用于根据docker-compose.yml文件创建并启动服务(容器)。 2. `--build`: 这个选项告诉docker-compose在启动容器之前重新构建镜像。即使镜像已经存在,也会重新构建。这确保了使用最新的代码和配置。如果没有这个选项,docker-compose会使用现有的镜像(如果存在)。 3. `-d`: 这是`--detach`的缩写,表示以“分离模式”运行容器。也就是说,容器会在后台运行,不会占用当前终端。 引用[1]中提到: - 如果服务尚未创建,`docker-compose up -d`会创建并启动服务(后台运行)。 - 如果服务已经存在且正在运行,`docker-compose up -d`会先停止并删除现有的容器,然后重新创建并启动新的容器。 - 如果配置文件中指定了`build`指令,`docker-compose up -d`会检查是否需要构建镜像,但默认情况下,如果镜像已存在,则不会重新构建。而使用`--build`选项则强制重新构建镜像。 因此,`docker compose up --build -d`的作用是: - 强制重新构建服务镜像(即使镜像已存在)。 - 然后以分离模式(后台)启动服务。如果服务已经运行,则先停止并删除旧容器,再启动新容器。 总结:这个命令常用于在开发过程中,当你修改了Dockerfile或应用程序代码后,需要重新构建镜像并重新启动服务到后台运行。 注意:在Docker Compose v2中,命令是`docker compose`(没有连字符),而在v1中是`docker-compose`(有连字符)。但选项的作用相同。 根据上述分析,我们可以这样回答: --- ### `docker compose up --build -d` 命令选项解析 该命令用于基于`docker-compose.yml`文件重新构建镜像并启动服务,同时让容器在后台运行。具体选项作用如下: 1. **`up`**:核心命令,用于创建(或重新创建)并启动配置文件中定义的所有服务容器。 2. **`--build`**:强制重新构建服务的镜像。 - 无论镜像是否已存在,都会根据`Dockerfile`或`build`配置重新构建。 - 适用于代码或构建配置(如`Dockerfile`)更新后,确保使用最新镜像启动容器。 3. **`-d`**(或`--detach`):以**分离模式**运行容器,即容器在后台运行,不占用当前终端。 #### 执行流程 - 若服务容器已存在,则先停止并移除旧容器。 - 重新构建镜像(因`--build`选项)。 - 创建新容器并启动(后台运行)。 #### 典型应用场景 - 开发环境中,修改代码后需要重新构建镜像并重启服务。 - 自动化部署脚本中,确保使用最新镜像启动服务。 例如,以下命令将强制重建镜像并后台启动服务: ```bash docker compose up --build -d ``` > 注意:在Docker Compose v1中命令为`docker-compose`,v2中为`docker compose`,但选项功能一致。 --- §§相关问题§§ 1. Docker Compose 的 `down` 命令有什么作用? 2. 如何在不重建镜像的情况下更新运行中的容器? 3. Docker Compose 的 `restart` 和 `up` 命令有何区别?</think>### `docker compose up --build -d` 命令选项解析 #### 1. **核心命令 `up`** - **作用**:根据 `docker-compose.yml` 文件创建并启动所有定义的服务(容器) - **特性**: - 如果服务未创建:直接启动新容器 - 如果服务已运行:**先停止并删除旧容器**,再创建并启动新容器(引用[1]) - 自动处理服务间的依赖关系(按依赖顺序启动) #### 2. **关键选项 `--build`** - **作用**:强制重新构建服务的镜像 - **工作流程**: 1. 检查 `Dockerfile` 或 `build` 配置是否有更新 2. **重新构建所有服务的镜像**(即使镜像已存在) 3. 使用新镜像创建容器 - **典型场景**: - Dockerfile 或应用程序代码更新后 - 需要确保使用最新镜像启动服务 - 避免使用陈旧的缓存镜像(引用[1]) #### 3. **后台模式 `-d`** - **作用**:以**分离模式(detached)** 运行容器 - **特性**: - 容器在后台运行(不占用当前终端) - 命令行立即返回,可继续执行其他操作 - 可通过 `docker compose logs` 查看日志(引用[1]) #### 4. **完整命令效果** ```bash docker compose up --build -d ``` 执行流程: 1. **重新构建镜像**(强制使用最新代码) 2. **停止并删除**所有相关旧容器 3. **创建新容器**(使用新构建的镜像) 4. **在后台启动**所有服务 #### 5. **典型应用场景** 1. **开发环境热更新**:代码修改后快速重建服务 ```bash # 修改代码后执行 docker compose up --build -d ``` 2. **CI/CD 流水线**:确保每次部署使用全新构建 3. **依赖更新**:当 `requirements.txt` 或 `package.json` 变更时 > 注意:如果仅需重启容器(不重建镜像),使用 `docker compose restart`;如需临时运行命令,使用 `docker compose run`(引用[2][3]) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值