【问题标题】:How to run and access web server running inside a Docker container如何运行和访问在 Docker 容器中运行的 Web 服务器
【发布时间】:2020-05-02 09:20:49
【问题描述】:

我很难理解 Docker 是如何处理事情的。

我正在尝试运行节点 Web 服务器以用于开发目的。我在 docker-compose.yml 中定义了它,当我从那里运行它时一切正常。但是当我从容器内部手动运行它时,它无法从外部到达。

例如:这工作正常

node:
        image: node:10.15-stretch
        tty: true
        command: bash -c "./node_modules/.bin/encore dev-server --host 0.0.0.0 --public http://dev.local:8080 --port 8080 --disable-host-check --hot"
        working_dir: /var/www/
        volumes:
            - ${PATH_SOURCE}:/var/www/
        ports:
            - 8080:8080

现在可以从http://dev.local:8080 访问这些文件!

但我宁愿只在需要时手动运行它... 所以我从 docker-compose.yml 中删除命令并从容器内部运行它:

node:
        image: node:10.15-stretch
        tty: true
        working_dir: /var/www/
        volumes:
            - ${PATH_SOURCE}:/var/www/
        ports:
            - 8080:8080
docker-compose run node bash
root@1535e3c963cc:/var/www/# ./node_modules/.bin/encore dev-server --host 0.0.0.0 --public http://dev.local:8080 --port 8080 --disable-host-check --hot

进程运行正常,但文件无法http://dev.local:8080 访问...

我确定 Docker 中缺少一些东西,但我找不到什么...

感谢您的帮助。

编辑: 这里是完整的配置

version: '3'
services:
    apache:
        image: httpd
        volumes:
            - ${PATH_SOURCE}/.docker/conf/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf
            - ${PATH_SOURCE}/.docker/conf/apache/httpd-vhosts.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf
            - ${PATH_SOURCE}:/var/www/sadc/alarm
        ports:
            - 80:80
            - 443:443
        restart: always
        depends_on:
            - php
            - postgres

    php:
        build: .docker
        restart: always
        ports:
            - 9000:9000
        volumes:
            - ${PATH_SOURCE}/.docker/conf/php/php.ini:/etc/php/7.1/cli/php.ini
            - ${PATH_SOURCE}/.docker/conf/php/php.ini:/etc/php/7.1/fpm/php.ini
            - ${PATH_SOURCE}:/var/www/sadc/alarm
        environment:
            - PGDATESTYLE=ISO,DMY
        working_dir: /var/www/sadc/alarm


    postgres:
        image: mdillon/postgis:10
        restart: always
        environment:
            - POSTGRES_DB=${PG_DATABASE}
            - POSTGRES_USER=${PG_USERNAME}
            - POSTGRES_PASSWORD=${PG_PASSWORD}
            - PGDATESTYLE=ISO,DMY
        ports:
            - 5432:5432
        volumes:
            - sadc-alarm-pgdata:/var/lib/postgresql/data
            - ${PATH_SOURCE}:/var/www/sadc/alarm
            - ${PATH_SOURCE}/.docker/conf/postgres/initdb.sql:/docker-entrypoint-initdb.d/initdb.sql

    node:
        image: node:10.15-stretch
        tty: true
        working_dir: /var/www/sadc/alarm
        volumes:
            - ${PATH_SOURCE}:/var/www/sadc/alarm
        ports:
            - 8080:8080
$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                      NAMES
c6a394453de4        node:10.15-stretch   "node"                   2 hours ago         Up 50 seconds       0.0.0.0:8080->8080/tcp                     alarm_node_1     
5dcc8b936b58        httpd                "httpd-foreground"       21 hours ago        Up 49 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   alarm_apache_1   
bb616453d0cc        alarm_php            "/bin/sh -c '/usr/sb…"   21 hours ago        Up 49 seconds       0.0.0.0:9000->9000/tcp                     alarm_php_1      
3af75f3a3716        mdillon/postgis:10   "docker-entrypoint.s…"   28 hours ago        Up 49 seconds       0.0.0.0:5432->5432/tcp   

编辑 2

问题在于“docker-compose run”方法...

当我使用“docker exec”运行以下命令时,它可以工作

docker exec -it node_alarm_1 bash

最终编辑

好的。

所以我错过了“docker-compose run”方法。应该使用“docker-compose exec”方法,因为它重用了正确映射的正在运行的容器。 “docker-compose run” 改为运行非映射容器...

【问题讨论】:

    标签: docker docker-compose containers


    【解决方案1】:

    docker-compose run 它似乎不尊重docker-compose.yml 文件中描述的端口发布。

    要解决您的问题,请执行以下操作

    docker-compose run -p 8080:8080 node bash
    

    docker-compose run --service-ports node bash
    

    【讨论】:

    • 两者都返回“绑定 0.0.0.0:8080 失败:端口已分配”
    • 您是否已经在端口 8080 上运行了一些东西?确保停止使用端口 8080 的应用。
    • 好吧,如果您收到"Bind for 0.0.0.0:8080 failed: port is already allocated 错误,那么肯定有东西在端口 8080 上运行。尝试关闭某些东西,我提供的命令将起作用。我自己测试过,没有错误。
    • 好吧,你的一个容器显然绑定到了 8080 端口。c6a394453de4 node:10.15-stretch "node" 2 hours ago Up 50 seconds 0.0.0.0:8080->8080/tcp alarm_node_1
    • 这很正常。它应该绑定到 8080...您是否建议使用不同的端口?
    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多