docker srack部署
写一个compose文件
version: '3'
services:
web1:
image: passyt.com/library/nginx
ports:
- "80:80"
volumes:
- web-data:/usr/share/nginx/html
networks:
- my_net
deploy:
replicas: 3
volumes:
web-data:
networks:
my_net:
使用命令进行部署
docker stack deploy -c docker-compose.yml my_cluster
Creating network my_cluster_my_net
Creating service my_cluster_web1
部署完成可以进行查看
docker stack services my_cluster
ID NAME MODE REPLICAS IMAGE PORTS
xushxic7xzgp my_cluster_web1 replicated 3/3 passyt.com/library/nginx:latest *:80->80/tcp
这样就已经完成部署。
如果想要进行拉伸操作,也是只用修改文件里面的参数再运行一边就行了。
replicas: 6
docker service ps my_cluster_web1
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xb8xpocp2p4b my_cluster_web1.1 passyt.com/library/nginx:latest server1 Running Running 4 minutes ago
37uotbf3rfj9 my_cluster_web1.2 passyt.com/library/nginx:latest passyt.com Running Running 4 minutes ago
opiddn1x83ef my_cluster_web1.3 passyt.com/library/nginx:latest server3 Running Running 4 minutes ago
ty6endwithlq my_cluster_web1.4 passyt.com/library/nginx:latest server1 Running Running less than a second ago
sfq9p7pstsnk my_cluster_web1.5 passyt.com/library/nginx:latest passyt.com Running Starting 2 seconds ago
9kclhr40td07 my_cluster_web1.6 passyt.com/library/nginx:latest server3 Running Starting 1 second ago
这样就部署完成 ,十分的方便。部署的和用命令敲的效果相同,实现了负载均衡,每个节点上都分布了两个。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
667a186b73f0 passyt.com/library/nginx:latest "nginx -g 'daemon of…" 40 seconds ago Up 37 seconds 80/tcp my_cluster_web1.6.9kclhr40td07qb6mnuzmji0u1
3b2a20cabd87 passyt.com/library/nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp my_cluster_web1.3.opiddn1x83efnnbpvi7zz7jix
如何不进入容器,就修改发布页面,因为现在部署的将所有卷都放在了一起,所以要找到逻辑卷的位置。
[root@server1 compose]# docker volume ls
DRIVER VOLUME NAME
local my_cluster_web-data
[root@server1 compose]# docker volume inspect my_cluster_web-data
"Mountpoint": "/var/lib/docker/volumes/my_cluster_web-data/_data"
[root@server1 compose]# cd /var/lib/docker/volumes/my_cluster_web-data/_data
[root@server1 _data]# ls
50x.html index.html
这是挂载点,直接进入修改即可。但是这有一个问题,就是挂接节点不同步,在一台机子上进行修改只能保证该节点上的两个数据相同。
同时也可以部署一个监控,使用visualizer镜像,根据官方文档的提示进行部署。
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
将这些命令写入docker-compose.yml文件中
依然使用docker stack deploy -c docker-compose.yml my_cluster这个命令进行读取。
监控作完之后可以进行软件的跟新替换,使用监控看的更为直观。
将原来的nginx替换为httpd服务
web1:
image: passyt.com/library/httpd
ports:
- "80:80"
volumes:
- web-data:/usr/local/apache2/htdos
networks:
- my_net
deploy:
replicas: 3
下面这段跟在下面,跟着官方文档配置
update_config:
parallelism: 1 ##每次更新几个
delay: 10s ##多长时间更新一次
restart_policy:
condition: on-failure
使用文件给容器作限制
去/sys/fs/cgroup/memory/docker/文件下,这里面的文件就是docker容器中第内存限制文件。
如何查看不同容器中的限制?首先将每个容器的id找到
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
665523b216c6 passyt.com/library/httpd:latest "httpd-foreground" 6 minutes ago Up 6 minutes 80/tcp my_cluster_web1.1.qikzpp0
最前面的id是个缩写,我们需要进入完整id的目录中去,可以使用tab健进行补齐操作。
进入之后查看一个文件。
cat memory.limit_in_bytes
9223372036854771712
发现下面的数字很大,基本上没有作限制。
那么如何对内存直接进行限制呢?依然查看docker的官方文档。在文件中加入这些参数。
limits: ##最大占用
cpus: '0.50' ##cpu的50%
memory: 50M ##50M内存
reservations: ##最基本会分配这么多
cpus: '0.25'
memory: 20M
再加载这个文件,去cgroup目录进行查看(注:这个文件每加载一次相当于将容器删除后再建立,所以每次的id都不相同,注意查看)。
cat memory.limit_in_bytes
52428800
这个时候已经将容器进行了限制。
可视化
在网上拉取两个镜像
portainer/portainer和portainer/agent
将两个镜像上传至私有仓库
在官方可以下载其stack文件,接着直接进行部署就行了。也是十分的方便。