我想使用一种标准的方式来运行docker容器。我一直在保存docker_run.sh
文件,但是docker-compose.yml看起来是一个更好的选择。在我尝试访问容器中运行的网站之前,这似乎非常有效。端口似乎设置不正确。
使用以下docker_run.sh
,我可以访问localhost
的网站。我期望以下docker-compose.yml
文件在使用docker-compose run web
命令时具有相同的结果。
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
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
我想念什么?
答案 0 :(得分:1)
正如@richyen在评论中建议的那样,您希望使用docker-compose up
而不是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
。