docker run -p和docker-compose.yml中的端口有什么区别?

时间:2019-12-20 21:39:26

标签: docker docker-compose dockerfile

我想使用一种标准的方式来运行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

docker-compose.yml

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

进一步分析

docker psdocker-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

我想念什么?

2 个答案:

答案 0 :(得分:1)

正如@richyen在评论中建议的那样,您希望使用docker-compose up而不是docker-compose run

docker-compose run ...

  

对服务运行一次命令。

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

对您的问题至关重要

  

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

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

答案 1 :(得分:0)

运行docker-compose.yamls的方式与运行在计算机上安装或创建的本地docker映像的方式不同。通常会运行命令docker-compose up -d启动docker-compose文件,以在分离模式下运行。然后,当您运行docker ps时,应该会看到它正在运行。您也可以像上面一样运行docker-compose ps