无法从 EC2 中运行的 docker 容器连接到 elasticache redis

kac*_*ow6 1 amazon-web-services redis amazon-elasticache docker docker-compose

作为我的 CI 过程的一部分,我正在创建一个 docker-machine EC2 实例并通过 docker-compose 在其中运行 2 个 docker 容器。服务器容器测试脚本尝试连接到与 EC2 位于同一 VPC 中的 AWS elasticache redis 实例。运行测试脚本时,出现以下错误:

1) Storage
       check cache connection
         should return seeded value in redis:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/usr/src/app/test/scripts/test.js)
      at listOnTimeout (internal/timers.js:549:17)
      at processTimers (internal/timers.js:492:7)
Run Code Online (Sandbox Code Playgroud)

更新:我可以通过 EC2 本身的 redis-cli 进行连接:

redis-cli -c -h ***.cache.amazonaws.com -p 6379 ping
> PONG
Run Code Online (Sandbox Code Playgroud)

看起来我无法连接到我的 redis 实例,因为我的 docker 容器使用的 IP 与我的 elasticache 实例不在同一个 VPC 内。在从远程映像构建容器时,如何设置我的 docker 配置以使用与主机相同的 IP?任何帮助,将不胜感激。

我的 docker-compose.yml 的相关部分:

version: '3.8'
services:
  server:
    build:
      context: ./
      dockerfile: Dockerfile
    image: docker.pkg.github.com/$GITHUB_REPOSITORY/$REPOSITORY_NAME-server:github_ci_$GITHUB_RUN_NUMBER
    container_name: $REPOSITORY_NAME-server
    command: npm run dev
    ports:
      - "8080:8080"
      - "6379:6379"
    env_file: ./.env
Run Code Online (Sandbox Code Playgroud)

服务器容器 Dockerfile:

FROM node:12-alpine

# create app dir
WORKDIR /usr/src/app

# install dependencies
COPY package*.json ./

RUN npm install

# bundle app source
COPY . .

EXPOSE 8080 6379

CMD ["npm", "run", "dev"]
Run Code Online (Sandbox Code Playgroud)

Elasticache redis SG 入站规则: 在此处输入图片说明

EC2 SG 入站规则: 在此处输入图片说明

kac*_*ow6 5

我通过广泛的反复试验解决了这个问题。在 Docker 文档中找到了为我指明正确方向的主要提示:

默认情况下,容器会为其连接的每个 Docker 网络分配一个 IP 地址。IP 地址是从分配给网络的池中分配的...

Elasticache 实例只能从它们各自的 VPC 内部访问。根据我的配置,docker 容器和 ec2 实例在 2 个不同的 IP 地址上运行,但只有 EC2 IP 被列入白名单以连接到 Elasticache。

我必须将 docker 容器 IP 绑定到我的主机 EC2 IP,方法docker.compose.yml是将容器设置network_mode"host"

version: '3.8'
services:
  server:
    image: docker.pkg.github.com/$GITHUB_REPOSITORY/$REPOSITORY_NAME-server:github_ci_$GITHUB_RUN_NUMBER
    container_name: $REPOSITORY_NAME-server
    command: npm run dev
    ports:
      - "8080:8080"
      - "6379:6379"
    network_mode: "host"
    env_file: ./.env
...
Run Code Online (Sandbox Code Playgroud)