开发者社区 > 云原生 > 容器服务 > 正文

docker compose 是否可以编排以前通过 docker run 构建运行的容器呢?

问题描述

以前的项目是通过docker来做简单的部署,容器数量最多也就三四个,所以一直都是通过docker start 命令一个一个的启动,后来运维觉得麻烦了,就通过shell脚本来批量启动,但由于业务的增加,几个容器可能有点不够用,需要增加更多的容器,虽然shell也能解决同样的问题,但处理像网络通信的问题来说还是比较麻烦的,有时候突然就联不通了。所以决定使用docker compose做统一管理,但发现一个问题,线上使用的容器无法被docker compose编排进去,即使在docker-compose.yml做了相应的配置但使用docker-compose up命令会提示容器名被占用,无法构建容器,无法构建那你给我启动啊,想法的好的,实际很残酷。也尝试过docker compose start命令来启动容器,却提示容器不存在,这就奇了怪了,我用docker compose up构建运行你提示已经存在,那我就直接启动吧,你却告诉我no container,你这不前后矛盾吗。但如果明白原理的话还是能理解报错的原因,前一个提示容器名被占用那是docker run的结果,后一个提示不存在,那是因为docker compose压根没有构建,但想不通的是既然docker composedocker containers的编排工具,按理来说应该是可以互通才对,但实际上并非如此,经过实验发现,docker能够处理docker compose构建的容器,但docker compose却无法编排docker构建的,如果从主从关系来看,确实是没问题的,但还是感觉比较鸡肋,线上的项目想要通过docker compose来编排,只能将服务器停掉,然后将容器打包成镜像再通过docker compose重新拉取镜像来部署,这么一来得消耗多少时间呢,客户能忍受吗,对于传统行业来说,客户使用不多的情况下,可能沟通一下,还能处理,但对于电商行业来说,这段时间的消耗其实是无法承受的,可能下一秒你的用户全部跑到其他平台了,所以为了解决这种问题找了不少的资料,但基本上都在介绍怎么使用docker compose,并没有讲解过此类问题,也去看过官网的文档,但没有找到想要的东西,其实我想要的只是一个简单的配置,让docker compose优先启动已有的容器,不管是docker compose部署的还是docker构建的,都能编排,就像java的反射机制一样,你想要动class private field只需要对field设置允许即可,docker compose不知道有没有这样的配置呢,如果有的话,怎么配置,如果没有将来会不会有,现阶段有没有代替的方案,希望有大佬给个建议,谢谢。

贴图

  • 通过docker run创建的容器 1676356196070.png

  • 试图通过docker compose来启动这两个容器(失败) 1676356675951.png

  • 配置文件docker-compose.yml 1676357703580.png

  • 修改docker-compose.yml所有container_name,与docker run构建的所有容器区分开来 1676357597596.png

  • 实验结果【成功构建两个新容器】 1676357297154.png 1676359832056.png

展开
收起
tineossbibnxa 2023-02-14 15:36:30 779 0
1 条回答
写回答
取消 提交回答
  • 可以,Docker Compose 可以编排以前通过 docker run 构建运行的容器。要做到这一点,你需要执行以下步骤:

    创建 Docker Compose 文件:创建一个名为 docker-compose.yml 的文件,其中包含以前通过 docker run 运行的容器的定义。该文件应指定容器的映像、端口映射和其他设置。例如:
    version: "3"

    services:
    my-container:
    image: my-image:latest
    ports:

      - "8080:8080"
    

    停止并删除以前运行的容器:使用以下命令停止并删除以前通过 docker run 运行的容器:
    docker stop my-container
    docker rm my-container
    使用 Docker Compose 运行容器:使用以下命令使用 Docker Compose 运行容器:
    docker-compose up -d
    这将根据 docker-compose.yml 文件中的定义启动并运行容器。

    注意:

    确保 docker-compose.yml 文件中的容器名称与以前通过 docker run 运行的容器的名称相同。
    如果以前运行的容器使用卷,则需要在 docker-compose.yml 文件中指定卷。
    如果以前运行的容器使用自定义网络,则需要在 docker-compose.yml 文件中指定网络。
    一旦你按照这些步骤操作,Docker Compose 就可以编排以前通过 docker run 构建运行的容器。

    2024-02-27 16:08:25
    赞同 展开评论 打赏

国内唯一 Forrester 公共云容器平台领导者象限。

相关电子书

更多
阿里云文件存储 NAS 在容器场景的最佳实践 立即下载
何种数据存储才能助力容器计算 立即下载
《容器网络文件系统CNFS》 立即下载