澳门游戏平台大全 澳门十大电子游戏平台 容器部署的方法_AngularJS_脚本之家,Core容器化之多容器应用部署

容器部署的方法_AngularJS_脚本之家,Core容器化之多容器应用部署



若你域名绑定了该主机,则可以直接访问。至此,已经是 Angular
容器化后所有内容,下面是关于 Nginx 反向代理 Docker
应用的部分,若你已经这么做,那直接忽略下一章节。

圣杰
已关注

Let’s Sencrypt 不久前发布支持泛域,因此这一次也是申请了 *.ng-alain.com
泛域证书。

1.引言

紧接上篇.NET
Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET
Core应用的反向代理,然后再介绍多容器应用的部署问题。

同时把 Angular 项目的 _nginx/default.conf 作为 Nginx
的配置文件,在项目里包括 Nginx 配置,像使用HTML5路由策略时需要处理 404
问题、GZip等。

 

之前在安装 Nginx 时我们就已经启动了,那么,我们只需要对
/etc/nginx/nginx.conf 编写一些 Nginx 配置即可。

 

澳门十大电子游戏平台,当然,上述在 Nginx 配置采用的是一个 80 端口,因此可以直接使用:

转自:

最后,利用 –installcert 来提取 Nginx 所需要的证书文件。

4. 反向代理.NET Core MVC

以下我会阐述 ng-alain 整个过程,其中包括 Docker、Nginx、Let’s Sencrypt
证书等范涛,我无法保证新手可以很好的阅读她,不过你可以通过一些文章关键字在搜索引擎获得更多资料。

2017.12.24
17:21* 字数 1644 阅读 88评论
0喜欢 4

service nginx force-reload

3. Hello Nginx

同样我们还是基于Docker来试玩一下Nginx。

//拉取Nginx镜像
$ docker pull nginx
//启动Nginx容器
$ docker run -d -p 8080:80 --name hellonginx nginx

上面我们以后台运行的方式启动了一个命名为hellonginx的nginx容器,其端口映射到宿主机的8080端口,我们现在可以通过浏览器直接访问http://<ip address>:8080即可看到nginx的欢迎界面。

 

Hello Nginx

 

至此,一个Nginx容器就启动完毕了。那如何进行反向代理呢?别急,我们一步一步来。

安装 acem.sh:

5.1. 安装Docker Compose

依次执行以下命令:

$ sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.18.0, build 1719ceb

一般而言会把 Angular 构建也在一个容器内完成,在 Angular 项目根目录下创建
Dockerfile.compile 文件:

4.2. 配置反向代理

下面我们就来配置Nginx来反向代理我们刚启动的Web容器。
要想Nginx成功代理指定的容器内运行的Web网站,首先我们得知道容器对应的IPAddress。使用docker inspect <container id/name>即可查到。

//查看正在运行的容器列表
$ docker ps 
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                            NAMES
d046b7b878a0        hellodocker.web                "dotnet run"             5 seconds ago       Up 3 seconds        0.0.0.0:5000->5000/tcp           hellodocker.web.nginx

//使用`|`管道操作符加上`grep`过滤操作符可以直接提取我们要查找的关键字
$ docker inspect hellodocker.web.nginx | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "192.168.0.5",
                    "IPAddress": "192.168.0.5",

从上面可以看到我的Web容器运行在宿主机的192.168.0.5:5000。下面我们配置Nginx转发请求到192.168.0.5:5000即可完成反向代理。

Nginx配置反向代理的配置文件路径为:/etc/nginx/conf.d/default.conf。
我们可以通过本地创建一个配置文件挂载到Nginx的容器内部进行反向代理配置。

$ cd demo
$ mkdir nginx
//创建my_nginx.conf文件
$ touch my_nginx.conf
$ vi my_nginx.conf
server {
  listen 80;

  location / {
    proxy_pass http://192.168.0.5:5000;
  }
}

上面我们通过指定listen配置nginx去监听80端口,指定proxy_pass为我们Web容器的IP和端口完成反向代理文件的配置。

接下来就是启动一个新的Nginx容器并通过挂载的方式将配置文件共享到容器内部。

