Docker compose - 从另一个容器调用服务时名称或服务未知

use*_*710 7 docker docker-compose

我在一个容器中有一个 Django 应用程序,试图将其与 Redis 和 Mysql 容器组合在一起。然而,调用

redis://redis:6379
Run Code Online (Sandbox Code Playgroud)

来自 Django 应用程序,给了我

ConnectionError: Error -2 connecting redis://redis:6379. Name or service not known.
Run Code Online (Sandbox Code Playgroud)

与其他工作解决方案相比,我没有看到我的设置有任何差异。我错过了什么吗?我的 docker-compose.yml

version: '3'

services:
  web:
    build: .
    environment:
      - REDIS_HOST=redis
    restart: always
    command: bash -c "python manage.py runserver --settings=settings.production_cs 0.0.0.0:8000"
    container_name: eprofi
    volumes:
      - .:/eprofi
    ports:
      - "8000:8000"
    depends_on:
      - db
      - redis
    links:
      - db:postgres
      - redis:redis
  db:
    image: mysql:latest
    command: mysqld --default-authentication-plugin=mysql_native_password
    volumes:
      - "./mysql:/var/lib/mysql"
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=secret123
      - MYSQL_DATABASE=django_app
      - MYSQL_USER=django_app
      - MYSQL_PASSWORD=django_app123
  redis:
    restart: always
    image: redis:latest
    ports:
      - "6379:6379"
Run Code Online (Sandbox Code Playgroud)

我的 Dockerfile

# We Use an official Python runtime as a parent image
FROM python:2.7.13
ENV DEBIAN_FRONTEND noninteractive

ENV PYTHONDONTWRITEBYTECODE 1
# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONUNBUFFERED 1

# create root directory for our project in the container
RUN mkdir /www

# Set the working directory to /www
WORKDIR /www

#Upgrade pip
RUN pip install pip -U

#Install dependencies
ADD requirements.txt /www/
RUN pip install -r requirements.txt --src /usr/local/src

# Copy the current directory contents into the container at /www
ADD . /www/
Run Code Online (Sandbox Code Playgroud)

那我就做

docker-compose build
docker-compose up
Run Code Online (Sandbox Code Playgroud)

一切都按预期开始,但使用“redis://redis:6379”调用 Redis 会给出上述“名称或服务未知”。错误。

我的工具

docker-compose version 1.17.1, build unknown
docker-py version: 2.5.1
Client: Docker Engine - Community
 Version:           19.03.4
Run Code Online (Sandbox Code Playgroud)

更新 1 我如何从 python 应用程序(旧 Django)调用 Redis。

Django 应用程序的设置:

CACHES = {
    'my_cache': {
        'BACKEND': 'redis_cache.RedisCache',
        'LOCATION': 'redis://{}:{}'.format(REDIS_HOST, REDIS_PORT),
        'KEY_PREFIX': 'project/my_cache',
        'TIMEOUT': 60*60*24,  # expire in 24 hours
        'OPTIONS': {
            'DB': 1,
            'PARSER_CLASS': 'redis.connection.HiredisParser'
        }
    },
}
Run Code Online (Sandbox Code Playgroud)

称呼:

cache = get_cache('my_cache')
cache.get(cache_key)
Run Code Online (Sandbox Code Playgroud)

更新2

命令

ping redis
Run Code Online (Sandbox Code Playgroud)

在容器中运行给我一个错误

ping: unknown host
Run Code Online (Sandbox Code Playgroud)

Vas*_*las 1

links根据文档,该选项已被弃用。为了使服务能够相互调用,它们应该位于同一网络上。因此,对于您的示例,解决方案是这样的。您可以在这里了解有关网络的更多信息。

version: '3'

services:
  web:
    ...
    networks:
      - my_network
  db:
    ...
    networks:
      - my_network
  redis:
    ...
    networks:
      - my_network

networks:
  my_network:
    external:
      name: my_network
Run Code Online (Sandbox Code Playgroud)

  • 不,您不需要设置外部网络即可正常工作。compose 会默认为您创建它 (2认同)
  • 您不需要_任何_ `network:` 声明即可使其工作。Compose 将为您创建一个“默认”网络,并将所有容器附加到其中。 (2认同)