在docker compose中更改容器端口

在docker compose中更改容器端口,docker,apache-spark,airflow,Docker,Apache Spark,Airflow,我正在尝试让docker compose文件同时使用气流和火花。气流通常在8080:8080上运行,这也是spark所需要的。我有以下docker compose文件: version: '3.7' services: master: image: gettyimages/spark command: bin/spark-class org.apache.spark.deploy.master.Master -h master hostname: ma

我正在尝试让docker compose文件同时使用气流和火花。气流通常在8080:8080上运行,这也是spark所需要的。我有以下docker compose文件:

version: '3.7'
services:
    master:
      image: gettyimages/spark
      command: bin/spark-class org.apache.spark.deploy.master.Master -h master
      hostname: master
      environment:
        MASTER: spark://master:7077
        SPARK_CONF_DIR: /conf
        SPARK_PUBLIC_DNS: localhost
      expose:
        - 7001
        - 7002
        - 7003
        - 7004
        - 7005
        - 7077
        - 6066
      ports:
        - 4040:4040
        - 6066:6066
        - 7077:7077
        - 8080:8080
      volumes:
        - ./conf/master:/conf
        - ./data:/tmp/data

    worker:
      image: gettyimages/spark
      command: bin/spark-class org.apache.spark.deploy.worker.Worker spark://master:7077
      hostname: worker
      environment:
        SPARK_CONF_DIR: /conf
        SPARK_WORKER_CORES: 2
        SPARK_WORKER_MEMORY: 1g
        SPARK_WORKER_PORT: 8881
        SPARK_WORKER_WEBUI_PORT: 8081
        SPARK_PUBLIC_DNS: localhost
      links:
        - master
      expose:
        - 7012
        - 7013
        - 7014
        - 7015
        - 8881
      ports:
        - 8081:8081
      volumes:
        - ./conf/worker:/conf
        - ./data:/tmp/data
    postgres:
        image: postgres:9.6
        environment:
            - POSTGRES_USER=airflow
            - POSTGRES_PASSWORD=airflow
            - POSTGRES_DB=airflow
        logging:
            options:
                max-size: 10m
                max-file: "3"

    webserver:
        image: puckel/docker-airflow:1.10.9
        restart: always
        depends_on:
            - postgres
        environment:
            - LOAD_EX=y
            - EXECUTOR=Local
        logging:
            options:
                max-size: 10m
                max-file: "3"
        volumes:
            - ./dags:/usr/local/airflow/dags
            # Add this to have third party packages
            - ./requirements.txt:/requirements.txt
            # - ./plugins:/usr/local/airflow/plugins
        ports:
            - "8082:8080" # NEED TO CHANGE THIS LINE
        command: webserver
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
            interval: 30s
            timeout: 30s
            retries: 3
但具体来说,我们需要改变路线:

ports:
    - "8082:8080" # NEED TO CHANGE THIS LINE

在web服务器下,因此没有端口冲突。但是,当我将容器端口更改为8080:8080以外的其他端口时,它不工作,无法连接/查找服务器。如何成功更改容器端口?

在docker中指定端口映射时,您将提供2个端口,例如:8082:8080。 右端口是在容器中侦听的端口。 可以有多个容器在内部侦听同一端口。它们在您的本地主机中仍然不可用-这就是为什么我们使用ports部分

现在,在本地主机中,不能多次绑定同一端口。这就是为什么docker在多次尝试设置左侧8080时失败的原因。 在当前撰写文件中,spark服务端口映射到8080:8080的8080左侧,Web服务器服务映射到8082:8080的8082左侧


如果要访问spark,请转到:http://localhost:8080 对于web服务器,请转到http://localhost:8082

在docker中指定端口映射时,将提供两个端口,例如:8082:8080。 右端口是在容器中侦听的端口。 可以有多个容器在内部侦听同一端口。它们在您的本地主机中仍然不可用-这就是为什么我们使用ports部分

现在,在本地主机中,不能多次绑定同一端口。这就是为什么docker在多次尝试设置左侧8080时失败的原因。 在当前撰写文件中,spark服务端口映射到8080:8080的8080左侧,Web服务器服务映射到8082:8080的8082左侧


如果要访问spark,请转到:http://localhost:8080 对于web服务器,请转到http://localhost:8082

我不明白-如果您的Web服务器可以通过localhost:8082访问,而spark可以通过localhost:8080访问,那有什么问题吗?我不知道,我对docker很陌生,所以可能什么都没有?但是,8080:8080和8082:8080这两个数字不就是造成集装箱港口冲突的原因吗?我完全准备好在这里犯错,btwI不明白-如果你的Web服务器可以在localhost:8082中访问,而spark可以在localhost:8080中访问,那有什么问题吗?我不知道,我对docker很陌生,所以可能什么都没有?但是,8080:8080和8082:8080这两个数字不就是造成集装箱港口冲突的原因吗?我完全准备好在这里犯错。谢谢你,这很有帮助。当我尝试运行pyspark作业时,我发现错误Java网关进程在发送端口号之前就结束了。你知道如何修复吗?如果没有,我将提出一个单独的问题,解决这个问题的办法是什么?docker log中是否可以监控此冲突?@DBA108642这是一个不同的问题,但在内部,如果两个容器想要相互通信,则应使用容器名称和实际的内部端口。例如,如果工作人员想与master对话,则应使用master:。希望这是帮助谢谢,我认为用另一个问题问更合适,@mountainLion冲突是由docker compose在向上命令之前确定的谢谢,这很有帮助。当我尝试运行pyspark作业时,我发现错误Java网关进程在发送端口号之前就结束了。你知道如何修复吗?如果没有,我将提出一个单独的问题,解决这个问题的办法是什么?docker log中是否可以监控此冲突?@DBA108642这是一个不同的问题,但在内部,如果两个容器想要相互通信,则应使用容器名称和实际的内部端口。例如,如果工作人员想与master对话,则应使用master:。希望这是帮助谢谢,我认为用另一个问题问更合适,@mountainLion冲突是由docker compose在up命令之前确定的