$ docker run -d -p 8080:80 
> -v $HOME/demo/nginx/my_nginx.conf:/etc/nginx/conf.d/default.conf 
> nginx
95381aa56a336f65b6d01ff9964ae3364f37d25e5080673347c1878b3a5bb514
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint elated_mccarthy (5a576d5991dd164db69b1c568c94c15e47ec7c67e43a3dd6982a2e9b83b60e08): Bind for 0.0.0.0:8080 failed: port is already allocated.

我们发现容器启动失败,原因是8080端口被我们刚刚第一次启动的nginx容器占用了。怎么办?两个方法:第一种就是将刚才创建的nginx容器干掉;第二种就是映射到新的端口。这里选择第一种。

$ docker ps
1bd630b60019        nginx                          "nginx -g 'daemon off"   59 minutes ago      Up 59 minutes       0.0.0.0:8080->80/tcp             hellonginx
//使用docker rm <container id>删除容器,指定-f进行强制删除
$ docker rm 1bd630b60019 -f
//重新启动Nginx容器
$ docker run -d -p 8080:80 
> -v $HOME/demo/nginx/my_nginx.conf:/etc/nginx/conf.d/default.conf 
> nginx
793d4c62ec8ac4658d75ea0ab4273a0b1f0a9a68f9708d2f85929872888b121d

启动成功后,我们再在浏览器中访问http://<ipaddress>:8080,发现返回的不再是Nginx的默认欢迎页,而是我们启动的Web容器中运行的MVC的首页,说明反向代理配置成功!

 

 

# 运行编译 Angular 镜像docker run --name ng-app-build ng-app-build# 将 `dist` 复制到项目根目录下docker cp ng-app-build:/usr/src/app/dist ./dist/# 删除编译 Angular 镜像实例docker rm -f ng-app-build

澳门十大电子游戏平台 1

因此,从编译 Angular 镜像提取 dist:

6. 最后

经过以上的练习,我们对Nginx有了一定的了解,且知道如何进行配置。同时了解了如何借助docker-compose打包运行需要多容器的复杂应用。

本篇就先讲到这里,下一篇我们介绍如何在Linux上玩耍MySql并打通Nginx+Web+MySql的容器化部署。

学习笔记

© 著作权归作者所有

举报文章

sudo yum install epel-releasesudo yum install nginx# 启动Nginxsudo systemctl start nginx

2. Why Need Nginx

.NET Core中默认的Web Server为Kestrel。

Kestrel is great for serving dynamic content from ASP.NET, however the
web serving parts aren’t as feature rich as full-featured servers like
IIS, Apache or Nginx. A reverse proxy-server can allow you to offload
work like serving static content, caching requests, compressing
requests, and SSL termination from the HTTP server.

Kestrel可以很好的用来为ASP.NET提供动态内容,然而在Web服务方面没有IIS、Apache、Nginx这些全功能的服务器完善。我们可以借助一个反向代理服务器接收来自互联网的HTTP请求并在经过一些初步处理(比如请求的缓存和压缩、提供静态内容、SSL
Termination)后将其转发给Kestrel。

 

澳门十大电子游戏平台 2

 

 

澳门十大电子游戏平台 3

 

借助反向代理服务器(本文使用Nginx),不仅可以给我们的Web网站提供了一个可选的附加层配置和防御,而且可以简化负载均衡和SSL设置。而更重要的是,反向代理服务器可以很好的与现有的基础设施进行整合。

配置文件保持后,你可以先执行 nginx -t 来校验配置文件是否正确。

澳门十大电子游戏平台 4

FROM node:8LABEL authors="cipchk "WORKDIR /usr/src/appCOPY package.json package.jsonRUN npm config set registry https://registry.npm.taobao.org  && npm iCOPY . .RUN ng build --prod

5. Docker Compose让一切更简单

上面的步骤虽然简单,但要分两步进行:第一个就是我们的Web和Nginx要分两次部署,第二个就是我们必须知道Web容器的IP和端口号,以完成反向代理文件的配置。

对于需要多个容器(比如需要Nginx、SqlServer、Redis、RabbitMQ等)协调运行的复杂应用中,使用以上方式进行部署时,很显然会很麻烦,而且还要为各个容器之间的网络连接而苦恼。
还好,Docker体贴的为我们想到了这一点。借助Compose模块,我们可以编写一个docker-compose.yml文件,使用声明性语法启动一系列相互连接的容器,即可一步完成上面的任务。

