Docker-compose简介
Docker Compose是一个用于定义和管理多个Docker容器的工具。它使用一个单独的YAML文件来配置和组织多个服务,并提供一组命令来管理这些服务的生命周期。
使用Docker Compose可以实现以下功能:
定义多个服务:通过编写一个docker-compose.yml文件,你可以定义多个需要运行的服务、它们的镜像、端口映射、环境变量等信息。
启动和停止服务:使用docker-compose up
命令可以启动定义的所有服务。而使用docker-compose down
命令可以停止并移除容器。
管理服务依赖关系:如果你的应用由多个服务组成,例如一个Web前端和一个数据库后端,你可以在docker-compose.yml中指定它们之间的依赖关系,确保它们在正确的顺序和环境中启动。
扩展和缩减服务:你可以使用docker-compose scale
命令来扩展或缩减特定服务的实例数量,以适应不同的负载需求。
环境变量管理:Docker Compose允许你在docker-compose.yml文件中设置环境变量,这样你可以轻松地管理不同服务的配置参数。
网络配置:Docker Compose会自动为所定义的服务创建一个默认的网络,使得服务之间可以通过服务名进行通信。
总之,Docker Compose简化了多个Docker容器的管理和协同工作。通过一个简单的配置文件,你可以定义和管理多个容器、它们的依赖关系和环境变量,从而实现更方便、可重复和可扩展的容器化应用部署。
YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。
使用 YAML 时需要注意下面事项:
缩进:YAML使用缩进来表示层次结构,一般使用2个空格或4个空格作为缩进单位,不要使用制表符。缩进的数量必须保持一致,否则会导致语法错误。
键值对:YAML使用冒号(:)来分隔键和值,键值对之间使用一个空格进行分隔。
列表:列表使用短横线(-)作为起始标记,并使用一个空格进行分隔。
多行文本:如果需要在YAML文件中编写多行文本,可以使用竖线(|)或大于号(>)进行表示。竖线会保留文本中的换行符,而大于号会将换行符替换为一个空格。
注释:可以使用井号(#)来添加注释,从井号开始到行末都会被视为注释内容。
引用:可以使用&和*符号来创建和引用锚点,以避免重复定义相同的数据。
引号:如果值中包含特殊字符或空格,可以使用单引号(')或双引号(")进行引用。单引号会保持原样,而双引号可以进行变量替换和转义字符处理。
继承和覆盖:可以使用<<
符号来继承和覆盖已定义的键值对。
大小写敏感
字段 描述
build 指定 Dockerfile 文件名,
要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile 构建镜像上下文路径
context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image 指定镜像
command: 执行命令,覆盖容器启动后默认执行的命令
container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名 称,则无法scale指定容器数量
deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment 添加环境变量
networks 加入网络,引用顶级networks下条目
network_mode 设置容器的网络模式,如 host,bridge,...
ports 暴露容器端口,与 -p 相同,但端口不能低于 60
volumes 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname 容器主机名
sysctls 在容器内设置内核参数
links 连接到另外一个容器,- 服务名称[:服务别名]
privileged 用来给容器root权限,注意是不安全的,true | false
restart 设置重启策略,no,always,nounless-st-failure,oped
no,默认策略,在容器退出时不重启容器。
on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
on-failure:3,在容器非正常退出时重启容器,最多重启3次。
always,在容器退出时总是重启容器。
unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。
depends_on depends_on标签用于解决容器的依赖、启动先后的问题。
php:
depends_on:
- apache
- mysql
字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务
yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml #创建模板脚本
├── nginx
│?? ├── Dockerfile #创建容器脚本
│?? ├── nginx-1.12.0.tar.gz #复制源码包
│?? └── run.sh #启动服务脚本
└── wwwroot
└── index.html #站点网页
Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
cp nginx-1.12.0.tar.gz ./
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.12.0.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
//方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
echo "
vim /opt/compose_nginx/docker-compose.yml
version: '3'
services:
nginx:
container_name: web1
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1216:80
- 1217:443
networks:
lnmp:
ipv4_address: 172.20.0.10
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d
-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-d :在后台运行
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b48dceee248f compose_nginx_nginx "/run.sh" About a minute ago Up About a minute 0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp compose_nginx_nginx_1
cd /opt/compose_nginx/
docker-compose ps #必须在docker-compose.yml所在目录执行此命令
浏览器访问:http://192.168.90.10:1216
Consul是一种开源的分布式服务发现和配置管理工具。它提供了服务注册与发现,健康检查,KV存储,多数据中心,安全服务通信等功能,是构建分布式系统和微服务架构的重要工具。
Consul主要由以下几个组件组成:
Agent(代理):运行在每个节点上的进程,负责与其他Agent通信来完成服务注册、健康检查等工作。
Server(服务器):提供更高级别的服务发现和配置管理功能,同时也承担了集群管理和状态同步等任务。
Catalog(目录):存储所有服务实例的元数据和状态信息,包括服务名称、地址、端口、标签等。
Health Check(健康检查):通过定期进行健康检查来保证服务的可用性,检查结果会被记录在Catalog中。
Key-Value Store(键值存储):提供了一个分布式的KV存储,用于存储和共享配置信息、特性标志等数据。
DNS接口:提供了DNS接口来支持服务发现的客户端透明地访问服务。
Consul通过集成多种服务发现、负载均衡和监控工具,如NGINX、HAProxy、LoadBalancer、Prometheus等,可以实现服务治理和故障自愈,提高了系统的可靠性和弹性,是一种非常有用的分布式系统解决方案。
consul服务器 192.168.90.10 运行consul服务、nginx服务、consul-template守护进程
registrator服务器 192.168.90.20 运行registrator容器、运行nginx容器
systemctl stop firewalld.service
setenforce 0
1. 建立 Consul 服务
mkdir /opt/consul
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd /opt/consul
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/local/bin/
//设置代理,在后台启动 consul 服务端
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.90.10 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
----------------------------------------------------------------------------------------------------------
-server: 以server身份启动。默认是client。
-bootstrap :用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为 server-leader。
-bootstrap-expect=2 :集群要求的最少server数量,当低于这个数量,集群即失效。
-ui :指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面。
-data-dir :指定数据存储目录。
-bind :指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。
-client :指定 consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1。
-node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
-datacenter :指定数据中心名称,默认是dc1。
----------------------------------------------------------------------------------------------------------
netstat -natp | grep consul
启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口
2. 查看集群信息
#查看members状态
consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.90.10:8301 alive server 0.9.2 2 dc1
#查看集群状态
consul operator raft list-peers
consul info | grep leader
leader = true
leader_addr = 192.168.10.23:8300
curl 127.0.0.1:8500/v1/status/peers #查看集群server成员
curl 127.0.0.1:8500/v1/status/leader #集群 server-leader
curl 127.0.0.1:8500/v1/catalog/services #注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx #查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes #集群节点详细信息
//容器服务自动加入 Nginx 集群
1. 安装 Gliderlabs/Registrator
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.90.20 \
consul://192.168.90.10:8500
----------------------------------------------------------------------------------------------------------
--net=host :把运行的docker容器设定为host网络模式。
-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
--restart=always :设置在容器退出时总是重启容器。
--ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip。
consul :指定consul服务器的IP和端口。
----------------------------------------------------------------------------------------------------------
docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
docker run -itd -p:88:80 --name test-03 -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd httpd #-h:设置容器主机名
浏览器中,输入 http://192.168.90.10:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。
//在consul服务器使用curl测试连接服务器
curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}
consul-template是一个用于与Consul集成的工具,可以根据Consul中的服务和配置信息生成文件。它可以监视Consul中的键值存储和服务注册信息的更改,并根据这些更改自动更新和重新生成文件。
consul-template主要有以下特性:
动态生成配置文件:consul-template可以根据Consul中的键值存储(Key-Value Store)中的配置信息,生成配置文件,如Nginx、HAProxy、Apache等的配置文件。
服务发现与负载均衡:通过consul-template,可以将服务注册在Consul中的服务信息注入到配置文件中,从而实现服务发现和负载均衡。
模板语言支持:consul-template使用Go语言的模板引擎,支持灵活的模板语法,可以根据需求定制生成的配置文件。
自动更新:consul-template会监视Consul中的键值存储和服务注册信息的更改,并自动更新生成的配置文件。当Consul中的信息发生变化时,consul-template会检测到并重新生成文件,以确保配置文件始终与最新的服务和配置信息保持同步。
支持多种操作系统和容器环境:consul-template可以在各种操作系统和容器环境中运行,包括Linux、Windows、Docker等。
通过使用consul-template,可以更方便地将Consul的服务和配置信息应用到实际的应用程序中,同时可以实现动态更新配置文件的功能,提高系统的可靠性和灵活性。
1. 准备 template nginx 模板文件
//在consul服务器上操作
vim /opt/consul/nginx.ctmpl
#定义nginx upstream一个简单模板
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
#定义一个server,监听8000端口,反向代理到upstream
server {
listen 8000;
server_name localhost 192.168.90.10;
access_log /var/log/nginx/kgc.com-access.log; #修改日志路径
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
2. 编译安装nginx
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
3. 配置 nginx
vim /usr/local/nginx/conf/nginx.conf
......
http {
include mime.types;
include vhost/*.conf; #添加虚拟主机目录
default_type application/octet-stream;
......
//创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
//创建日志文件目录
mkdir /var/log/nginx
//启动nginx
nginx
4. 配置并启动 template
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/
//在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.90.10:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
//另外打开一个终端查看生成配置文件
upstream http_backend {
server 192.168.90.20:83;
server 192.168.90.20:84;
}
server {
listen 8000;
server_name 192.168.90.10;
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
5. 访问 template-nginx
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f0dc08956f4 httpd "httpd-foreground" 1 hours ago Up 1 hours 0.0.0.0:89->80/tcp test-04
a0bde07299da httpd "httpd-foreground" 1 hours ago Up 1 hours 0.0.0.0:88->80/tcp test-03
4f74d2c38844 nginx "/docker-entrypoint.…" 1 hours ago Up 1 hours 0.0.0.0:84->80/tcp test-02
b73106db285b nginx "/docker-entrypoint.…" 1 hours ago Up 1 hours 0.0.0.0:83->80/tcp test-01
409331c16824 gliderlabs/registrator:latest "/bin/registrator -i…" 1 hours ago Up 1 hours registrator
docker exec -it 4f74d2c38844 bash
echo "this is test1 web" > /usr/share/nginx/html/index.html
docker exec -it b73106db285b bash
echo "this is test2 web" > /usr/share/nginx/html/index.html
浏览器访问:http://192.168.10.23:8000/,并不断刷新。
6. 增加一个 nginx 容器节点
(1)增加一个 nginx 容器节点,测试服务发现及配置更新功能。
docker run -itd -p:85:80 --name test-05 -h test05 nginx
//观察 template 服务,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf 文件内容,并且重载 nginx 服务。
(2)查看/usr/local/nginx/conf/vhost/kgc.conf 文件内容
cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {
server 192.168.90.10:83;
server 192.168.90.10:84;
server 192.168.90.10:85;
server 192.168.90.10:86;
}
(3)查看三台 nginx 容器日志,请求正常轮询到各个容器节点上
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05
docker logs -f test-06
//添加一台已有docker环境的服务器192.168.90.30/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.90.30 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.90.10 &> /var/log/consul.log &
------------------------------------------------------------------------
-enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中
------------------------------------------------------------------------
consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.90.10:8301 alive server 0.9.2 2 dc1
consul-server02 192.168.90.30:8301 alive server 0.9.2 2 dc1
consul operator raft list-peers
Node ID Address State Voter RaftProtocol
Node ID Address State Voter RaftProtocol
consul-server01 192.168.90.10:8300 192.168.90.10:8300 leader true 2
consul-server02 192.168.90.30:8300 192.168.90.20:8300 follower true 2