.net core docker容器编排部署(linux)
环境准备
需要一个linux操作系统:我这里用的是ubuntu 18.04,安装步骤就不说了,网上很多教程,当然也可以私信我。
既然需要用到docker,那么就安装个docker,apt install docker-ce。
root@pims_server:/# docker -v docker version 19.03.7, build 7141c199a2
查看版本,这样docker就算是成功安装好了。
加载基础镜像
为了到时候build镜像的时候快一点,我们可以先准备下基础基础镜像,我这里用的是2.2版,只要runtime即可。
root@pims_server:~# docker pull microsoft/dotnet:2.2-aspnetcore-runtime 2.2-aspnetcore-runtime: pulling from microsoft/dotnet 804555ee0376: downloading [=======================> ] 10.8mb/22.52mb 970251047358: download complete f3d4c41a4fd1: download complete bd391c46585f: downloading [==============> ] 17.73mb/62.15mb
下载完成之后,执行docker images可以查看所有镜像。
root@pims_server:~# docker images repository tag image id created size microsoft/dotnet 2.2-aspnetcore-runtime e7e3b238011c 3 months ago 261mb
新建一个.netcore应用程序
这里就不细讲了,我提前准备好了一个项目,发布之后,把publish文件夹拷贝到linux系统中,如下所示:
root@pims_server:/mnt/share/schedule_web# ll total 13794 drwxrwxrwx 1 root root 20480 mar 23 08:49 ./ drwxrwxrwx 1 root root 4096 mar 25 07:39 ../ -rwxrwxrwx 1 root root 2179584 may 28 2018 bouncycastle.crypto.dll* drwxrwxrwx 1 root root 4096 mar 23 08:49 configs/ -rwxrwxrwx 1 root root 155 mar 20 10:13 dockerfile* -rwxrwxrwx 1 root root 299008 aug 10 2018 google.protobuf.dll* -rwxrwxrwx 1 root root 221184 mar 8 2017 log4net.dll* -rwxrwxrwx 1 root root 20560 oct 11 14:28 microsoft.entityframeworkcore.abstractions.dll* -rwxrwxrwx 1 root root 1426512 oct 11 14:26 microsoft.entityframeworkcore.dll* -rwxrwxrwx 1 root root 762744 oct 11 14:24 microsoft.entityframeworkcore.relational.dll* -rwxrwxrwx 1 root root 231800 oct 11 14:28 microsoft.entityframeworkcore.sqlserver.dll* -rwxrwxrwx 1 root root 780288 dec 3 01:13 mysql.data.dll* -rwxrwxrwx 1 root root 67584 dec 3 01:13 mysql.data.entityframeworkcore.dll* -rwxrwxrwx 1 root root 693680 nov 8 16:56 newtonsoft.json.dll* -rwxrwxrwx 1 root root 263168 dec 3 07:04 oracle.entityframeworkcore.dll* -rwxrwxrwx 1 root root 4656640 dec 4 09:17 oracle.manageddataaccess.dll* -rwxrwxrwx 1 root root 256284 mar 23 08:43 pimsschedulingwebapi.deps.json* -rwxrwxrwx 1 root root 153600 mar 23 08:43 pimsschedulingwebapi.dll* -rwxrwxrwx 1 root root 58032 mar 23 08:43 pimsschedulingwebapi.pdb* -rwxrwxrwx 1 root root 224 mar 23 08:43 pimsschedulingwebapi.runtimeconfig.json* -rwxrwxrwx 1 root root 281600 mar 23 09:05 pimsschedulingwebapi.views.dll* -rwxrwxrwx 1 root root 7800 mar 23 08:43 pimsschedulingwebapi.views.pdb* -rwxrwxrwx 1 root root 176640 dec 20 01:57 remotion.linq.dll* -rwxrwxrwx 1 root root 424448 oct 16 2017 renci.sshnet.dll* drwxrwxrwx 1 root root 0 mar 23 08:49 runtimes/ drwxrwxrwx 1 root root 0 mar 23 08:49 sqlscripts/ -rwxrwxrwx 1 root root 34816 jul 14 2016 sshnet.security.cryptography.dll* -rwxrwxrwx 1 root root 380848 nov 20 2017 system.configuration.configurationmanager.dll* -rwxrwxrwx 1 root root 44080 sep 18 2018 system.diagnostics.diagnosticsource.dll* -rwxrwxrwx 1 root root 236320 dec 20 01:57 system.interactive.async.dll* -rwxrwxrwx 1 root root 51064 sep 12 2019 system.security.accesscontrol.dll* -rwxrwxrwx 1 root root 24880 jul 19 2017 system.security.cryptography.protecteddata.dll* -rwxrwxrwx 1 root root 93048 sep 12 2019 system.security.permissions.dll* -rwxrwxrwx 1 root root 33656 sep 12 2019 system.security.principal.windows.dll* -rwxrwxrwx 1 root root 118520 jun 11 2016 system.xml.xpath.xmldocument.dll* -rwxrwxrwx 1 root root 58880 dec 3 01:01 ubiety.dns.core.dll* -rwxrwxrwx 1 root root 537 mar 23 08:43 web.config* drwxrwxrwx 1 root root 0 mar 23 08:49 wwwroot/
至于如何拷贝到linux有很多种方法,有远程工具可以直接通过xftp上传,因为我是用的virtualbox虚拟机,可以直接利用共享文件夹,挂载到linux上即可。
挂载共享文件夹命令:sudo mount -t vboxsf shared /mnt/share
shared是共享文件夹名称,/mnt/share是要挂载到的目标路径。
dockerfile
我们可以看到这里面就是项目生成的dll文件,还有一个dockerfile文件,这是build镜像是要用到的。
from microsoft/dotnet:2.2-aspnetcore-runtime maintainer zhanwei copy . /app workdir /app expose 8000 entrypoint ["dotnet", "pimsschedulingwebapi.dll"]
这就是我的dockerfile,很简单microsoft/dotnet:2.2-aspnetcore-runtime是基础镜像。
copy:
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
workdir:
指定工作目录。用 workdir 指定的工作目录,会在构建镜像的每一层中都存在。(workdir 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 run 命令都是新建的一层。只有通过 workdir 创建的目录才会一直存在。
expose:
仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -p 时,会自动随机映射 expose 的端口。
entrypoint:
类似于 cmd 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 entrypoint 指令指定的程序。
优点:在执行 docker run 的时候可以指定 entrypoint 运行所需的参数。
注意:如果 dockerfile 中如果存在多个 entrypoint 指令,仅最后一个生效。
build镜像
都准备好了之后,执行docker build命令,注意最后有一个.,少了这个点是执行不成功的。
root@pims_server:/mnt/share/schedule_web# sudo docker build -t schedule_web:1.0 . sending build context to docker daemon 19.02mb step 1/6 : from microsoft/dotnet:2.2-aspnetcore-runtime ---> e7e3b238011c step 2/6 : maintainer zhanwei ---> running in a42940177b66 removing intermediate container a42940177b66 ---> b9eb0d8cd441 step 3/6 : copy . /app ---> 810d14b5a4a0 step 4/6 : workdir /app ---> running in 97360f19bf80 removing intermediate container 97360f19bf80 ---> 092ed5dc0364 step 5/6 : expose 8000 ---> running in 46593eb29da3 removing intermediate container 46593eb29da3 ---> 397cf3432ae2 step 6/6 : entrypoint ["dotnet", "pimsschedulingwebapi.dll"] ---> running in add035b834d4 removing intermediate container add035b834d4 ---> 40b10808fc7c successfully built 40b10808fc7c successfully tagged schedule_web:1.0 root@pims_server:/mnt/share/schedule_web#
好的,成功了,现在查看一下images,可以看到刚刚构建的镜像了
root@pims_server:/mnt/share/schedule_web# docker images repository tag image id created size schedule_web 1.0 40b10808fc7c 25 seconds ago 279mb microsoft/dotnet 2.2-aspnetcore-runtime e7e3b238011c 3 months ago 261mb
创建容器并启动容器,-p映射端口,5000是容器内部端口,8000是本机对外开放端口。
root@pims_server:docker run -it -p 8000:5000 schedule_web:1.0
容器编排docker-compose
当我们有多个服务要部署时,可以用容器编排,可以同时启动多个容器。
比如现在有一个后台定时服务、一个前端服务。那么为了方便我只有通过compose up命令就可以了。
root@pims_server:/# docker images repository tag image id created size schedule_server 1.0 163b44854f0d about a minute ago 279mb schedule_web 1.0 40b10808fc7c 4 minutes ago 279mb microsoft/dotnet 2.2-aspnetcore-runtime e7e3b238011c 3 months ago 261mb
查看docker-compose版本,顺便检查下服务器是否安装。
root@pims_server:/home/zhanwei# docker-compose --version docker-compose version 1.23.2, build unknown root@pims_server:/home/zhanwei#
docker-compose.yml文件
version: '3' services: #启动注册中心eureka-server集群 集中管理/服务注册/服务发现 schedule_web: container_name: schedule_web image: schedule_web:1.0 ports: - "8000:5000" environment: appid: testid appsecret: testsecret baseurl: http://192.168.12.48:8080/api/openapi/orgs/v1/ db_server: 10.30.52.20 db_port: 3306 db_type: mysql db_user: root db_pwd: 123456 db_name: schedule_8000 schedule_server: container_name: schedule_server image: schedule_server:1.0 environment: db_server: 127.0.0.1 db_port: 3306 db_type: mysql db_user: root db_pwd: 123456 db_name: schedule_8000
执行命令docker-compose up -d,我们看下结果:
root@pims_server:/home/zhanwei# docker-compose up -d creating schedule_web ... done creating schedule_server ... done root@pims_server:/home/zhanwei#
已经启动完成了。。。
docker-compose命令解析:
up:
启动所有在compose问中定义的容器,并且把它们的日志信息汇集在一起。通常会添加-d参数(在up后面),让容器在后台执行
start:启动指定的已经存在的容器。
build:重新建造由dockerfile构建的镜像。
ps:获取由compose管理的容器的状态信息。
run:启动一个容器,并允许一个一次性的命令。被连接的容器会同时启动,除非用了 --no-deps参数。
logs:汇集由compose管理的容器的日志,并以彩色输出。
stop:停止容器,但不会删除它们。
rm:删除已停止的容器。不要忘记使用-v参数来删除任何由docker管理的数据卷。
查看一下容器
root@pims_server:/# docker ps container id image command created status ports names 77677298c7f9 schedule_server:1.0 "dotnet pimsscheduli…" 25 minutes ago up 25 minutes schedule_server bc5502237d9e schedule_web:1.0 "dotnet pimsscheduli…" 25 minutes ago up 25 minutes 8000/tcp, 0.0.0.0:8001->5000/tcp schedule_web
推荐阅读
-
Linux服务器部署.Net Core笔记:目录
-
Linux下自动化部署ASP.NET CORE 3.1(Docker+Jenkins+Nginx)
-
[笔记]使用Docker部署.NET Core应用程序
-
.NET Core跨平台部署于Docker(Centos)- 视频教程
-
linux部署.net core api并且实现上传图片
-
So Easy - 在Linux服务器上部署 .NET Core App
-
Linux服务器部署.Net Core笔记:一、开启ssh服务
-
.Net Core 在Linux服务器下部署程序--(2). 部署前需要安装的软件及SDK
-
.Net Core 在Linux服务器下部署程序--(1). Windows 连接 Linux服务器
-
Linux环境基于CentOS7 搭建部署Docker容器