.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

下载完成之后,执行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 ../
drwxrwxrwx 1 root root    4096 Mar 23 08:49 Configs/
-rwxrwxrwx 1 root root     155 Mar 20 10:13 Dockerfile*
-rwxrwxrwx 1 root root  153600 Mar 23 08:43 WebApi.dll*
-rwxrwxrwx 1 root root   58032 Mar 23 08:43 WebApi.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     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", "WebApi.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", "WebApi.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://127.0.0.1:8080/api/openapi/orgs/v1/
      db_server: 127.0.0.1
      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

转载请注明出处,另外请关注我哦!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容