首页 > 解决方案 > docker run -p 和 docker-compose.yml 中的端口有什么区别?

问题描述

我想使用一种标准的方式来运行我的 docker 容器。我一直在保留一个docker_run.sh文件,但 docker-compose.yml 看起来是一个更好的选择。在我尝试访问在容器中运行的网站之前,这似乎很有效。端口似乎没有正确设置。

使用以下内容docker_run.sh,我可以访问该网站localhost。当我使用该命令时,我希望以下docker-compose.yml文件具有相同的结果。docker-compose run web

docker_run.sh

docker build -t web .
docker run -it -v /home/<user>/git/www:/var/www -p 80:80/tcp -p 443:443/tcp -p 3316:3306/tcp web

码头工人-compose.yml

version: '3'
services:
    web:
        image: web
        build: .
        ports:
            - "80:80"
            - "443:443"
            - "3316:3306"
        volumes:
            - "../www:/var/www"

进一步的分析

docker ps端口在和中报告为相同docker-compose ps。注意:这些不是同时出现的。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                              NAMES
<id>        web      "/usr/local/scripts/…"   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:3307->3306/tcp   <name>
$ docker-compose ps
Name            Command               State                                Ports                              
---------------------------------------------------------------------------------------------------------------
web   /usr/local/scripts/start_s ...   Up      0.0.0.0:3316->3306/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

我错过了什么?

标签: dockerdocker-composedockerfile

解决方案


正如@richyen 在评论中建议的那样,你想要docker-compose up而不是docker-compose run.

docker-compose run...

针对服务运行一次性命令。

也就是说,它旨在在docker-compose.yml文件指定的整体环境中运行调试 shell 或迁移脚本之类的东西,而不是在 Dockerfile 中指定的标准命令(或 YAML 文件中的覆盖)。

对你的问题至关重要,

... docker-compose run[...] 不会创建服务配置中指定的任何端口。这可以防止端口与已经打开的端口发生冲突。如果您确实希望创建服务的端口并将其映射到主机,请指定--service-ports标志。

除此之外,docker run您显示的命令和docker-compose.yml文件应该基本上是等效的。


推荐阅读