在此示例中,如何使用 docker-compose 允许 2 个容器正确共享 .sock 文件?

Posted

技术标签:

【中文标题】在此示例中,如何使用 docker-compose 允许 2 个容器正确共享 .sock 文件?【英文标题】:How do i use docker-compose to allow for 2 containers to share a .sock file correctly in this example? 【发布时间】:2019-10-23 20:08:22 【问题描述】:

我正在开发我的 AWS EC2 实例,现在将我的应用程序 dockerising 以使其准备好投入生产。我有一个用于后端和 React 前端的 Django api。目的是使用 gunicorn 作为后端来提供 api 和 nginx 来提供 react 静态文件。我有 2 个 docker 文件,一个用于后端,一个用于前端。后端在 docker 中使用 gunicorn 并且还使用 docker-compose。

我一直在努力解决前端问题。 docker本身将使用npm start(而不是nginx)运行,但是拒绝使用docker-compose,您能否根据下面的代码提出我需要更正的建议? (当我也在写这篇文章时,我发现前端的 docker copose 本身并没有最终启动)

在此之后,我将尝试让它再次与 nginx 一起工作,因此不会在 prod 中使用 npm start。

此外,我想知道如何共享 gunicorn 创建的 .sock 文件,以便 nginx 在 2 个单独的 docker 中使用。如果这不是连接我的前端和后端的正确方法,请告知最佳方法,我们将不胜感激。

我尝试过: - 对 docker compose 的各种附加和更改,包括向前端服务添加一个depends_on 以依赖于后端。 - 不同解决方案的组合具有相同的网络和数量,并且认为它无论如何都没有帮助。

终端输出:

(project) ubuntu@XXXXXXXXXXX:~/django-react-app$ docker-compose up
Starting django-react-app_frontend_1 ... done
Starting django-react-app_backend_1  ... done
Attaching to django-react-app_frontend_1, django-react-app_backend_1
backend_1   | [2019-06-08 16:04:51 +0000] [1] [INFO] Starting gunicorn 19.9.0
backend_1   | [2019-06-08 16:04:51 +0000] [1] [INFO] Listening at: http://0.0.0.                               0:8000 (1)
backend_1   | [2019-06-08 16:04:51 +0000] [1] [INFO] Using worker: sync
backend_1   | [2019-06-08 16:04:51 +0000] [8] [INFO] Booting worker with pid: 8
backend_1   | /usr/local/lib/python3.7/site-packages/psycopg2/__init__.py:144: U                               serWarning: The psycopg2 wheel package will be renamed from release 2.8; in orde                               r to keep installing from binary please use "pip install psycopg2-binary" instea                               d. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-f                               rom-pypi>.
backend_1   |   """)

docker-compose.yml 文件

version: "3"
services:

  frontend:
    build:
      context: .
      dockerfile: frontend_docker
    ports:
      - "3000:3000"
    volumes:
      - codevolume:/code
    networks:
      - backend

  backend:
    build:
      context: .
      dockerfile: backend_docker
    ports:
      - "8000:8000"
    volumes:
      - codevolume:/code
    networks:
      - backend

volumes:
  codevolume: 
# Networks to be created to facilitate communication between containers
networks:
  backend: 

frontend_dockerfile

FROM node:11.15

USER root

SHELL ["/bin/bash", "-c"]

RUN apt-get update -y && \
 apt-get install -y nginx && \
 apt-get clean && \
 mkdir /code/ && \
 rm -rf /tmp/*

WORKDIR /code

COPY source/frontend/ /code/

RUN npm install && \
 npm cache clear --force && \
 rm -rf /tmp/*

RUN npm run-script build && \
 rm -rf /tmp/*

#will only be using one of these with nginx and removing the other once i resolve this *** issue :)
EXPOSE 8000
EXPOSE 3000

COPY configs/nginx.conf /tmp/

RUN mv /tmp/nginx.conf /etc/nginx/sites-available/myreactfrontend && \
 ln -s /etc/nginx/sites-available/myreactfrontend /etc/nginx/sites-enabled

#will ideally be switching to nginx afterward, may even look into multi stage builds if people think this would be recommended
#ENTRYPOINT ["/bin/bash", "-c", "nginx -g 'daemon off;'"]
ENTRYPOINT ["/bin/bash", "-c", "npm start"]

下面的文件工作正常,所以不需要编辑,我正在提供文件,所以它在上下文中有意义。

后端码头工人

FROM python:3

USER root

SHELL ["/bin/bash", "-c"]

RUN mkdir /code

WORKDIR /code

COPY requirements/base.txt /code/

COPY source/backend/ /code/

ENV PYTHONUNBUFFERED 1

ENV DJANGO_SETTINGS_MODULE=mydjangoapi.settings.base

RUN pip install -r base.txt && \
 python manage.py makemigrations && \
 python manage.py migrate

EXPOSE 8000

ENTRYPOINT ["/bin/bash", "-c", "gunicorn --bind 0.0.0.0:8000 mydjangoapi.wsgi"] 

【问题讨论】:

如果你手动构建并运行前端容器,它是否工作(使用docker build)?执行docker-compose up 后容器是继续运行还是立即关机(docker ps -a)?您可以尝试从前端抓取日志以查看问题是否是内部问题-docker logs -f container-name(将container-name 替换为容器名称).. 是的,当我在没有 docker-compose 的情况下使用它时它确实有效。另外,(如果我错了,请纠正或建议我)我认为在我的终端中运行 docker-compose 时我无法获取它的日志,我所看到的只是上面附加的输出。我无法在它之后运行另一个命令,因为它似乎没有启动并且仍在运行。我什至等了10分钟,但没有运气。注意:容器启动并运行不到一分钟。 如果你想让容器在后台运行(也称为守护进程,因此是-d),你必须使用docker-compose up -d,这样你就可以再次访问你的控制台。运行该命令后,运行 docker ps -a 以查看容器是否自动停止或是否仍在运行 - 之后,尝试 docker logs -f your-container-name 检查日志(您需要点击 CTRL+C 以突破 @987654334 @命令...让我知道它是怎么回事! 为此干杯!还没有到在分离模式下运行 docker-compose 的地步。然而,容器都在运行,前端容器的 docker 日志中实际上没有任何内容。还有其他指针吗? 那么前端的问题是启动后无法访问吗? 【参考方案1】:

简而言之,此问题的修复程序正在运行 docker-compose build,因为 OP 正在通过 docker-compose.yml 文件内部的 dockerfile 构建容器,而不仅仅是通过 docker-compose '打开图像'。

【讨论】:

以上是关于在此示例中,如何使用 docker-compose 允许 2 个容器正确共享 .sock 文件?的主要内容,如果未能解决你的问题,请参考以下文章

docker学习 docker-compose使用示例

如何使用可访问的 docker-compose 设置特定的 IP 地址

java 说明如何使用Jolt实现JSON转换。在此示例中,JSON文件是内存中的字符串。

在此示例中,数据缓存如何路由对象?

docker-compose 构建mongodb并导入基础数据示例

在此示例中,如何强制 EF 仅更新 Db 中的一列?