Cette fois, je vais vous montrer comment déployer des conteneurs angulaires et quelles sont les précautions à prendre pour le déploiement de conteneurs angulaires. Ce qui suit est un cas pratique, jetons un coup d'œil.
Nous savons que Docker a deux concepts très importants : l'image et le conteneur. Le déploiement du conteneur Anguar n'a besoin que d'écrire le répertoire dist généré par l'environnement de production construit par Angular (par exemple : ng build -prod) sur une image de serveur statique (par exemple : Nginx), et enfin d'instancier cette image.
1. Construire une image angulaire
1. Compiler Angular
De manière générale, la construction angulaire est également complété dans un conteneur. Créez le fichier Dockerfile.compile dans le répertoire racine du projet Angular :
FROM node:8 LABEL authors="cipchk <cipchk@qq.com>" WORKDIR /usr/src/app COPY package.json package.json RUN npm config set registry https://registry.npm.taobao.org \ && npm i COPY . . RUN ng build --prod
FROM spécifie une image de base de nœud, ce qui est le meilleur moyen de le faire. construire le projet Angular. De simples métadonnées d'image
LABEL, telles que les informations sur l'auteur
WORKDIR spécifie le répertoire de travail dans l'image
COPY copiez le package.json du projet et installez les packages dépendants
RUN copiez le fichier du projet et exécutez la commande ng build
Enfin, exécutez la commande build image :
docker build -f Dockerfile.build -t ng-app-build .
où ng-app-build représente le nom de l'image.
2. Environnement d'exécution Angular
Nous ne construirons pas l'image de l'environnement d'exécution Angularr sur la base de la compilation de l'image Angular, elle contient donc de nombreux fichiers dénués de sens, tels que npm i généré node_modules. Au lieu de cela, extrayez le répertoire dist de l'image ci-dessus et générez une nouvelle image ; l'environnement d'exécution Angular doit être propre et simple.
Par conséquent, extrayez la dist de l'image Angular compilée :
# 运行编译 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
Remarque : Le chemin du conteneur doit être le chemin WORKDIR de la compilation Angular précédente
Enfin, dans le répertoire racine du projet Angular Créez le fichier Dockerfile.package :
FROM nginx COPY _nginx/default.conf /etc/nginx/conf.d/ RUN rm -rf /usr/share/nginx/html/* COPY /dist /usr/share/nginx/html CMD ["nginx", "-g", "daemon off;"]
Les paramètres sont similaires à la section précédente, sauf que la dist extraite est écrite dans le répertoire d'exécution par défaut de Nginx dans l'image.
En même temps, utilisez _nginx/default.conf du projet Angular comme fichier de configuration Nginx et incluez la configuration Nginx dans le projet, par exemple lorsque vous utilisez la stratégie de routage HTML5, vous devez gérer les problèmes 404 , GZip, etc.
Mais je préfère que la configuration de Nginx ici soit extrêmement simple, et que certains GZip et SSL soient unifiés sur la couche proxy inverse. Après tout, il est impossible de déployer une seule application sur une seule machine après la conteneurisation. .
Ce qui suit sont les informations de configuration les plus simples d'une application Angular :
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; } }
try_files peut garantir que lorsque le chemin accédé ne trouve pas le fichier, le fichier index.html sera utilisé directement au lieu de cela, la stratégie de routage angulaire HTML5 est un élément important.
Enfin, créez l'image de l'environnement de production :
docker build -f Dockerfile -t ng-app .
Bien sûr, l'image angulaire compilée à ce moment n'a aucun sens.
docker rmi -f ng-app-build
2. Run Angular
Nous pouvons visualiser les images existantes :
docker images
Bien sûr, La configuration Nginx ci-dessus utilise un port 80, elle peut donc être utilisée directement :
docker run -d -p 80:80 \ --name web \ ng-app
Si votre nom de domaine est lié à l'hébergeur, vous pouvez y accéder directement. Jusqu'à présent, tout a été couvert après la conteneurisation angulaire. Ce qui suit est la partie sur l'application Docker de proxy inverse Nginx. Si vous l'avez déjà fait, ignorez simplement le chapitre suivant.
Proxy inverse Nginx
Dans la plupart des cas, un conteneur de serveur proxy est utilisé pour transférer plusieurs sites, il est donc rarement directement dans un site Angular. Utilisez directement le port 80, mais transmettez-le via une autre couche proxy.
J'ai déjà essayé d'utiliser le miroir jwilder/nginx-proxy. C'était vraiment pratique, mais cela m'a fait beaucoup souffrir dans le lien SSL. J'ai finalement abandonné et suis passé à l'installation de Nginx directement sur l'hôte. Agit comme un proxy inverse.
Lors du processus de conteneurisation angulaire, nous n'avons configuré aucun SSL, GZip, etc., nous avons juste conservé les éléments de configuration requis par le service Nginx, et nous pouvons compléter cette partie dans la couche proxy inverse.
Ce processus comprend trois étapes : installer Nginx, installer acme.sh pour émettre le certificat Let's Sencrypt, configurer et exécuter Nginx.
1. Installez Nginx
Prenez CenOS7 comme exemple. Pour plus de systèmes, veuillez Google :
sudo yum install epel-release sudo yum install nginx # 启动Nginx sudo systemctl start nginx
2. acme .sh a délivré un certificat
acme.sh 是国内一大牛写的用于简化申请 Let's Sencrypt 证书,并自动续签证书,几乎上第一次安装完全后,后续都无须人工干预。
Let's Sencrypt 不久前发布支持泛域,因此这一次也是申请了 *.ng-alain.com 泛域证书。
安装 acem.sh:
curl https://get.acme.sh | sh
这里我使用DNS来签发证书,目前支持几十种服务商,当然包括阿里云:
export Ali_Key="aaaaaaaaaaa" export Ali_Secret="xxxxxxxxxxxxxxxx" acme.sh --issue --dns dns_ali -d ng-alain.com -d *.ng-alain.com
Ali_Key 和 Ali_Secret 是对应的阿里云的 Access key,注意要给予 DNS 授权。
最后,利用 --installcert 来提取 Nginx 所需要的证书文件。
acme.sh --installcert \ -d ng-alain.com \ --key-file $(pwd)/proxy/certs/ng-alain.com.key \ --fullchain-file $(pwd)/proxy/certs/fullchain.cer \ --reloadcmd "service nginx force-reload"
acme.sh 会纪录这行命令的所有细节,并且当自动续签触发后再一次执行它们。其中 service nginx force-reload 是指命令执行完成后重启 nginx 使启证书立刻生效。
整个过程我非常顺利,没有任何错误,acme.sh 也有很多说明文档,包括中文,有关更多细节请自行阅读。
3、运行 Nginx
之前在安装 Nginx 时我们就已经启动了,那么,我们只需要对 /etc/nginx/nginx.conf 编写一些 Nginx 配置即可。
有两个主要细节:SSL配置和代理转化Angular容器实例端口的配置。
对于前者,若你在运行上述命令时依然保持路径的话,则:
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容器的端口,例如上述在运行容器的命令是这样:
docker run -d -p 80:80 \ --name web \ ng-app
我们可以重新换另一个映射端口,例如:8001。
docker kill web docker run -d -p 8001:80 \ --name web \ ng-app
然后在 Nginx 配置相应的代理转化:
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/; } }
server 这里有两个分别对 80 和 443,前者强制跳转 https,当你不希望用户使用 http 访问你站点时。
server_name 指定监听的域名
proxy_pass 指定代理转发域,8001 端口就是上述 Angular 应用所处容器所映射的端口
配置文件保持后,你可以先执行 nginx -t 来校验配置文件是否正确。
最后,重启 Nginx。
service nginx force-reload
三、持续部署
上述有系列的 Docker 命令甚是繁琐,应该把这一切自动化,有个专业名称叫:持续部署(简称:cd);ng-alain.com 现在是使用DaoCloud 完成这项工作。
DaoCloud 提供一种叫【安全镜像】的构建功能,分为三个步骤——编译、提取、打包;等同上述 Angular 项目的编译、提供和发布。
只需要在项目下创建 daocloud.yml;它是 DaoCloud 提供的一种自定义项目流程的定义文件,若你对上述已经了解,再来看它就不会非常陌生。以下是 ng-alain.com 完整的 daocloud.yml 内容:
version: 3 stages: - compile - deploy release: 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.package self: stage: deploy job_type: DCS_deploy only: branches: - master allow_failure: false dependencies: - release app_name: web cluster_id: ""
注意: 其中 extract 务必包含完整路径。
四、总结
将生产环境容器化已经是一种架构标准,上述只是在部署ng-alain.com 的一些总结,实际可能遇到的问题会更多,大家可以通过以下找到答案:
Docker — 从入门到实践
Docker 问答录(100 问)
DaoCloud Services 文档
当然,未来Angular cli 也将会内置 Docker 部署,这里有一份来自 Angular 的相关ng docker 命令的设计文档。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!