具有组合文件单节点和本地映像的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:mydocker 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
将使用mydocker 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)