使用一个Dockerfile模版文件可以定义一个单独的应用容器,当需要定义多个容器时就需要编排
docker swarm(管理跨节点)
编排工具——docker compose
Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
Docker-compose将所有管理的容器分为三层:工程(project)、服务(service)、以及容器(container)
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。
工程:LNMP
服务:nginx、mysql、php
容器:docker 容器 --name 主机名 镜像 image 端口 -p 网络 --network 数据卷 -v ...
1.可以简化docker容器的管理;
2.使多个容器之间的部署和链接变得更加简单可靠,同时还能够实现服务自动扩展和容器的定期更新等功能;
3.还支持设置各种容器之间的依赖关系,比如:先启动数据库容器才能启动应用容器,
yml文件
先安装Docker才能安装Docker Compose
- 1. Docker Compose 环境安装
- 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
YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来
使用YAML是需要注意下面事项:
- 大小写敏感
- 通过缩进表示层级关系
- 不支持制表符tab键缩进,只能使用空格缩进
- 缩进的空格数目不重要,只要先同层级左对齐,通常开头缩进2个字符
- 用 # 号注释
- 符号字符后缩进1个空格,如用冒号: 顿号、逗号, 横杠-
- 如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号("")特殊字符作为本身想表达的意思
- name:"Hi,\nTom"
- vim /etc/vimrc
- set tabstop=2 #tab缩进为2格
animal: pets
- 2种方式
- - Cat
- - Dog
- - Goldfish
-
- ["Cat","Dog","Goldfish"] 双引号,逗号隔开
- debug: true
- debug: false
yaml格式
- languages: #序列的映射
-
- - Java
- - Golang
- - Python
- websites: #映射的映射
- cpu: 2
- memory: 1024M
- swap: 2048M
- disk: 60G
json格式
- {
- languages: [
- 'Java',
- 'Golang',
- 'Python'
- ],
- resources: {
- cpu: '2',
- memory: '1024M',
- swap: '2048M',
- disk: '60G'
- }
- }
-
- Baidu:
- www.baidu.com
- wangyi: www.163.com
- tengxun: www.qq.com
键:{值}
- school: bei da
- kgc: (两个空格)
- yunjisuan:
- - dingding
- - benet
- - wanglei
- - zhoubo
- - dalao
- dashuju:
- - lijia
- - chenming
| 字段 | 描述 |
| 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 | 在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。 php: depends_on:
|
depends on 会先启动该命令下的容器
| 字段 | 描述 |
| build | 重新构建服务 |
| ps | 列出容器 |
| up | 创建和启动容器 |
| exec | 在容器里面执行命令 |
| scale | 指定一个服务容器启动数量 |
| top | 显示容器进程 |
| logs | 查看容器输出 |
| down | 删除容器、网络、数据卷和镜像 |
| stop/start/restart | 停止/启动/重启服务 |
2支持单机编排
3支持单机和多机编排
- 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 #站点网页
- 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 <hmj>
- #添加环境包
- 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 "
this is test web
" > /opt/compose_nginx/wwwroot/index.html
- 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.18.0.10
- volumes:
- - ./wwwroot:/usr/local/nginx/html
- networks:
- lnmp:
- driver: bridge
- ipam:
- config:
- - subnet: 172.18.0.0/16
-
-
- cd /opt/compose_nginx/
- -f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
- -p, --project-name NAME :指定项目名称,默认使用目录名称
- 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.10.23:1216
2、
nginx + tomcat docker-compose编排
Docker consul的容器服务更新与发现
后端服务将自己的网络位置注册到服务发现模块;服务发现以K-V的方式记录下来(K为服务名,V就是IP:PORT);服务发现模块会定时健康检查并轮询访问注册的后端服务;当前端调用时就会提供网络位置并调用服务
内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server 和 client。 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。
在client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息。 在server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
server-leader负责同步注册信息给其他节点,和各个节点的健康检查
consul提供的一些关键特性
服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。 多数据中心:无需复杂的配置,即可支持任意数量的区域。
安装consul的作用是:服务注册与发现;将容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的先关服务信息
Cousul是一个基于分布式的服务发现和配置管理工具,可以快速构建分布式架构提供服务发现和服务治理等的功能特点;同时Cousul还提供了可靠的保证,多数据中心和强大的API
consul
服务发现是指在分布式计算环境下,自动发现可用的服务实例并将其注册到cousul上,一边是其他服务进行调用
配置管理是指通过consul动态更新分布式架构中的配置信息,包括环境变量、属性值、文件、数据库等
consul可以与多种不同的服务一起使用,包括kubernetes、docker、mescos等;是分布式系统不可或缺的一部分
- consul服务器 192.168.10.23 运行consul服务、nginx服务、consul-template守护进程
- registrator服务器 192.168.10.13 运行registrator容器、运行nginx容器
-
- systemctl stop firewalld.service
- setenforce 0
- 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.10.23 \
- -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 :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
- ------------------------------------------------------------------------------------
- netstat -natp | grep consul
-
- ------------------------------------------------------------------------------------
- 启动consul后默认会监听5个端口:
- 8300:replication(副本代表同步)、leader(领导者)、 farwarding(转发)的端口
- 8301:lan cossip的端口 #内部同一数据中心端口通信
- 8302:wan gossip的端口 #不同数据中心端口通信
- 8500:web ui界面的端口 #用与http接口和web
- 8600:使用dns协议查看节点信息的端口 #用于预注册的服务发现:使用DNS协议查看节点信息的端口
- ------------------------------------------------------------------------------------
- #查看members状态
- consul members
- Node Address Status Type Build Protocol DC
- consul-server01 192.168.10.23: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 #集群节点详细信息
- 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.10.13 \
- consul://192.168.10.23:8500
-
- ----------------------------------------------------------------------------------
-
- --net=host :把运行的docker容器设定为host网络模式。
- -v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
- --restart=always :设置在容器退出时总是重启容器。
- --ip :刚才把network指定了host模式,所以我们指定ip为宿主机的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.10.23:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。
-
- //在consul服务器使用curl测试连接服务器
- curl 127.0.0.1:8500/v1/catalog/services
- {"consul":[],"httpd":[],"nginx":[]}
Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。
Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。
- //在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.10.23;
- 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;
- }
- }
- 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/
- 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
- 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.10.23: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.10.13:83;
-
- server 192.168.10.13:84;
-
- }
-
- server {
- listen 8000;
- server_name 192.168.10.23;
- 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;
- }
- }
- 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/,并不断刷新。
- (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.10.23:83;:去!
- server 192.168.10.23:84;
- server 192.168.10.23:85;
- server 192.168.10.23:86;
- }
-
- (3)查看三台 nginx 容器日志,请求正常轮询到各个容器节点上
- docker logs -f test-01
- docker logs -f test-02
- docker logs -f test-05
- docker logs -f test-06
- consul agent \
- -server \
- -ui \
- -data-dir=/var/lib/consul-data \
- -bind=192.168.10.14 \
- -client=0.0.0.0 \
- -node=consul-server02 \
- -enable-script-checks=true \
- -datacenter=dc1 \
- -join 192.168.10.23 &> /var/log/consul.log &
-
- ----------------------------------------------------------------------------------
- -enable-script-checks=true :设置检查服务为可用
- -datacenter : 数据中心名称
- ----------------------------------------------------------------------------------
- consul members
- Node Address Status Type Build Protocol DC
- consul-server01 192.168.10.23:8301 alive server 0.9.2 2 dc1
- consul-server02 192.168.10.14: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.10.23:8300 192.168.10.23:8300 leader true 2
- consul-server02 192.168.10.14:8300 192.168.10.13:8300 follower true 2
consul agent 的server模式
docker logs -f 名称 查看容器日志