Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有组合文件单节点和本地映像的docker服务_Docker_Docker Compose_Docker Swarm_Rolling Updates - Fatal编程技术网

具有组合文件单节点和本地映像的docker服务

具有组合文件单节点和本地映像的docker服务,docker,docker-compose,docker-swarm,rolling-updates,Docker,Docker Compose,Docker Swarm,Rolling Updates,因此,我需要在我的单节点服务器上使用docker进行滚动更新。到目前为止,我一直在使用docker compose,但不幸的是,我无法用它实现我所需要的。阅读网络,dockerswarm似乎是一条出路 我发现了如何使用swarm在单个节点上运行具有多个副本的应用程序: docker service create --replicas 3 --name myapp-staging myapp_app:latest myapp:mydocker compose.yml构建的最新版本: versio

因此,我需要在我的单节点服务器上使用
docker
进行滚动更新。到目前为止,我一直在使用
docker compose
,但不幸的是,我无法用它实现我所需要的。阅读网络,
dockerswarm
似乎是一条出路

我发现了如何使用swarm在单个节点上运行具有多个副本的应用程序:

docker service create --replicas 3 --name myapp-staging myapp_app:latest
myapp:my
docker compose.yml构建的最新版本

version: "3.6"

services:
  postgres:
    env_file:
      - ".env"
    image: "postgres:11.0-alpine"
    volumes:
      - "/var/run/postgresql:/var/run/postgresql"
  app:
    build: "."
    working_dir: /app
    depends_on:
      - "postgres"
    env_file:
      - ".env"
    command: iex -S mix phx.server
    volumes:
      - ".:/app"

volumes:
  postgres: {}
  static:
    driver_opts:
      device: "tmpfs"
      type: "tmpfs"

不幸的是,这不起作用,因为它没有从
docker compose.yml
文件:
.env
文件、
命令
条目等获取配置

深入研究,我发现使用

docker stack deploy -c docker-compose.yml <name>
docker堆栈部署-c docker-compose.yml
将使用my
docker compose.yml
config创建服务

但随后我收到以下错误消息:

未能更新服务myapp-staging_postgres:来自后台程序的错误响应:rpc错误:code=InvalidArgument desc=ContainerSpec:必须提供映像引用

因此,我似乎必须使用注册表并将我的图像推送到那里,这样它才能工作。我理解在多节点体系结构的情况下需要这样做,但在我的情况下,我不想这样做。(携带图像很重,我不想让我的图像公开,毕竟,图像在这里是,所以我为什么要把它移到互联网上?)

如何使用
docker compose.yml
中编写的本地映像和配置设置我的
docker服务

我可能可以使用
docker-service-create
选项来管理我的方式,但这不会使用我的
docker-compose.yml
文件,因此它既不干燥也不可维护,这对我很重要


docker compose
对于开发人员来说是一个很好的工具,遗憾的是我们不得不深入到DevOps工具中来实现滚动更新等常见功能。这整个swarm体系结构对于我这个阶段的需求来说似乎太复杂了。

您可以直接使用docker文件,而不是docker图像。请检查下面的示例

version: "3.7"
services:
  webapp:
    build: ./dir
错误是因为compose无法在Docker公共注册表中找到图像。
上述方法应该可以解决您的问题。

您不必在单节点设置中使用注册表。您可以使用此命令-cd在节点上从本地docker文件到docker文件目录构建“应用程序”映像-

docker build . -t my-app:latest
这将在您的节点上创建一个本地docker映像,此映像仅对您的单个节点可见,这在您的用例中是有益的,但我不建议在生产设置中使用此映像

现在,您可以将合成文件编辑为:

version: "3.6"

services:
  postgres:
    env_file:
      - ".env"
    image: "postgres:11.0-alpine"
    volumes:
      - "/var/run/postgresql:/var/run/postgresql"
  app:
    image: "my-app:latest"
    depends_on:
      - "postgres"
    env_file:
      - ".env"
    volumes:
      - ".:/app"

volumes:
  postgres: {}
  static:
    driver_opts:
      device: "tmpfs"
      type: "tmpfs"
