把Web Api OData移植到Asp.Net Core(3)-docker部署网站

1. 在CentOS安装docker

在CentOS安装docker的方法有2大类,各种博客和官网都是这么说的。
参考docker官网:
https://docs.docker.com/engine/installation/linux/docker-ce/centos/

我选择简单的方法Install from a package。
首先到docker官网下载最新版本的安装包。这是CentOS系统的docker安装包地址:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
目前最新版本地址:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
下完之后,改文件名为docker.rpm,便于后续操作。

安装docker
用SSH工具,把docker.rpm拖到CentOS系统home。输入以下命令:

sudo yum -y install /home/docker.rpm
sudo systemctl start docker
sudo systemctl enable docker

设置国内镜像仓库
在国内访问Docker官网经常失联,就算能够暂时连上,也基本上无法下载镜像,速度极慢,想用docker就必须采用国内镜像仓库,有阿里云、网易云等多家选择,但是强烈推荐docker的中国官网。

新建daemon.json文件。
{
“registry-mirrors”: [“https://registry.docker-cn.com“]
}

用SSH工具,把daemon.json拖到CentOS的/etc/docker。然后重启docker服务。

service docker restart

2. 修改网站代码

指定ODataWeb网站侦听5000端口。

public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                //必须指定端口,否则在Win10命令行运行端口是5000,在CentOS docker运行端口是80
                .UseUrls("http://*:5000")
                .UseStartup<Startup>()
                .Build();

给ODataWeb项目增加一个Dockerfile文本文件:

FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY . /app
EXPOSE 5000
ENTRYPOINT ["dotnet", " ODataWeb.dll"]

这个Dockerfile意思是,以microsoft/aspnetcore:2.0镜像为基础新建镜像,容器内部的工作目录是/app,创建镜像的时候把当前目录下全部文件和目录复制到容器的工作目录/app,容器对外暴露端口5000,运行的命令是dotnet,参数是ODataWeb.dll。
把Dockerfile文件属性更改为【如果较新则复制】,生成操作为【内容】,确保在发布项目的时候,该文件会添加到目标文件夹。
这里写图片描述

把OData网站项目以文件夹的方式发布到odataweb目录.
这里写图片描述

3. 在CentOS创建镜像,测试镜像

用SSH工具,把odataweb目录拖到CentOS系统home下面,进入CentOS的/home/odataweb文件夹,输入以下命令(注意最后有一个小数点):

docker build -t odataweb .

在CentOS系统中创建了一个名为odataweb的镜像。

[root@localhost odataweb]# docker build -t odataweb .
Sending build context to Docker daemon 3.307MB
Step 1/5 : FROM microsoft/aspnetcore:2.0
2.0: Pulling from microsoft/aspnetcore
723254a2c089: Pull complete
1de4fb717233: Pull complete
b0bf5cc53a2c: Pull complete
44c8d82f9a55: Pull complete
db3c34e82532: Pull complete
Digest: sha256:e6878b3a903f373d3be33b22c4088d7b4db7380b008965ad18abcaa33e7682a6
Status: Downloaded newer image for microsoft/aspnetcore:2.0
—> 3ba36433360d
Step 2/5 : WORKDIR /app
—> 3e1f4e435ea4
Removing intermediate container 2cff14cf8ede
Step 3/5 : COPY . /app
—> adbe48e11c88
Step 4/5 : EXPOSE 5000
—> Running in b9b57e2a9916
—> df0582bbffc3
Removing intermediate container b9b57e2a9916
Step 5/5 : ENTRYPOINT dotnet ODataWeb.dll
—> Running in 85f3b8a4c947
—> 9d5981c28feb
Removing intermediate container 85f3b8a4c947
Successfully built 9d5981c28feb
Successfully tagged odataweb:latest

然后以守护式容器运行镜像,容器命名为odataweb,-p表示映射外网端口到容器内部网站端口,如果没有-p,那么将无法从外网访问虚拟机容器里的网站,always表示总是运行:

docker run --name odataweb -p 5000:5000 --restart=always odataweb

网站跑起来了:

[root@localhost odataweb]# docker run –name odataweb -p 5000:5000 –restart=always odataweb
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {7e31dc23-c5ea-4a98-bf4d-da31c7bc0671} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:5000
Application started. Press Ctrl+C to shut down.

在Windows系统,访问虚拟机的网站,例如:http://192.168.80.134:5000/odata/Books,检查结果。注意,用IE浏览器、360浏览器可以访问,用Edge浏览器不行,不知为何。

可以重启CentOS虚拟机,再次访问网站,确认网站已经开机自动运行。
测试结束后,可以停止容器,然后才能删除容器:

docker stop odataweb
docker rm odataweb

删除容器后,才可以删除镜像

docker rmi odataweb

可以用docker images命令查看odataweb镜像是否已经删除。

docker images

如果修改了源代码,需要删除镜像,再次创建镜像并测试。这些工作如果能够在Win10开发环境里执行,会方便很多。Docker for windows就可以实现这个目的。但是docker for windows要打开Hype-V,跟VMWare有冲突,只好麻烦一点了。

为了减少网络下载的时间,可以在下载过microsoft/dotnet镜像的系统里用以下命令导出文件:

docker save -o aspnetcore20.tar microsoft/aspnetcore:2.0

然后用SSH工具把aspnetcore20.tar拖到Windows主机备份,如果恢复了虚拟机快照,重新装docker环境,可以把aspnetcore20.tar从Windows主机拖到Linux主机,然后导入镜像:

docker load < aspnetcore20.tar

再次创建容器的时候,就会使用本地的镜像去构建了。

4. Nginx反向代理

对于轻型应用的网站,加一个Nginx反向代理就足够了。
如果单独创建odataweb和nginx两个容器,一起运行,是可以实现目标的,但是nginx要指定odataweb的容器IP,比较麻烦。docker提供了让一个宿主机里的多个容器联合运行的简化解决方案:docker-compose。
Docker-compose需要额外的安装步骤,在已经安装了docker,配置了国内镜像的CentOS系统中输入以下命令安装Docker-compose:

yum -y install epel-release
yum -y install python-pip
pip install docker-compose

编写docker-compose.yml文件

version: '3'

services:
  odataweb-service:
    container_name: odatawebservice
    image: odatawebimage
    build:
      context: ./odataweb
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    restart: always

  nginx-proxy:
    container_name: nginxproxy
    image: nginx    
    ports:
      - "9000:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    restart: always
    links:
      - odataweb-service

这个文件的意思是,创建2个容器。
第一个容器名称是odatawebservice,镜像名称是odatawebimage,如果没有则创建镜像,创建镜像的文件在当前目录的odataweb子目录下面,dockerfile的名字是Dockerfile。设置运行环境变量ASPNETCORE_ENVIRONMENT=Development。restart: always表示如果网站挂掉了则自动重启。
第二个容器的名称是nginxproxy,镜像名称是nginx,nginx是一个标准镜像,如果没有会自动从网上的镜像仓库中拉取,该容器把外网端口9000映射到容器内部端口80,容器启动的时候把当前目录的nginx.conf挂载为容器内部的/etc/nginx/conf.d/default.conf文件,作为nginx容器的配置文件,该容器与odataweb-service联合运行。

编写nginx.conf配置文件

server {
  listen 80;

  location / {
    proxy_pass http:// odataweb-service:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

它把80端口映射到odataweb-service的5000端口,odataweb-service就是在docker-compose.yml定义的名称。

把ODataWeb项目发布目录odataweb、docker-compose.yml、nginx.conf放在一个testodata目录下。用SSH工具,把testodata拖到CentOS系统的/home。
这里写图片描述

在CentOS系统进入/home/testodata,输入命令:

docker-compose up

docker自动去公共仓库拉去nginx镜像,然后两个容器都运行起来了:

[root@localhost testodata]# docker-compose up
Pulling nginx-proxy (nginx:latest)…
latest: Pulling from library/nginx
e7bb522d92ff: Pull complete
6edc05228666: Pull complete
cd866a17e81f: Pull complete
Digest: sha256:cf8d5726fc897486a4f628d3b93483e3f391a76ea4897de0500ef1f9abcd69a1
Creating odatawebservice … done
Creating nginxproxy … done
Creating nginxproxy …
Attaching to odatawebservice, nginxproxy
odatawebservice | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
odatawebservice | No XML encryptor configured. Key {a2767ede-82ba-4879-a7ef-b8dfb9ead2d0} may be persisted to storage in unencrypted form.
odatawebservice | Hosting environment: Development
odatawebservice | Content root path: /app
odatawebservice | Now listening on: http://[::]:5000
odatawebservice | Application started. Press Ctrl+C to shut down.

在Windows系统,访问虚拟机的网站,例如:http://192.168.80.134:9000/odata/Books,检查结果。注意,现在访问网站的端口是9000,这是nginx对外网发布的端口。
新开一个SSH工具命令行窗口 输入docker ps,可以看到2个容器都在运行。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e06ccebf062 nginx “nginx -g ‘daemon …” 2 minutes ago Up 2 minutes 0.0.0.0:9000->80/tcp nginxproxy
08130b4a7c39 odatawebimage “dotnet ODataWeb.dll” 2 minutes ago Up 2 minutes 5000/tcp odatawebservice

输入docker-compose down可以停止2个容器,并删除对应的网桥。
[root@localhost testodata]# docker-compose down
Removing nginxproxy … done
Removing odatawebservice … done
Removing network testodata_default

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值