docker - 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
我错过了什么?
解决方案
正如@richyen 在评论中建议的那样,你想要docker-compose up
而不是docker-compose run
.
针对服务运行一次性命令。
也就是说,它旨在在docker-compose.yml
文件指定的整体环境中运行调试 shell 或迁移脚本之类的东西,而不是在 Dockerfile 中指定的标准命令(或 YAML 文件中的覆盖)。
对你的问题至关重要,
...
docker-compose run
[...] 不会创建服务配置中指定的任何端口。这可以防止端口与已经打开的端口发生冲突。如果您确实希望创建服务的端口并将其映射到主机,请指定--service-ports
标志。
除此之外,docker run
您显示的命令和docker-compose.yml
文件应该基本上是等效的。
推荐阅读
- java - 我写什么来代替“scanner.skip()”语句?
- javascript - 我如何为 React 和 Redux 操作数据
- python - Python海龟图形反复“越界”
- c# - RaisePropertyChanged 在不同的属性上触发“设置”
- java - Apache Bean Utils - 将属性复制到没有设置器的类
- java - 如何在没有spring的javax验证ConstraintValidator中注入bean
- android-source - ninja, kati in aosp - 如何在执行“mm”或“mmm”或“mmma”时打印所有已执行的命令
- html - 如何将两列相对于彼此垂直居中?
- android - SQLite SELECT MAX() 查询返回 null 到游标?
- javascript - 如何在 Vue.js 上的组件之间传递事件信息