Docker
Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。

export Ali_Key="aaaaaaaaaaa"export Ali_Secret="xxxxxxxxxxxxxxxx"acme.sh --issue --dns dns_ali -d ng-alain.com -d *.ng-alain.com

4.1. 启动Web容器

还记得我们上一篇本地打包MVC项目创建的hellodocker.web的镜像吗?这里我们再启动该镜像创建一个容器:

//启动一个helodocker.web的镜像并命名容器为hellodocker.web.nginx
#  docker run -d -p 5000:5000 --name hellodocker.web.nginx hellodocker.web
160166b3556358502a366d1002567972e242f0c8be3a751da0a525f86c124933
//尝试访问刚刚运行的容器
[root@iZ288a3qazlZ ~]# curl -I http://localhost:5000
HTTP/1.1 200 OK
Date: Sun, 24 Dec 2017 02:48:16 GMT
Content-Type: text/html; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked

OK,我们开放了宿主机的5000端口用来映射我们启动的MVC容器。

docker rmi -f ng-app-build

5.2. 编写第一个docker-compose.yml

dockers-compose.yml文件要定义在我们项目的文件夹下,我们的项目文件夹位于$HOME/demo/HelloDocker.Web

$ cd $HOME/demo/HelloDocker.Web
$ touch docker-compose.yml
$ vi docker-compose.yml
version: '2'
services:
    hellodocker-web:
        container_name: hellodocker.web.compose
        build: .

    reverse-proxy:
        container_name: reverse-proxy
        image: nginx
        ports:
         - "9090:8080"
        volumes:
         - ./proxy.conf:/etc/nginx/conf.d/default.conf

简单介绍下上面的配置文件,其中定义了两个服务:一个是hellodocker-web,即以我们当前项目目录来构建镜像并启动一个叫hellodocker.web.compose的容器。一个是reverse-proxy,用来使用nginx镜像进行反向代理,其中又通过指定volumes来使用挂载的方式进行配置。

$ touch proxy.conf
$ vi proxy.conf
server {
    listen 8080;

    location / {
      proxy_pass http://hellodocker-web:5000;
    }
}
$ ls
[root@iZ288a3qazlZ HelloDocker.Web]# ls
appsettings.Development.json  Controllers             Models      Startup.cs
appsettings.json              docker-compose.yml      obj         Views
bin                           Dockerfile              Program.cs  wwwroot
bundleconfig.json             HelloDocker.Web.csproj  proxy.conf
[root@iZ288a3qazlZ HelloDocker.Web]#

其中要注意反向代理的配置:proxy_pass http://hellodocker-web:5000;,其中ip部分直接指定的是docker-compose.yml中定义的第一个服务的名称hellodocker-web
下面我们就来启动Compose:

$ docker-compose up -d
Building hellodocker-web
Step 1 : FROM microsoft/dotnet:latest
 ---> 7d4dc5c258eb
Step 2 : WORKDIR /app
 ---> Using cache
 ---> 98d48a4e278c
Step 3 : COPY . /app
 ---> 0cb9fc540afe
Removing intermediate container 9fecf088f03f
Step 4 : RUN dotnet restore
 ---> Running in 4bb7f34edbbe
  Restore completed in 597.13 ms for /app/HelloDocker.Web.csproj.
  Restoring packages for /app/HelloDocker.Web.csproj...
  Restore completed in 1.76 sec for /app/HelloDocker.Web.csproj.
 ---> 6869609ece23
Removing intermediate container 4bb7f34edbbe
Step 5 : EXPOSE 5000
 ---> Running in a97febf01e5a
 ---> 9b2639862a94
Removing intermediate container a97febf01e5a
Step 6 : ENV ASPNETCORE_URLS http://*:5000
 ---> Running in 4e2f4af28a8d
 ---> 0069661e891a
Removing intermediate container 4e2f4af28a8d
Step 7 : ENTRYPOINT dotnet run
 ---> Running in cbbf08d906f9
 ---> 0bbeef249b30
