我有一个以端口为起点的python docker容器。8000
. 这个过程,在用户交互之后,在同一个容器中,启动了 h20 后台的java进程在端口中 54321
.
两个端口都暴露在Docker文件中。
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
RUN apt update && apt install -y default-jre
EXPOSE 8000
EXPOSE 54321
COPY . /code/
两个端口都被映射到 docker-compose.yml
:
backend:
image: xxxxx/xxx-backend
build: backend/xxx/.
ports:
- "8000:8000"
- "54321:54321"
environment:
- "KEY: value"
command: python manage.py runserver 0.0.0.0:8000
depends_on:
- db
networks:
- xxx
问题是:
当容器运行时,8000端口是被映射的,但当我启动这个容器时 水 服务器(是python h2o.init()
),服务器启动了,而且运行起来了(从容器里面的lynx可以访问到localhost:54321),但是映射没有用。看来 54321
端口根本没有被映射,因为它不在 CMD 或启动进程中。
有什么办法可以在容器启动时,即使进程没有启动,也能映射端口?
更新
这是我的 docker-compose ps
:
Name Command State Ports
-------------------------------------------------------------------------------------------------------------
some_container_1 python manage.py runserver ... Up 0.0.0.0:54321->54321/tcp, 0.0.0.0:8000->8000/tcp
你可以尝试的一件事是通过使用绕过容器化进行网络化来作弊。
network_mode: "host"
这里有一篇不同的stackoverflow文章 有关于这方面的讨论。
以及compose文档的链接。
所以,试试这个。
backend:
image: xxxxx/xxx-backend
build: backend/xxx/.
network_mode: "host"
environment:
- "KEY: value"
command: python manage.py runserver 0.0.0.0:8000
depends_on:
- db
networks:
- xxx