开普网站建设公司,网站专题模板,一个网站做两种产品,制作公司网站怎么做❝虽说我已经从docker-compose走上了docker swarm的邪门歪道#xff0c;目前被迫走在k8s这条康庄大道#xff0c; 但是我还是喜欢docker-compose简洁有效的部署方式。❞曾其何时docker-compose非常适合开发、测试、快速验证原型#xff0c;这个小工具让单机部署容器变得简洁… ❝虽说我已经从docker-compose走上了docker swarm的邪门歪道目前被迫走在k8s这条康庄大道 但是我还是喜欢docker-compose简洁有效的部署方式。❞曾其何时docker-compose非常适合开发、测试、快速验证原型这个小工具让单机部署容器变得简洁、高效。正如我在《docker-composedocker-stack前世今生》里讲所有人都认为docker-compose是单机部署多容器的瑞士军刀没有docker stack由deploy配置节体现的生产特性(多实例、滚动部署、故障重启、负载均衡)。最近我发现我错了docker-compose还是具备服务多实例的能力的。❝在docker-compose -h中发现了一个scale参数这是个啥?docker-compose还能水平扩展实现多容器docker-compose定义的容器映射的主机端口不会冲突吗❞号主精心分析才找到一个完备的理论来支持scale参数的合理性。在此文中我们将演示一个示例说明如何使用Docker Compose运行服务的多实例version: 3
services:webapp:image: luksa/kubiadepends_on:- dbports:- 8080:8080 # 主机Port: 容器暴露Port
在此文件中我们定义了一个webapp服务nodejs程序在8080端口监听为webapp容器定义了端口映射从容器8080端口映射到主机的8080端口这样我们可以在主机上使用http://localhost:8080URL访问服务器。Docker Compose --scale flag当我们运行docker-compose up -h命令时 其中--scale选项显示为服务指定多实例--scale SERVICENUM Scale SERVICE to NUM instances. Overrides thescale setting in the Compose file if present.
很显然使用目前的DockerCompose配置运行docker-compose up --scale webapp3将导致failed: port is already allocated错误问题在于我们试图运行webapp服务的三个实例并将它们全部映射到主机同一端口,而「主机的8080端口只能绑定给一个容器」。解决错误的一种方法是将Docker Compose文件中的端口映射更改为- 8080 这会将容器的端口8080暴露给主机上的临时未分配端口。这个操作延伸出另一个问题在启动容器之前我们将不知道用于访问服务的端口。要列出端口映射请在运行docker-compose up --scale webapp3之后运行docker-compose ps来查看容器 Name Command State Ports
-------------------------------------------------------------
test_webapp_1 node app.js Up 0.0.0.0:32828-8080/tcp
test_webapp_2 node app.js Up 0.0.0.0:32830-8080/tcp
test_webapp_3 node app.js Up 0.0.0.0:32829-8080/tcp
添加负载均衡器为了能够在不知道特定容器的端口的情况下访问webapp服务并使用负载均衡机制将请求分发到容器我们需要在容器堆栈中添加负载均衡器。在此示例中将使用nginx作为负载均衡器来完成对外接收、对内转发。在与docker-compose.yml文件相同的目录中创建以下nginx.conf文件,代理转发请求user nginx;
events {worker_connections 1000;
}
http {server {listen 80;location / {proxy_pass http://webapp:8080;}}
}
这将配置nginx将请求从主机端口80转发到 http://webapp:8080。然后将由Docker’s embedded DNS解决寻址该DNS服务器使用轮询实现来根据服务名称解析DNS请求并将其分发给Docker容器。❝由于nginx服务负责对外接收请求、对内转发因此webapp服务可不直接对外暴露。实际上我们可以从Docker Compose文件中删除webapp端口映射配置而仅将端口8080通知给链接的nginx服务。❞version: 3
services:webapp:image: luksa/kubianginx:image: nginx:latestvolumes:- type: bindsource: /home/root/test/nginx.conftarget: /etc/nginx/nginx.confdepends_on:- webappports:- 80:80
通过此配置我们现在可以利用Docker Compose工具的scale水平扩展、实现服务多实例。docker-compose up -d --scale webapp3
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05b024964274 luksa/kubia node app.js 15 minutes ago Up 15 minutes test_webapp_1
2fb56a22810a luksa/kubia node app.js 15 minutes ago Up 15 minutes test_webapp_3
84041c727b6e luksa/kubia node app.js 15 minutes ago Up 15 minutes test_webapp_2
3882beae8b56 nginx:latest nginx -g daemon of… 15 minutes ago Up 15 minutes 0.0.0.0:80-80/tcp test_nginx_1总结输出docker-compose利用Docker引擎内嵌DNS提炼出水平扩展容器、服务多实例的能力 (用一个代理就能应用这个能力)Docker引擎内嵌DNS也是docker-compose利用服务名发现其他容器的关键在需要测试具备水平扩展能力的web服务时docker-compose up -d --scale 提供了一种快速、简便的途径。以后谁再说docker-compose没有水平扩展容器、服务多实例的时候就把这篇文章丢给他。https://pspdfkit.com/blog/2018/how-to-use-docker-compose-to-run-multiple-instances-of-a-service-in-development/#https://docs.docker.com/engine/userguide/networking/configure-dns/