企业运维容器之 docker 三剑客compose
Posted 123坤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了企业运维容器之 docker 三剑客compose相关的知识,希望对你有一定的参考价值。
企业运维容器之 docker 三剑客compose
1. Docker Compose 简介
- 微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
- Docker Compose是一种编排服务,基于pyhton语言实现,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
- 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
- 解决了容器与容器之间如何管理编排的问题。
- Docker Compose 中有两个重要的概念:
服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
2. Docker Compose 实践
- docker compose 安装
- 根据官方推荐下载
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-
uname -s-
uname -m> /usr/local/bin/docker-compose
下载后执行命令# chmod +x /usr/local/bin/docker-compose
加上执行权限; - 从阿里云下载
https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/
下载后放在:/usr/local/bin/docker-compose
并给予执行的权限chmod +x /usr/local/bin/docker-compose
;
此处用阿里云的镜像站下载;
[root@server1 ~]# ls
compose docker-compose-Linux-x86_64-1.27.0
[root@server1 ~]# mv docker-compose-Linux-x86_64-1.27.0 /usr/local/bin/docker-compose
[root@server1 ~]# chmod +x /usr/local/bin/docker-compose
编辑 docker-compose.yml 文件;从 https://docs.docker.com/compose/compose-file/
来查看其属性的含义,以下列出常用的几个含义:
- Image:指定为镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
- Build:指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
- Command:覆盖容器启动后默认执行的命令。
- Links:链接到其它服务中的容器。
- Ports:端口映射。
- Expose::暴露端口信息。
- Volumes:卷挂载路径设置
创建 docker-compose.yml
文件:
[root@server1 ~]# mkdir compose
[root@server1 ~]# cd compose/
[root@server1 compose]# mkdir web1
[root@server1 compose]# mkdir web2
[root@server1 compose]# echo web1 > web1/index.html
[root@server1 compose]# echo web2 > web2/index.html
[root@server1 compose]# vim docker-compose.yaml
version: "3.9"
services:
web1:
image: nginx:latest
networks:
- webnet
volumes:
- ./web1:/usr/share/nginx/html
web2:
image: nginx:latest
networks:
- webnet
volumes:
- ./web2:/usr/share/nginx/html
haproxy:
image: haproxy:latest
networks:
- webnet
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
ports:
- "80:80"
networks:
webnet:
下载 haproxy 镜像,由于此处的镜像并没有配置文件需要自己来编写配置文件;
[root@server1 ~]# docker images haproxy
REPOSITORY TAG IMAGE ID CREATED SIZE
haproxy latest fbd1f55f79b3 5 years ago 139MB
[root@server1 ~]# docker run -it --rm haproxy bash
root@ac91f5c66564:/# cd /usr/local/etc/haproxy/
root@ac91f5c66564:/usr/local/etc/haproxy# ls
errors
root@ac91f5c66564:/usr/local/etc/haproxy#
##没有配置文件
[root@server1 ~]# docker run -d --name demo haproxy
7c9267a15edc8b5d3f56bc9fb7c9015d256e8a073aa76b712352590c0088f323
[root@server1 ~]# docker ps | grep haproxy
[root@server1 ~]# docker ps -a | grep haproxy
7c9267a15edc haproxy "/docker-entrypoint.…" 18 seconds ago Exited (0) 17 seconds ago demo
[root@server1 ~]# docker logs demo
<7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds
[ALERT] 152/025843 (8) : Could not open configuration file /usr/local/etc/haproxy/haproxy.cfg : No such file or directory
<5>haproxy-systemd-wrapper: exit, haproxy RC=256
##可以看到其无法打开配置文件
编写 haproxy.cfg
文件:
[root@server1 ~]# cd compose/
[root@server2 compose]# mkdir haproxy
[root@server2 compose]# cd haproxy
[root@server2 haproxy]# vim haproxy.cfg
#
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.
#
global
maxconn 65535
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200
gid 200
chroot /var/empty
daemon
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats
frontend public
bind *:80 name clear
backend dynamic
balance roundrobin
server a web1:80 check inter 1000
server b web2:80 check inter 1000
运行 docker-compose
:
docker-compose
命令必须在项目下运行。
以下是项目目录结构:
[root@server2 compose]# yum install tree.x86_64 -y
[root@server2 compose]# tree .
.
├── docker-compose.yaml
├── haproxy
│ └── haproxy.cfg
├── web1
│ └── index.html
└── web2
└── index.html
3 directories, 4 files
docker-compose up
创建并启动容器
[root@server2 compose]# docker-compose up -d
Creating network "compose_webnet" with the default driver
Creating compose_web1_1 ... done
Creating compose_web2_1 ... done
Creating compose_haproxy_1 ... done
[root@server1 compose]# docker-compose ps
##在用命令查看其状态
Name Command State Ports
-------------------------------------------------------------------------------
compose_haproxy_1 /docker-entrypoint.sh hapr ... Up 0.0.0.0:80->80/tcp
compose_web1_1 /docker-entrypoint.sh ngin ... Up 80/tcp
compose_web2_1 /docker-entrypoint.sh ngin ... Up 80/tcp
此时在查看日志时,会看到 haproxy 的起来之后所做的链接;
haproxy_1 | <7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds
当都开启之后,此时在网页中便可访问:172.25.25.1/admin/stats
效果如下图所示
此时在测试发布页面时,如下所示,可以看到其是负载均衡的。
[root@westos ~]# curl 172.25.25.1
web1
[root@westos ~]# curl 172.25.25.1
web2
[root@westos ~]# curl 172.25.25.1
web1
[root@westos ~]# curl 172.25.25.1
web2
[root@westos ~]# curl 172.25.25.1
web1
[root@westos ~]# curl 172.25.25.1
web2
此时再次添加一个负载;
[root@server1 compose]# mkdir web3
[root@server1 compose]# echo web3 > web3/index.html
[root@server1 haproxy]# vim haproxy.cfg
balance roundrobin
server a web1:80 check inter 1000
server b web2:80 check inter 1000
server server3 web3:80 check inter 1000
[root@server1 compose]# vim docker-compose.yaml
web3:
image: nginx:latest
networks:
- webnet
volumes:
- ./web3:/usr/share/nginx/html
[root@server1 compose]# docker-compose stop
Stopping compose_web2_1 ... done
Stopping compose_web1_1 ... done
[root@server1 compose]# docker-compose up -d
Starting compose_web2_1 ... done
Starting compose_web1_1 ... done
Starting compose_haproxy_1 ... done
Creating compose_web3_1 ... done
[root@server1 compose]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
compose_haproxy_1 /docker-entrypoint.sh hapr ... Up 0.0.0.0:80->80/tcp
compose_web1_1 /docker-entrypoint.sh ngin ... Up 80/tcp
compose_web2_1 /docker-entrypoint.sh ngin ... Up 80/tcp
compose_web3_1 /docker-entrypoint.sh ngin ... Up 80/tcp
此时再次查看页面信息:
当关闭一个页面是,由于负载均衡是有健康检查的,等待时间到了之后便会调度不到信息;
[root@server1 compose]# docker-compose stop web2
Stopping compose_web2_1 ... done
3. Docker Compose 常用命令
- Build: 构建或重新构建服务;
- kill:强制停止服务容器;
- logs:查看服务的输出;
- port:打印绑定的公共端口;
- ps:列出所有容器;
- pull:拉取服务所需镜像;
- rm:删除停止的服务容器;
- up:构建并启动容器。
以上是关于企业运维容器之 docker 三剑客compose的主要内容,如果未能解决你的问题,请参考以下文章
企业运维实战--Docker三剑客二之docker-compose
24.Docker技术入门与实战 --- Docker三剑客之Compose