VS2017 OOB Docker支持:命令行运行容器及访问问题求助
让我逐个拆解你遇到的问题,给出具体的解决方案:
1. 如何通过命令行使用docker-compose up访问网站?正确步骤及URL是什么?
你的核心问题是**docker-compose.yml里的st.web服务没有配置端口映射**,导致主机无法访问容器内的80端口。
正确步骤:
- 编辑你的
docker-compose.yml,给st.web服务添加端口映射配置:services: mssql: # 原有的mssql配置保持不变 image: microsoft/mssql-server-linux:2017-latest container_name: sql1 ports: - 1433:1433 environment: SA_PASSWORD: "password" ACCEPT_EULA: "Y" MSSQL_PID: Developer st.web: image: myrepo/stweb:1.0.0.1 build: context: . dockerfile: ST.Web/Dockerfile # 新增端口映射,把容器的80端口映射到主机的80端口 ports: - "80:80" - 清理之前运行的容器(避免端口冲突或缓存问题):
docker-compose down - 启动服务(如果需要重新构建镜像,加上
--build参数):docker-compose up --build - 访问网站:直接在浏览器打开
http://localhost即可,因为我们已经把容器的80端口映射到了主机的80端口。
2. 如何通过命令行运行容器(含docker run及docker-compose方式)?
Docker Compose方式
就是上面步骤1-3的操作,重点是先补全docker-compose.yml的端口映射,然后用docker-compose up启动,停止服务用docker-compose down即可。
Docker Run方式
需要确保你已经有构建好的myrepo/stweb:1.0.0.1镜像,然后执行正确格式的命令:
# 后台运行容器,映射80端口到主机 docker run -d -p 80:80 myrepo/stweb:1.0.0.1 # 如果需要交互式查看容器日志,可以用-it代替-d docker run -it -p 80:80 myrepo/stweb:1.0.0.1
运行后同样访问http://localhost即可。
3. 如何解决“-p短开关未定义”的错误?
这个错误是因为你把-p参数放错了位置!docker run的参数顺序是:Docker的命令参数在前,镜像名在后,镜像名后面的内容会被当成容器内部的启动命令参数。
你之前的命令是:
docker run -it myrepo/stweb:1.0.0.1 -p 80:80
这里-p 80:80被当成了给dotnet ST.Web.dll的参数,自然会报错。
正确的命令应该把-p放在镜像名前面:
docker run -it -p 80:80 myrepo/stweb:1.0.0.1
4. Dockerfile的正确位置是解决方案目录还是项目目录?
保留Dockerfile在项目目录(比如ST.Web/下)是正确的,这符合Visual Studio的默认配置,不会破坏VS的自动构建流程。
如果需要手动用docker build构建镜像,你不需要移动Dockerfile,只需要在解决方案目录下执行命令时,用-f参数指定Dockerfile的路径,同时把当前目录作为构建上下文:
# 在解决方案目录执行 docker build -t myrepo/stweb:1.0.0.1 -f ST.Web/Dockerfile .
这里的.表示构建上下文是当前解决方案目录,-f指定Dockerfile的位置,这样Docker就能正确找到SupportTicket.sln和各个项目文件了。
5. Release构建为何生成额外无名镜像?
这是Docker多阶段构建的正常现象!你的Dockerfile包含了base、build、publish、final四个构建阶段,每个阶段都会生成一个临时的中间镜像,用来为后续阶段提供文件。这些中间镜像没有被打tag,所以显示为“无名称”。
这些镜像属于构建缓存,当你不需要它们时,可以用以下命令清理:
# 清理所有无用的镜像(包括中间镜像、未使用的镜像) docker image prune -f
内容的提问来源于stack exchange,提问作者Banoona

