docker - 使用与从主机发送请求相同的网络从 docker 容器发送 http 请求
问题描述
我的申请是dockerized
. 它的python/django
应用。我们正在使用基于 IP 限制的本地短信发送 API。所以我给了他们我的EC2
IP地址。我正在这EC2
台机器上运行我的 docker 容器。但是我的 python 应用程序无法向该机器发送请求。因为这个 docker 容器有不同的 IP。
我该如何解决这个问题?
Dockerfile
# ToDo use alpine image
FROM python:3.6
# Build Arguments with defaults
ARG envior
ARG build_date
ARG build_version
ARG maintainer_name='Name'
ARG maintainaer_email='email@email.com'
# Adding Labels
LABEL com.example.service="Service Name" \
com.example.maintainer.name="$maintainer_name" \
com.example.maintainer.email="$maintainaer_email" \
com.example.build.enviornment="$envior" \
com.example.build.version="$build_version" \
com.example.build.release-date="$build_date"
# Create app directory
RUN mkdir -p /home/example/app
# Install Libre Office for pdf conversion
RUN apt-get update -qq \
&& apt-get install -y -q libreoffice \
&& apt-get remove -q -y libreoffice-gnome
# Cleanup after apt-get commands
RUN apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
/var/cache/apt/archives/*.deb /var/cache/apt/*cache.bin
# Activate WORKING DIR
WORKDIR /home/example/app
# Copying requirements
COPY requirements/${envior}.txt /tmp/requirements.txt
# Install the app dependencies
# ToDo Refactor requirements
RUN pip install -r /tmp/requirements.txt
# Envs
ENV DJANGO_SETTINGS_MODULE app.settings.${envior}
ENV ENVIORNMENT ${envior}
# ADD the source code and entry point into the container
ADD . /home/example/app
ADD entrypoint.sh /home/example/app/entrypoint.sh
# Making entry point executable
RUN chmod +x entrypoint.sh
# Exposing port
EXPOSE 8000
# Entry point and CMD
ENTRYPOINT ["/home/example/app/entrypoint.sh"]
码头工人-compose.yml
version: '3'
services:
postgres:
image: onjin/alpine-postgres:9.5
restart: unless-stopped
ports:
- "5432:5432"
environment:
LC_ALL: C.UTF-8
POSTGRES_USER: django
POSTGRES_PASSWORD: django
POSTGRES_DB: web
volumes:
- postgres_data:/var/lib/postgresql/data/
web:
build:
context: .
args:
environ: local
command: gunicorn app.wsgi:application -b 0.0.0.0:8000
ports:
- "8000:8000"
depends_on:
- postgres
environment:
DATABASE_URL: 'postgres://django:django@postgres/web'
DJANGO_MANAGEPY_MIGRATE: 'on'
DJANGO_MANAGEPY_COLLECTSTATIC: 'on'
DJANGO_LOADDATA: 'off'
DOMAIN: '0.0.0.0'
volumes:
postgres_data:
解决方案
您应该尝试将容器放在与您的 EC2 实例相同的网络中。这意味着使用带有host
驱动程序的网络。
建议docker-compose文件
version: '3'
services:
postgres:
[...]
networks:
- host
volumes:
- postgres_data:/var/lib/postgresql/data/
web:
[...]
networks:
- host
volumes:
postgres_data:
networks:
host:
如果它不起作用,您可以通过以下方式定义自己的网络:
networks:
appnet:
driver: host
并连接到该网络形式的服务:
postgres:
[..]
networks:
- appnet
推荐阅读
- spring - 如何对子属性中包含的 ID 进行复杂的 @PreAuthorize 检查?
- rust - 具有可变引用的递归结构中的生命周期
- templates - 在生产站点中为 getTemplate lsit 调用 Docusign API 失败?
- rundeck - 有没有办法使用非登录用户来运行 Rundeck 作业?
- php - WampServer, mysqli_connect (HY000/1045) 拒绝用户访问
- javascript - 无法读取 null 的属性“角色”
- javascript - 从 HTML 输入中获取日期以在 JS 中使用
- mysql - 优化二级索引和日期范围查询
- scala - 尝试失败时的短路映射操作
- c# - 我的 NLog 记录没有保存。我在哪里可以看到我的 NLog 保存失败?