Назад | Перейти на главную страницу

Неожиданный порт 8080 на докере ps

Я использую docker-compose up для запуска контейнера, а затем использую docker ps для отображения его информации, я вижу, что часть ПОРТОВ выглядит следующим образом

0.0.0.0:2280->2280/tcp, 0.0.0.0:7000->7000/tcp, 8080/tcp

8080 - это неожиданно. Dockerfiles для создания образов:

    FROM tomcat
    MAINTAINER tol <etol@126.com>
    RUN apt-get update && apt-get install vim -y \
                && mkdir -p /data/appdatas/cat \
                && cd /usr/local/tomcat/webapps && rm -rf  docs  examples \
                && touch ~/.vimrc && echo "set mouse-=a" > ~/.vimrc && . ~/.vimrc
    COPY server.xml /usr/local/tomcat/conf
    COPY  datasource.xml  client.xml /data/appdatas/cat/
    COPY cat.war /usr/local/tomcat/webapps

нет "8080" в server.xml, datasource.xml и client.xml, которые используются в cat.war, поэтому они не имеют значения

docker-compose.xml выглядит следующим образом:

    version: "2"
    services:
      pica-cat3:
        container_name: pica-cat3
        image: pica-cat3:latest
        ports:
          - 7000:7000
          - 2280:2280
        volumes:
          - /opt/cat-logs:/data/applogs/cat
          - /root/cat3/datasource.xml:/data/appdatas/cat/datasource.xml
          - /root/cat3/client.xml:/data/appdatas/cat/client.xml
          - /root/cat3/server.xml:/usr/local/tomcat/conf/server.xml
        command: /bin/sh -c '/usr/local/tomcat/bin/catalina.sh run'

когда я вхожу в контейнер с помощью docker exec -it CONTAINER_ID bash и выполняю netstat -nlp, 8080 тоже нет,

у меня вопрос, как 8080 в части ПОРТОВ?

Он унаследован от образа кота.

Вы можете проверить Dockerfile для образа tomcat здесь, в конце вы найдете:

EXPOSE 8080

В настоящее время Docker не имеет механизмов для отключения или удаления унаследованных открытых портов. По этому поводу есть проблема, которая обсуждается с 2014 года (!) в системе отслеживания проблем проекта Moby, связанный с Docker.

Eсть обходной путь, упомянутый в этой проблеме, используя многоступенчатые сборки:

FROM postgres as orig
FROM alpine:3.8 as postgres
COPY --from=orig / /
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 5432
CMD ["postgres"]

Однако этот метод имеет обратную сторону:

[...] COPY --from=xxx ... не сохранит право собственности на файловую систему, поэтому вы можете быть осторожны с этим обходным путем.

Вам решать, подходит ли вам этот обходной путь. Лично в вашем случае я бы просто повторно использовал порт 8080. Вы можете сопоставить его с любым портом, который вам нравится, когда вы его публикуете.