首页 > 解决方案 > Docker 独立容器按预期运行,但不是使用 docker stack 创建的容器

问题描述

在这里问我第一个关于堆栈溢出的问题。

我刚刚开始使用 Docker,作为我的一个测试项目的一部分,我遇到了一个问题。如果有人能指出我如何解决我的问题的正确方向,我将不胜感激。

我有一个在端口 80 上运行的 .NET 应用程序,并与托管在 AWS 上的 mysql 数据库通信。

我的职责是将应用程序部署到 AWS EC2 实例并让我的团队成员可以访问它。

为此,我在 EC2 实例上安装了 docker,并将以下 Dockerfile 添加到源代码中:

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
RUN apt-get update -y
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash --debug
RUN apt-get install nodejs -yq
ENV ASPNETCORE_URLS=http://+:80
COPY . ./
WORKDIR /src
RUN dotnet restore
COPY . ./
WORKDIR /src
RUN dotnet publish -c release -o out
COPY . ./
WORKDIR /src/out
ENTRYPOINT ["dotnet", "my.test.app.dll"]

我可以使用以下命令从上述 Dockerfile 成功构建 docker 映像:docker image build -t my-test-app-image . 注意:现在我将 docker 映像本地保存在 EC2 实例中,因为这只是为了测试。

创建 docker 映像后,我还可以使用以下命令启动 docker 容器:

docker container run -d --name my-test-app-container -p 8000:80 my-test-app-image

容器启动并运行后,我可以在端口# 8000 上访问 EC2 实例的公共 IP v4 地址,我可以看到应用程序按预期工作。

但是,据我所知,使用 docker stack 来确保服务的高可用性是一种很好的做法,因此我尝试使用以下 docker-compose.yml 文件创建一个 docker stack:

version: "3.8"
services:
  my-test-app-service:
    image: my-test-app-image
    command: dotnet my.test.app.dll
    deploy:
      replicas: 1
    ports:
      - target: 80
        published: 8000

注意:我已经通过运行以下命令在 EC2 实例中启用了 docker swarm 模式:docker swarm init

现在,当我尝试使用上述 docker-compose.yml 文件和命令部署 dockerdocker stack deploy -c docker-compose.yml my-test-app-stack堆栈时,堆栈已成功创建,并且我还可以根据replicasdocker-compose.yml 文件中提到的值看到 1 个正在运行的容器。

注意:在执行docker stack deploy命令之前,我从 EC2 实例中删除了所有 docker 容器。

但是,当我再次尝试访问该应用程序时,即使该应用程序可在端口# 8000 上的 EC2 实例的公共 IP v4 地址上访问,该应用程序似乎也无法按预期工作,因为它无法连接到 mysql出于某种原因数据库。

查看容器日志,我可以看到以下条目:

error verifying user autorization
MySqlConnector.MySqlException (0x80004005): Connect Timeout expired.
 ---> MySqlConnector.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.

我无法弄清楚为什么使用 docker stack 命令会特别发生这种情况,因为使用 docker container run 命令创建的容器似乎工作得很好。也许它与 docker 堆栈创建的默认网络服务有关?

如果我需要任何进一步的信息,请随时告诉我。谢谢!

标签: dockerdocker-composedockerfilecontainersdocker-stack

解决方案


推荐阅读