在此示例中,如何使用 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-compose 设置特定的 IP 地址
java 说明如何使用Jolt实现JSON转换。在此示例中,JSON文件是内存中的字符串。