Linux下将.Asp Core 部署到 Docker容器中

我们来部署一个简单的例子:

  将一个简单的.Aps Core项目部署到Docker容器中并被外网访问

说明:

  1. 下面的步骤都是建立在宿主服务器系统已经安装配置过Docker容器,安装Docker相对比较简单我们这里,网上有很多资料,我们这里跳过
  2. 开发环境:VS2017
  3. 部署服务器系统:Linux

1):新建项目

新建一个.Aps Core项目,选择Web应用程序,勾选启用Docker支持,勾选Docker支持后VS会自动给我们生成一个Dockerfile文件

2)编写Dockerfile脚本

我们会看到Dockerfile文件文件有如下内容,首先你要知道Dockerfile是什么:Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。简单来说Dockerfile脚本就好比我们处理数据用到的SQL脚本一样,只不过Dockerfile不是用来处理数据的,而是把程序的部署和环境配置等操作写成了命令脚本,方便到时发布线上的时候直接执行,从而极大的降低了部署难度和部署时间

上面的代码看起来有点复杂,好多都用不到,也不利于初学者理解,我们自己重写一下这个文件,代码只有简单六句,但注释比较多,如下:

#FROM :Dockerfile 中的 FROM 指令用于指定要构建的镜像的基础镜像,此处是apscore 2.2运行时为基础镜像。它通常是 Dockerfile 中的第一条指令。
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
#WORKDIR:该WORKDIR指令为Dockerfile中的任何RUN,CMD,ENTRYPOINT,COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它未在任何后续Dockerfile指令中使用,也将创建它。
#/app是工作目录的任意选择。你可以使用你喜欢的任何东西(foo,bar或baz),但app它很好,因为它是自我描述和常用的。
WORKDIR /app
#COPY :指令用于将文件作为一个新的层添加到镜像中。通常使用 COPY 指令将应用代码赋值到镜像中。
#此处的.点代表 WORKDIR /app 目录,将本地应用拷贝到 容器 /app/ 目录下 "./"代表的就是/app 因为dockerfile文件和程序文件都在发布文件夹下 所以两个目录是一样的
COPY . .
#指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
#在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
#另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。
#-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问
#切记:EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
EXPOSE 8082
#设置环境变量,修改.netCore 默认的80端口(此处只是为了演示.netCore项目更改如何在docker容器中使用其他端口,你也可以去掉这句代码默认用80端口),此处改为8082端口
ENV ASPNETCORE_URLS http://+:8082
#指定应用入口点 DockerTest.dll代表的是主程序文件
ENTRYPOINT ["dotnet", "DockerTest.dll"]

 此外我们检查一下我们的Dockerfile是否在发布时复制到输出目录,如果是不复制则不会进入打包文件

3):构建Docker镜像

我们将我们新建的项目打包

远程连接到linux服务器,然后用MobaXterm将打包后的项目复制到linux服务器中去,我此处放在/root/dockerdome/文件下

我们先用cd 命令定位到当前文件夹下:

然后创建镜像,命令如下,mydockerdome为我们自定义的镜像名称

docker build -t mydockerdome . (注意不要漏掉命令中的最后一个点,代表命令执行在当前目录)

或者也可以用如下命令:

docker build 发布文件目录 -t mydockerdome

完成后如下图,我们可以看到脚本执行的每一个步骤:

我们可以通过docker image ls来查看定制好的镜像

然后我们运行RUN命令启动容器:

docker run --name=mydockerdome -p 8082:8082 -d mydockerdome

命令解释:

  1. --name:指定容器名称为mydockerdome
  2. -p:指定容器端口,上面左边的8082代表宿主机的端口,右边代码容器的8082端口,即将容器的8082端口随机映射到宿主机8082的一个端口上
  3. -d:指定容器 后台运行,如果不指定此命令,当前终端关闭或者被占用程序则会退出

对应此命令的所有扩展:

  • -a stdin:指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -p:端口映射,格式为:主机(宿主)端口:容器端口
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb":为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com:指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie"::设置环境变量;
  • --env-file=[]:从指定文件读入环境变量;
  • --cpuset="0-2" or --cpuset="0,1,2":绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • --net="bridge":指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]:开放一个端口或一组端口;

 运行成功后我们浏览器输入服务器IP:端口号,可以成功访问

4):总结与扩展

简单总结一下有几点需要注意的地方

1:.Asp Core项目环境默认使用的是80端口,即上面Dockerfile文件中的ENV ASPNETCORE_URLS命令可以用来修改为其他端口,好多非Asp Core项目Docker相关部署的资料文档没有提到这一点,如果我们不用这个命令那么容器只能用默认的80端口映射宿主主机的任意端口,用其他端口会导致外网无法访问,且如果两个容器,两个容器不能同时映射同一个宿主主机端口;

2:如果项目部署到Docker容器中外网无法访问,先检查宿主服务端口防火墙是否可以通过,安全组配置有没有问题,其次检查容器映射时候正确,容器是否指定默认端口。

3:我们在使用Docker的时候经常会创建,移除镜像或者容器等等操作,每次输入命令很繁琐,我们可以用工具来管理容器和镜像,比如:Portainer 安装配置教程网上有很多,具体效果如下

4:docker常用命令

# 列出本机的所有 image 文件。
docker image ls

# 删除 image 文件
docker image rm [imageName]

# 从仓库拉取镜像
docker image pull library/hello-world

#删除一个imageid的镜像
docker rmi [image_id]    

#删除所有镜像
docker rmi $(docker images -q)    

#查看所有容器运行状态
docker ps -a    

#删除一个containerid的容器(实例)
docker rm [container_id]

#删除所有容器
docker rm $(docker ps -a -q)   

# 列出本机正在运行的容器
docker container ls

# 列出本机所有容器,包括终止运行的容器
docker container ls --all

#启动已经生成、已经停止运行的容器文件。
docker container start [containerID]

#用来查看 docker 容器的输出
docker container logs [containerID]

5:参考相关资料

Docker官方文档

https://docs.docker.com/

Docker入门教程

http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

Docker基础详细教程

https://yeasy.gitbooks.io/docker_practice/

Docker端口映射

https://www.jianshu.com/p/b92d4b845ed6

Docker核心技术与实现原理

https://draveness.me/docker

 

posted @ 2019-07-25 13:43  骇客HK  阅读(679)  评论(0编辑  收藏  举报