Removing intermediate container cbbf08d906f9
Successfully built 0bbeef249b30
WARNING: Image for service hellodocker-web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating hellodocker.web.compose ... done
Starting reverse-proxy ... done
//执行docker-compose ps验证启动的服务
$ docker-compose ps
         Name                   Command          State               Ports
---------------------------------------------------------------------------------------
hellodocker.web.compose   dotnet run             Up      5000/tcp
reverse-proxy             nginx -g daemon off;   Up      80/tcp, 0.0.0.0:9090->8080/tcp
//使用curl指令验证nginx的反向代理
$  curl -I http://localhost:9090
HTTP/1.1 200 OK
Server: nginx/1.13.7
Date: Sun, 24 Dec 2017 04:37:35 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive

可以看到,通过执行curl -I http://localhost:9090验证代理服务器配置成功,我们再通过浏览器访问http://<ip address>:9090发现正确返回了我们MVC项目的默认首页。

// 查看当前运行的容器
$ docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                            NAMES
a52830499cff        hellodockerweb_hellodocker-web   "dotnet run"             7 minutes ago       Up 7 minutes        5000/tcp                         hellodocker.web.compose
e1fe109e10bc        nginx                            "nginx -g 'daemon off"   11 minutes ago      Up 4 minutes        80/tcp, 0.0.0.0:9090->8080/tcp   reverse-proxy

我们同时也发现通过docker-compose正确的创建了两个容器hellodocker.web.composereverse-proxy

version: 3stages:- compile- deployrelease: stage: compile job_type: lite_image_build only: branches: - master allow_failure: false compile: build_dir: / cache: false dockerfile_path: /Dockerfile.compile extract: - /usr/src/app/dist - /usr/src/app/_nginx/default.conf package: build_dir: / cache: false dockerfile_path: /Dockerfile.packageself: stage: deploy job_type: DCS_deploy only: branches: - master allow_failure: false dependencies: - release app_name: web cluster_id: ""

 

其中 ng-app-build 表示镜像名称。

二、运行Angular

try_files 可以保证当访问的路径未找到文件时直接使用 index.html
文件替代,这也就是 Angular HTML5 路由策略很重要的一环。

