docker - 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
堆栈时,堆栈已成功创建,并且我还可以根据replicas
docker-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 堆栈创建的默认网络服务有关?
如果我需要任何进一步的信息,请随时告诉我。谢谢!
解决方案
推荐阅读
- laravel-5 - Laravel 仅检索选定 id 的数据
- exist-db - Exist-db 并行请求(批量请求)在现有数据库 restxq(发布、放置)上失败
- angular - 如何从子组件角度 7 将两个参数传递给父组件函数?
- sql-server - 根据 where 子句值显示上一条和下一条记录
- sympy - 用 sympy 将余弦或正弦项组合成一个余弦或正弦
- c# - 如何防止分配给支持字段?
- android - Android Studio - 从 SQLite 数据库加载 RecyclerView 在 Edittext 中输入一个单词
- python - 试图列出路径类型错误:unicode string or integer address expected instead of bytes instance
- php - PHP && 短路求值运算符
- java - 如何附加变量 ID - AndroidX