现在您可以从该节点运行堆栈,它将使用您的本地应用程序映像,并从映像的使用中获益[更新-回滚…等]

我确实在你的堆栈文件上有一个旁注。您对这两个服务使用相同的env文件,请注意swarm将查找与“.yml”文件相对/相邻的“.env”文件,因此如果这不是有意的,请修改您的env文件的位置

另一方面,此解决方案仅适用于单节点群集,如果您扩展群集,则必须使用注册表,并且注册表不必是公共的,您可以在集群上访问,并且只有您的节点可以访问它-或者您可以将其公开-您可以选择访问注册表


希望这将有助于解决您的问题。

基本上,您需要使用docker图像,以便在docker swarm中进行滚动更新。此外,我想澄清的是,您可以托管一个私人注册中心,并使用它来代替公共注册中心

详细说明: 当您尝试滚动更新docker swarm的工作原理时,它会查看用于服务的映像是否有更改。如果有,docker swarm会根据更新标准的设置安排服务更新,并将对其进行操作。 假设图像没有变化,那么会发生什么?docker不会应用滚动更新。从技术上讲,您可以指定
--force
标志使其强制更新服务,但它只会重新部署服务

因此,创建一个本地repo并将图像存储到其中,并在docker compose文件中使用该图像名称用于swarm。您可以通过使用SSL、用户凭据和防火墙限制(由您决定)来保护repo

撰写文件中的更正:

  • 由于docker stack使用图像创建服务,您需要在
    app
    服务中指定
    image:“
    ,就像在
    postgres
    服务中完成一样。正如您所提到的
    build
    指令图像名称是必需的,因为docker compose不知道图像的名称
  • 如果要在多服务器中部署应用程序,则需要注册表服务器。正如您所提到的,这是一个单节点部署,仅在服务器上拉取/构建映像就足够了。但建议使用私有注册方法
  • 我的建议是,不要将所有服务合并到一个docker compose文件中。原因是,当您使用docker compose file部署/销毁时,所有服务都将被删除。这是一种紧耦合。当然,我知道所有其他服务都依赖于DB。在这种情况下,请确保先启动DB服务,然后再启动其他服务
  • 不要指定env文件,而是将其作为Docker文件指令的一部分。复制env文件并在入口点中对其进行源代码转换,或者使用env变量对其进行定义
  • 也只是一个更新: 堆栈只是将服务分组到swarm中

    因此,您的撰写文件应该是:

    version: "3.6"
    
    services:
      postgres:
        env_file:
          - ".env"
        image: "postgres:11.0-alpine"
        volumes:
          - "/var/run/postgresql:/var/run/postgresql"
      app:
        build: "."
        image: "image-name:tag" #the image built will be tagged as image-name:tag
        working_dir: /app # note here I've removed .env file
        depends_on:
          - "postgres"
        command: iex -S mix phx.server
        volumes:
          - ".:/app"
    
    volumes:
      postgres: {}
      static:
        driver_opts:
          device: "tmpfs"
          type: "tmpfs"
    
    Dockerfile:

    from baseimage:tag
    COPY .env /somelocation
    # your further instructions go here
    RUN ... & \
        ... & \
        ... && chmod a+x /somelocation/.env
    ENTRYPOINT source /somelocation/.env && ./file-to-run
    
    from baseimage:tag
    ENV a $a
    ENV b $b
    ENV c $c # here a,b,c has to be exported in the shell befire building the image.
    ENTRYPOINT ./file-to-run
    
    备选Dockerfile:

    from baseimage:tag
    COPY .env /somelocation
    # your further instructions go here
    RUN ... & \
        ... & \
        ... && chmod a+x /somelocation/.env
    ENTRYPOINT source /somelocation/.env && ./file-to-run
    
    from baseimage:tag
    ENV a $a
    ENV b $b
    ENV c $c # here a,b,c has to be exported in the shell befire building the image.
    ENTRYPOINT ./file-to-run
    
    你可能需要跑步

    docker-compose build
    
    docker-compose push (optional needed to push the image into registry in case registry is used)]
    
    docker stack deploy -c docker-compose.yml <stackname>
    
    docker编写构建
    docker合成推送(选项A)