简体   繁体   中英

Docker Django could not connect to server: Connection refused

I'm new to Docker, and I'm trying to put my Django rest API in a container with Nginx, Gunicorn and Postgres, using docker-compose and docker-machine. Following this tutorial: https://realpython.com/blog/python/django-development-with-docker-compose-and-machine/

Most of my code is the same as the tutorial's ( https://github.com/realpython/dockerizing-django ). with some minor name changes.

this my docker-compose.yml (I changed the gunicorn command to runserver for debugging purposes)

web:
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
    - redis:redis
  volumes:
    - /usr/src/app
    - /usr/src/app/static
  env_file: .env
  environment:
    DEBUG: 'true'
  command: /usr/local/bin/python manage.py runserver

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  volumes:
    - /www/static
  volumes_from:
    - web
  links:
    - web:web

postgres:
  restart: always
  image: postgres:latest
  ports:
    - "5432:5432"
  volumes:
    - pgdata:/var/lib/postgresql/data/

redis:
  restart: always
  image: redis:latest
  ports:
    - "6379:6379"
  volumes:
    - redisdata:/data

And this is in my settings.py of Django:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'postgres',
        'PORT': '5432',
    }
}

Nginx and postgres (and redis) are up and running, however my django server wont start, by this error:

web_1       | django.db.utils.OperationalError: could not connect to server: Connection refused
web_1       |   Is the server running on host "localhost" (::1) and accepting
web_1       |   TCP/IP connections on port 5432?
web_1       | could not connect to server: Connection refused
web_1       |   Is the server running on host "localhost" (127.0.0.1) and accepting
web_1       |   TCP/IP connections on port 5432?

I've googled a lot and I've verified that postgres is running, on port 5432, I can connect to it using psql command .

I am lost. What is my mistake?

EDIT: It appears that it is not using my settings.py file or something, since it's asking if the server is running on localhost, while settings should be looking for postgres.

When those who have this problem please check your settings.py :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'db'
    }
}

Your HOST:'db' and docker-compose file db name should be same. If you want to rename from db, make sure that you change in docker-compose file and setting.py :

db:
  restart: always
  image: postgres:latest
  ports:
    - "5432:5432"
  volumes:
    - pgdata:/var/lib/postgresql/data/

Checkout your manage.py, there should be a line

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

if there is no such line, put it

set your DJANGO_SETTINGS_MODULE with respect to PYTHONPATH .

UPD i cloned your repo and launched the web service by changing command in docker-compose.yml

-  command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000
+  command: python manage.py runserver 0.0.0.0:8000

I'm sure DJANGO_SETTINGS_MODULE is correct.

I'm exactly facing the same issue, while runing my django app with docker on aws ec2 instance.

I noticed that this error only happend for the first time the docker image is build, so to fix i juste ran :

CTRL + C then docker-compose up again and everything worked fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM