docker-compose单机多容器集群编排

前言:

docker-compose用来单机上编排容器(定义和运行多个容器,使容器能互通)

Eg:前端和后端部署在一台机器上,现在直接通过编写docker-compose文件对多个服务(可定义依赖,按顺序启动服务)同时进行启动/停止/更新

容器编排工具

例如:我们现在需要启动10个容器,其中3个nginx,2个redis,3个mysql,1个zabbix,1个ansible,有些容器需求先启动,有容器需要后启动,在启动的时候是有先后顺序的。

这时候需要批量启动容器,而且启动的时候容器之间是有依赖关系,需要考虑启动顺序的

我们可以将编排的内容全部写到一个yaml文件里,docker 的compose根据这个yaml文件里的安排去启动容器。

一 docker-compose 简介

使用一个Dockerfile模板文件可以定义一个单独的应用容器(可实现在单机上对容器集群编排管理

的工具),如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,给大家介绍

Docker 官方产品 Docker Compose 。

1 docker swarm(管理跨节点)

Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格

式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加

上后端的数据库服务容器等。

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

2 Docker-Compose将所管理的容器分为三层

  • 分别是工程(project)
  • 服务(service)
  • 以及容器(container)

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件

等)组成一个工程,若无特殊指定工程名即为当前目录名。

①一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中

可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现

服务发现及负载均衡,比如 Consul。

② Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量

COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

③ 使用Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会

碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器

本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

④ Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相

关联的应用容器为一个项目(project)。

⑤ Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只

要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。

3 通过docker-compose的优势:

使用 Docker Compose命令可以方便地管理多个容器;

可以解决容器之间的依赖关系,同时启动一个 Web 服务器容器和一个数据库容器,并在它们之间

建立网络连接,再通过depends_on实现php依赖于nginx和mysql服务的启动顺序;

Docker Compose 还支持自定义网络,使得容器可以在不同的网络中进行通信;

4 docker-compose的三大概念

项目project -> 包含一个或多个服务service -> 包含一个或多个容器container的镜像、端口映射、

环境变量、依赖关系等启动参数

二 compose 部署

1 Docker Compose 环境安装

#注意必须是在安装docker的基础上
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#下载安装包单独安装DockerCompose
chmod +x /usr/local/bin/docker-compose
#docker-compose添加执行权限
docker-compose --version
#查看docker-compose版本
[root@docker ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  模板  图片  下载  桌面
docker-compose   公共                  视频  文档  音乐
[root@docker ~]# mv docker-compose /opt
[root@docker opt]# chmod +x docker-compose
[root@docker opt]# mv docker-compose /usr/local/bin/
[root@docker opt]# docker-compose --version
docker-compose version 1.25.0-rc4, build 8f3c9c58

2 docker-compose的配置模板文件yaml文件的编写

YAML是一种标记语言,可以很直观的展示数据序列化格式,可读性很高。类似于json数据描述语

言,语法比json简单很多,关于yaml数据格式:

YAML数据结构通过缩进来表示字段的层级

连续的项目通过减号来表示,

键值对用冒号分隔,

数组用中括号 [] 括起来,

hash 用花括号 {} 括起来

3 yaml的注意事项:

大小写敏感

通过缩进表示层级关系

不支持制表符 tab 键缩进,只能使用空格缩进

缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格

用 # 号注释

符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠 - 

如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思

4 数据结构:

对象映射: 键值对的字典 animal: pets

序列数组: 一组按次序排列的列表

Cat

Dog

Goldfish

["Cat", "Dog", "Goldfish"]

5 布尔值

debug: true

debug: false

6 对象object类型类型

#yaml格式用 空格缩进 表示字段的层级关系,同一层字段要靠左对齐
 
一级字段:
    二级字段1:                    
    二级字段2:
	    三级字段: 
 
human:
  name:
    姓: "王"
	ming: 
	- 文宇
	- 飞龙
  age: 24
  sex: 男
  height: 180

7 文本块

value:              ->  value: "helloworld"
       hello 
       world
 
 
value: |            -> value: "hello\nworld"              #key: |  表示保留文本块里的换行符
       hello 
       world
 
value: |-           -> value: 相当于 echo -n "helloworld"
       hello        
       world
	   
value: |+           -> value: "hello\nworld\n"
       hello    
       world 

8 锚点

name: &a yaml       #锚点,相当于 a="yaml" 
                   
book: *a            #引用,相当于 echo $a     book: yaml   

9 关于json格式:

 json文件格式:文件名格式通常是以 .json 为后缀,用 大括号{} 表示字段的层级关系,每层字段除

了最后一个字段都要用逗号,结尾,特性:易于api接口解析

human:
  name:
    姓: "王"
	ming: 
	- 文宇
	- 思聪
  age: 24
  sex: 男
  height: 180
  
  
{
  "human": {                      #json格式用 大括号{} 表示字段的层级关系,每层字段除了最后一个字段都要用逗号,结尾
     "name": {
	    "姓": ["王"],
		"名":["文宇", "思聪"]
	 },
	 "age": ["24"],
	 "sex": ["男"],
     "height": ["180"]
  
  }
}

10 docker-compose配置模板文件常用的字段

image               使用本地镜像或从仓库拉取镜像创建容器
build              使用dockerfile现场构建镜像创建容器
context指定dockerfile文件所在的目录
dockerfile指定dockerfile的文件名称
command             指定容器启动命令,会覆盖镜像中的CMD指令
container_name      相当于指定容器的名称  --name 
environment        相当于指定容器的环境变量 -e  --env
network_mode        相当于指定容器的网络 --network
networks          指定加入的网络和IP    --IP以及自定义网络模式
ports               指定端口映射 -p
volumes            指定数据卷   -v 或者自定义顶级卷(版本3)
volumes_from        --volumes-from ,版本3不支持
 hostname  指定容器的主机名  -h  --hostname
sysctls             指定容器的内核参数  --sysctl
links               指定容器的名称以及连接别名,可以通过容器名称通信 --link
privileged          让容器拥有真正的root权限 不建议使用  不安全 --privileged

指定重启策略  --restart

设置重启策略,no,always,no-failure,unless-

stopped


no,默认策略,在容器退出时不重启容器。


on-failure,在容器非正常退出时(退出状态非0),才

会重启容器。


on-failure:3,在容器非正常退出时重启容器,最多重启

3次。
always,在容器退出时总是重启容器。


unless-stopped,在容器退出时总是重启容器,但是不

考虑在 Docker 守护进程启动时就已经停止了的容器。
 

restart

11 docker-compose命令

字段                    描述
build                   重新构建服务
ps                      列出容器
up                      创建和启动容器
exec                    在容器里面执行命令
scale                   指定一个服务容器启动数量
top                     显示容器进程
logs                    查看容器输出
down                    删除容器、网络、数据卷和镜像
stop/start/restart      停止/启动/重启服务

12 Docker Compose 文件结构

三 docker Compose部署nginx 镜像

把之前的容器删除,避免冲突——docker   rm   -f   `docker   ps    -aq`

删除network自定义的,会冲突报错——docker   network   rm  -f   ID号

(1)准备依赖文件

(2)编写nginx页面 

[root@docker opt]# cd nginx/
[root@docker nginx]# ls
Dockerfile  nginx-1.22.0.tar.gz  run.sh
[root@docker nginx]# vim Dockerfile 
[root@docker nginx]# ls
Dockerfile  nginx-1.22.0.tar.gz  run.sh
[root@zbx-proxy wwwroot]# pwd
/opt/compose_nginx/wwwroot
[root@zbx-proxy wwwroot]# echo "<h1>this is nginx web</h1>" > /opt/compose_nginx/wwwroot/index.html
[root@docker wwwroot]# cat index.html 
<h1>this is test nginx</h1>

[root@docker ~]# cd /opt/docker-compose_nginx/
[root@docker docker-compose_nginx]# ls
wwwroot

(3)创建网页目录和文件

[root@zbx-proxy nginx]# vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <mcb>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.25.0.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.25.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make -j4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

(4)编写配置文件docker-compose.yml  

 [root@docker docker-compose_nginx]# vim docker-compose.yml

nginx:
    container_name: web01
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
     - 200:80
     - 201:443
    networks:
      mcb:
        ipv4_address: 172.18.0.13
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  mcb:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

(5)启动docker-compose.yul文件

[root@docker docker-compose_nginx]# docker-compose  -f docker-compose.yml up -d

[root@localhost compose_nginx]# docker-compose -f docker-compose.yaml up -d
# -f, --file FILE:使用特定的compose模板文件,默认为 docker-compose.yaml
# -p, --project-name NAME:指定项目名称,默认使用目录名称
# -d:在后台运行

 (6)访问检测:

 四 docker Compose 编写nginx+tomcat镜像

1 编写docker-compose.yul文件

version: '3'
services:
  nginx:
    container_name: web01
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
     - 200:80
     - 201:443
    networks:
      mcb:
    volumes:
      - ./wwwroot:/usr/local/nginx/html
tomcat:
    hostname: tomcat
    build:
      context: ./tomcat
dockerfile: Dockerfile
    ports:
      - 8080:8080
    networks:
      tm:
       ipv4_address: 172.18.0.18
networks:
  mcb:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

2 写tomcat容器的dokerfile文件 

[root@zbx-proxy compose_nginx]# vim Dockerfile 

FROM centos:7
MAINTAINER tomcat image <mcb>
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_291 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
EXPOSE 8080
#CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]

3 删除镜像 

 

4 删除network 

5 创建并运行 

总结

consul 部署

1 准备consul服务器(consul服务、Nginx服务、consul-template守护进程)和registrator服务器(registrator容器、Nginx服务)

2 consul服务器部署

解压安装包(.zip);设置代理,在后台启动 consul 服务端

3 registrator服务器部署

安装 Gliderlabs/Registrator;测试

启动consul后默认会监听5个端口:

8300:replication、leader farwarding的端口

8301:lan cossip的端口

8302:wan gossip的端口

8500:web ui界面的端口

8600:使用dns协议查看节点信息的端口

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值