I have two docker projects each with their own docker-compose.yml files. One project holds a django api with docker host for that, while the other project is for open edx which running on another docker host. If I try to access my django api from one of these docker containers of the second docker host using docker exec -it edx.devstack.studio curl http://localhost:8000/number/
, I get an error curl: (7) Failed to connect to localhost port 8000: Connection refused
. I’m by no means a docker expert so there’s something I’m probably doing wrong. I tried adding all the docker services in both projects to the same network but it still failed, probably I’m doing it wrong. Any help will be much appreciated. Below are the two docker compose files.
Django project docker compose file
version: "3"
services:
db:
image: mysql:5.7
container_name: db
env_file:
- .env
ports:
- '3307:3307'
expose:
- '3307'
volumes:
- my-db:/var/lib/mysql
django:
build:
context: .
container_name: web
env_file:
- .env
command: python src/manage.py runserver 0.0.0.0:8000
depends_on:
- db
ports:
- "8000:8000"
volumes:
- .:/app
networks:
- okay
networks:
okay:
external: true
volumes:
my-db:
Open edx docker compose file
# This file contains all of the services for an edX installation. See https://docs.docker.com/compose/compose-file/
# for the appropriate syntax and definitions.
#
# Housekeeping Rules:
# - Group third-party and edX services separately
# - Alphabetize services in the groups
# - Alphabetize individual configuration options for each service
# - Every service's container name should be prefixed with "edx.devstack." to avoid conflicts with other containers
# that might be running for the same service.
version: "2.1"
services:
# Third-party services
chrome:
container_name: edx.devstack.chrome
image: edxops/chrome:${OPENEDX_RELEASE:-latest}
shm_size: 2g
ports:
- "15900:5900"
volumes: # for file uploads
- ../edx-e2e-tests/upload_files:/edx/app/e2e/edx-e2e-tests/upload_files
- ../edx-platform/common/test/data:/edx/app/edxapp/edx-platform/common/test/data
networks:
- okay
elasticsearch:
container_name: edx.devstack.elasticsearch
image: edxops/elasticsearch:devstack
# TODO: What to do about these forwarded ports? They'll conflict with ports forwarded by the Vagrant VM.
# ports:
# - "9200:9200"
# - "9300:9300"
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
- elasticsearch_data:/usr/share/elasticsearch/logs
networks:
- okay
firefox:
container_name: edx.devstack.firefox
image: edxops/firefox:${OPENEDX_RELEASE:-latest}
shm_size: 2g
ports:
- "25900:5900"
volumes: # for file uploads
- ../edx-e2e-tests/upload_files:/edx/app/e2e/edx-e2e-tests/upload_files
- ../edx-platform/common/test/data:/edx/app/edxapp/edx-platform/common/test/data
networks:
- okay
memcached:
container_name: edx.devstack.memcached
image: memcached:1.4.24
# ports:
# - "11211:11211"
networks:
- okay
mongo:
# We use WiredTiger in all environments. In development environments we use small files
# to conserve disk space, and disable the journal for a minor performance gain.
# See https://docs.mongodb.com/v3.0/reference/program/mongod/#options for complete details.
command: mongod --smallfiles --nojournal --storageEngine wiredTiger
container_name: edx.devstack.mongo
image: mongo:3.2.16
# ports:
# - "27017:27017"
volumes:
- mongo_data:/data/db
networks:
- okay
mysql:
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
container_name: edx.devstack.mysql
environment:
MYSQL_ROOT_PASSWORD: ""
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
image: mysql:5.6
# ports:
# - "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- okay
# edX services
credentials:
command: bash -c 'source /edx/app/credentials/credentials_env && while true; do python /edx/app/credentials/credentials/manage.py runserver 0.0.0.0:18150; sleep 2; done'
container_name: edx.devstack.credentials
depends_on:
- mysql
- memcached
# Allows attachment to the credentials service using 'docker attach <containerID>'.
stdin_open: true
tty: true
environment:
CACHE_LOCATION: edx.devstack.memcached:12211
DB_HOST: edx.devstack.mysql
SOCIAL_AUTH_EDX_OIDC_URL_ROOT: http://edx.devstack.lms:18000/oauth2
ENABLE_DJANGO_TOOLBAR: 1
image: edxops/credentials:${OPENEDX_RELEASE:-latest}
ports:
- "18150:18150"
networks:
- okay
discovery:
command: bash -c 'source /edx/app/discovery/discovery_env && while true; do python /edx/app/discovery/discovery/manage.py runserver 0.0.0.0:18381; sleep 2; done'
container_name: edx.devstack.discovery
depends_on:
- mysql
- elasticsearch
- memcached
# Allows attachment to the discovery service using 'docker attach <containerID>'.
stdin_open: true
tty: true
environment:
TEST_ELASTICSEARCH_URL: "http://edx.devstack.elasticsearch:9200"
ENABLE_DJANGO_TOOLBAR: 1
image: edxops/discovery:${OPENEDX_RELEASE:-latest}
ports:
- "18381:18381"
volumes:
- discovery_assets:/edx/var/discovery/
networks:
- okay
ecommerce:
command: bash -c 'source /edx/app/ecommerce/ecommerce_env && while true; do python /edx/app/ecommerce/ecommerce/manage.py runserver 0.0.0.0:18130; sleep 2; done'
container_name: edx.devstack.ecommerce
depends_on:
- mysql
- memcached
# Allows attachment to the ecommerce service using 'docker attach <containerID>'.
stdin_open: true
tty: true
environment:
ENABLE_DJANGO_TOOLBAR: 0
image: edxops/ecommerce:${OPENEDX_RELEASE:-latest}
ports:
- "18130:18130"
networks:
- okay
lms:
command: bash -c 'source /edx/app/edxapp/edxapp_env && while true; do python /edx/app/edxapp/edx-platform/manage.py lms runserver 0.0.0.0:18000 --settings devstack_docker; sleep 2; done'
container_name: edx.devstack.lms
depends_on:
- devpi
- mysql
- memcached
- mongo
# Allows attachment to the LMS service using 'docker attach <containerID>'.
stdin_open: true
tty: true
environment:
BOK_CHOY_HOSTNAME: edx.devstack.lms
BOK_CHOY_LMS_PORT: 18003
BOK_CHOY_CMS_PORT: 18031
EDXAPP_TEST_MONGO_HOST: edx.devstack.mongo
NO_PYTHON_UNINSTALL: 1
image: edxops/edxapp:${OPENEDX_RELEASE:-latest}
ports:
- "18000:18000"
- "19876:19876" # JS test debugging
# - "18003:18003"
# - "18031:18031"
volumes:
- edxapp_lms_assets:/edx/var/edxapp/staticfiles/
networks:
- okay
edx_notes_api:
command: bash -c 'source /edx/app/edx_notes_api/edx_notes_api_env && while true; do python /edx/app/edx_notes_api/edx_notes_api/manage.py runserver 0.0.0.0:18120 --settings notesserver.settings.devstack; sleep 2; done'
container_name: edx.devstack.edx_notes_api
depends_on:
- devpi
- elasticsearch
- mysql
image: edxops/notes:${OPENEDX_RELEASE:-latest}
ports:
- "18120:18120"
environment:
DB_ENGINE: "django.db.backends.mysql"
DB_HOST: "edx.devstack.mysql"
DB_NAME: "notes"
DB_PASSWORD: "password"
DB_PORT: "3306"
DB_USER: "notes001"
ENABLE_DJANGO_TOOLBAR: 1
ELASTICSEARCH_URL: "http://edx.devstack.elasticsearch:9200"
networks:
- okay
studio:
command: bash -c 'source /edx/app/edxapp/edxapp_env && while true; do python /edx/app/edxapp/edx-platform/manage.py cms runserver 0.0.0.0:18010 --settings devstack_docker; sleep 2; done'
container_name: edx.devstack.studio
depends_on:
- devpi
- mysql
- memcached
- mongo
# Allows attachment to the Studio service using 'docker attach <containerID>'.
stdin_open: true
tty: true
environment:
BOK_CHOY_HOSTNAME: edx.devstack.studio
BOK_CHOY_LMS_PORT: 18103
BOK_CHOY_CMS_PORT: 18131
EDXAPP_TEST_MONGO_HOST: edx.devstack.mongo
NO_PYTHON_UNINSTALL: 1
image: edxops/edxapp:${OPENEDX_RELEASE:-latest}
ports:
- "18010:18010"
- "19877:19877" # JS test debugging
# - "18103:18103"
# - "18131:18131"
volumes:
- edxapp_studio_assets:/edx/var/edxapp/staticfiles/
networks:
- okay
forum:
command: bash -c 'source /edx/app/forum/ruby_env && source /edx/app/forum/devstack_forum_env && cd /edx/app/forum/cs_comments_service && bundle install && while true; do ruby app.rb -o 0.0.0.0 ; sleep 2; done'
container_name: edx.devstack.forum
depends_on:
- mongo
- memcached
- elasticsearch
image: edxops/forum:${OPENEDX_RELEASE:-latest}
ports:
- "44567:4567"
networks:
- okay
devpi:
container_name: edx.devstack.devpi
image: edxops/devpi:${OPENEDX_RELEASE:-latest}
ports:
- "3141:3141"
volumes:
- devpi_data:/data
networks:
- okay
networks:
okay:
external: true
volumes:
discovery_assets:
edxapp_lms_assets:
edxapp_studio_assets:
elasticsearch_data:
mongo_data:
mysql_data:
devpi_data:
2
Answers
Thanks to this answer I was able to get a solution to this, you can use host.docker.internal which resolve to your ip address rather than using
localhost
which would refer to that container. This will allow you to make a request to an api running on a different container. For instance usehttp://host.docker.internal:8000/number/
instead ofhttp://localhost:8000/number/
.first inspect “db” container and check its network, because it is not explicitly joined to “okay” network.