如何运行和访问在Docker容器中运行的Web服务器

时间:2020-05-02 09:20:49

标签: docker docker-compose containers

我很难理解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”改为运行非映射容器...

1 个答案:

答案 0 :(得分:0)

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

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

docker-compose run -p 8080:8080 node bash

docker-compose run --service-ports node bash