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

ocebsuys  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(406)

作为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)

更新:我可以通过redis cli从ec2本身连接:

redis-cli -c -h***.cache.amazonaws.com -p 6379 ping
> PONG

看起来我无法连接到redis示例,因为docker容器使用的ip与elasticache示例不在同一vpc中。在从远程映像构建容器时,如何设置docker配置以使用与主机相同的ip?任何帮助都将不胜感激。
mydocker-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

服务器容器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"]

elasticache redis sg入站规则:

ec2 sg入站规则:

qlzsbp2j

qlzsbp2j1#

我通过广泛的试验和错误解决了这个问题。docker文档中的主要提示为我指明了正确的方向:
默认情况下,为容器连接到的每个docker网络分配一个ip地址。ip地址是从分配给网络的池中分配的。。。
elasticache示例只能从各自的vpc内部访问。根据我的配置,docker容器和ec2示例在两个不同的ip地址上运行,但是只有ec2ip被列入了连接elasticache的白名单。
我必须将docker容器ip绑定到我的服务器中的主机ec2ip 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
...

相关问题