server { listen 80; server_name ng-alain.com www.ng-alain.com; return 301 https://$server_name$request_uri;}server { listen 443 ssl http2; server_name ng-alain.com www.ng-alain.com; location / { proxy_pass http://127.0.0.1:8001/; }}

2、通过acme.sh签发证书

最后,执行构建镜像命令:

最后,在 Angular 项目根目录下创建 Dockerfile.package 文件:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

有两个主要细节:SSL配置和代理转化Angular容器实例端口的配置。

我们可以查看已经存在的镜像:

FROM 指定一个 node 基础镜像,这是构建 Angular 项目的最简的基本 LABEL
镜像元数据,例如 authors 作者信息 WORKDIR 指定镜像内工作目录 COPY
复制项目 package.json 并安装依赖包 RUN 复制项目文件后并执行 ng build
命令

3、运行 Nginx

然后在 Nginx 配置相应的代理转化:

四、总结

docker build -f Dockerfile.build -t ng-app-build .

很多人反应很难访问 Github Page,所以 ng-alain.com
转移到阿里云服务器上,因此做了一次完整的 Angular 容器部署。

acme.sh 是国内一大牛写的用于简化申请 Let’s Sencrypt
证书,并自动续签证书,几乎上第一次安装完全后,后续都无须人工干预。

acme.sh --installcert  -d ng-alain.com  --key-file $/proxy/certs/ng-alain.com.key  --fullchain-file $/proxy/certs/fullchain.cer  --reloadcmd "service nginx force-reload"

最后,构建生产环境镜像:

参数和上一节略同,只是将提取的 dist 写入到镜像内的 Nginx
默认运行目录里。

上述有系列的 Docker
命令甚是繁琐,应该把这一切自动化,有个专业名称叫:持续部署;ng-alain.com
现在是使用DaoCloud 完成这项工作。

docker run -d -p 80:80  --name web  ng-app

当然,这个时候的编译 Angular 镜像已经没有存在的意义了。

但是我比较建设这里的 Nginx 配置应该极简单化,把一些 GZip、SSL
统一在反向代理层上完成,毕竟容器化后的应用不可能在一台机器上只部署一个应用。

最后,重启 Nginx。

当然,未来Angular cli 也将会内置 Docker 部署,这里有一份来自 Angular
的相关ng docker 命令的设计文档。

docker run -d -p 80:80  --name web  ng-app

以 CenOS7 为例,更多系统请自行Google:

这里我使用DNS来签发证书,目前支持几十种服务商,当然包括阿里云:

三、持续部署

将生产环境容器化已经是一种架构标准,上述只是在部署ng-alain.com
的一些总结,实际可能遇到的问题会更多,大家可以通过以下找到答案:

这个过程包括三个步骤:安装 Nginx、安装 acme.sh 签发 Let’s Sencrypt
证书、配置并运行 Nginx。

DaoCloud 提供一种叫的构建功能,分为三个步骤——编译、提取、打包;等同上述
Angular 项目的编译、提供和发布。

docker images

1、安装Nginx

Docker — 从入门到实践Docker 问答录DaoCloud Services 文档

而对于代理转化,这其决于你映射Angular容器的端口,例如上述在运行容器的命令是这样:

acme.sh
会纪录这行命令的所有细节,并且当自动续签触发后再一次执行它们。其中
service nginx force-reload 是指命令执行完成后重启 nginx
使启证书立刻生效。

docker kill webdocker run -d -p 8001:80  --name web  ng-app
FROM nginxCOPY _nginx/default.conf /etc/nginx/conf.d/RUN rm -rf /usr/share/nginx/html/*COPY /dist /usr/share/nginx/htmlCMD ["nginx", "-g", "daemon off;"]
docker build -f Dockerfile -t ng-app .

注意: 容器路径必须上一步 Angular 编译的 WORKDIR 路径

Nginx 反向代理

Ali_Key 和 Ali_Secret 是对应的阿里云的 Access key,注意要给予 DNS
授权。

注意: 其中 extract 务必包含完整路径。

server 这里有两个分别对 80 和 443,前者强制跳转
https,当你不希望用户使用 http 访问你站点时。 server_name
指定监听的域名 proxy_pass 指定代理转发域,8001 端口就是上述 Angular
应用所处容器所映射的端口

2、Angular 运行环境

curl https://get.acme.sh | sh

绝大多数情况下会利用一个代理服务器容器,来转发多个站点,因此很少会直接在一个
Angular 站点里直接使用 80 端口,而是透过另一个代理层进行转发。

整个过程我非常顺利,没有任何错误,acme.sh
也有很多说明文档,包括中文,有关更多细节请自行阅读。

对于前者,若你在运行上述命令时依然保持路径的话,则:

一、构建Angular镜像

我们可以重新换另一个映射端口,例如:8001。

只需要在项目下创建 daocloud.yml;它是 DaoCloud
提供的一种自定义项目流程的定义文件,若你对上述已经了解,再来看它就不会非常陌生。以下是
ng-alain.com 完整的 daocloud.yml 内容:

1、编译Angular

以上所有代码可以在 delon 上找得到,可能存在个人路径不同罢了。

我们知道Docker有两个很重要的概念:镜像、容器。而Anguar容器部署只需要把Angular构建的生产环境产生的目录
dist 写入至一个静态服务器镜像,最后实例这个镜像。

ssl_certificate /root/proxy/certs/fullchain.cer;ssl_certificate_key /root/proxy/certs/ng-alain.com.key;ssl_session_timeout 30m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;ssl_session_cache shared:SSL:10m;ssl_prefer_server_ciphers on;

以下是一个 Angular 应用最简化的配置信息:

我们并不会基于编译 Angular 镜像基础上构建 Angualr
运行环境镜像,因此里头包括很多无意义的文件,例如 npm i 产生的
node_modules。而是从上述镜像提取 dist 目录,并产生一个新镜像;Angular
运行环境应该是一个干净、简单的。

在之前我尝试使用jwilder/nginx-proxy
镜像来处理,它真的非常方便,但是在SSL环节让我吃了很多苦头,最后放弃之,而改用直接在主机上安装
Nginx 作为反向代理。在Angular容器化过程中,我们并未配置任何 SSL、GZip
等,只是保留 Nginx
服务所需的配置项而已,而这一部分我们可以放在反向代理层完成。

server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }}
标签:, , , , ,

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图