使用Docker,很多坑(之一):在windows中使用
最近在学习.net core,必不可少的需要学习docker,在此记录一下,做一下知识积累。
前提:windows环境,vs2019
目标:生成本地docker image,并上传到远程respository。从远程respository下拉取镜像并在本地部署运行
-
下载docker for windows并安装。
-
Docker网站上注册用户。
-
打开docker desktop,一定要记得切换docker 为windows,并做好登陆(这时如果登录了,docker login时会调用这里)
-
打开vs2019,新建asp.net core项目,版本2.2(Mark一下,3.1的版本总有问题,这里先用2.2)
-
项目文件上右键菜单,添加docker file for windows
-
Docker file内容如下,并修改其属性:
(a)From 基础依赖镜像
--#基于 microsoft/aspnetcore:2.0
来构建我们的镜像
FROM microsoft/aspnetcore:2.0
(b)Copy
--#拷贝项目publish文件夹中的所有文件到 docker容器中的publish文件夹中
COPY . /publish
(c)WORKDIR设置工作路径
--#设置工作目录为 /publish
文件夹,即容器启动默认的文件夹
WORKDIR /publish
(d)对外开放的端口
--#设置Docker容器对外暴露5000端口
EXPOSE 5000
(e)ENTRYPOINT 运行donet命令,参数是程序集的名字,不含路径
--#使用dotnet CoreMvc.dll
来运行应用程序
ENTRYPOINT ["dotnet", "CoreMvc.dll"]
-
随便在页面上修改内容,运行项目。
-
publish项目到本地。
-
打开控制台程序,进入到publish的文件夹,生成imange, 名为dockerimagetest, 命令为"docker build -t dockerimagetest ." Note:最后面有个英文的点。注意,如果这个image文件想上传到仓库里,名称前应该加上docker的用户名/, 如abc/dockerimagetest
-
上面的步骤表示镜像已经生成成功了,现在用一个容器来装载这个image来看看。命令"docker run --name=容器名称 -p 宿主端口:容器端口-d 镜像名称",容器名称为dockercontainertest,镜像名称为dockerimagetest,-d为后台运行并返回容器id,-p: 指定端口映射,格式为:主机(宿主)端口:容器端口,整个命令为"docker run --name=dockercontainertest -p 7788:80 -d dockerimagetest",执行完后打开网页,通过7788端口可以访问了:
-
上面的步骤生成了一个image并在本地运行了,下面我们要做的是把image push和pull回来。先把这个image上传。输入docker login,我这里docker for desktop已经登录了,所以它自己会检测,不用再填写用户名和密码了。
-
执行docker push dockerimagetest,出错,原来在推送之前要把镜像按
/ 格式来命名。那如何重命名呢,我们用打标签的方式重命名。先查看所有的image,打标签语句:docker tag 旧名 dockerhub用户名/新名字,打完标签后再push,已经在上传了。
-
通过上图可以看到镜像已经上传了。下面试着把image pull下来并运行吧。此处应该找一个新机器,我这里资源有限,还是用原来的机器,先把所有的container和image清除干净。清理干净后,访问http://localhost:7788/,已经无法访问了。同时把本地publish文件夹内文件清空(模拟新的机器)
-
执行docker pull friendwang1001/dockerimagetest:latest
-
镜像已经下载下来了。重复第10步,装载镜像,镜像名稍有变化,docker run --name=dockercontainertest -p 7788:80 -d dockerimagetest,再次访问7788端口,网站加载上了,Yeah!