Docker基础学习(10)-Docker compose容器编排

Docker-compose容器编排

Docker compose是一个容器编排工具,用于批量部署容器

三种Docker-compose的安装方式

任选其一

(1)二进制包

下载二进制文件到bin目录,授予执行权限

github项目地址:https://github.com/docker/compose/releases

目前最新版1.25.0,下载Linux-x86_64版本(也可使用uname命令来指定)

$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 
$ sudo chmod a+x /usr/local/bin/docker-compose
(2)容器中执行

每次执行docker-compose命令都是执行一个脚本run.sh运行一个由 docker/compose:$VERSION镜像构建的容器(容器内的docker-compose是python应用)来执行命令。

docker-compose->run.sh->docker run

github项目地址同上

$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/run.sh > /usr/local/bin/docker-compose 
$ sudo chmod a+x /usr/local/bin/docker-compose

这两种方式的卸载只需删除/usr/local/bin/docker-compose即可

(3)pip安装

将compose当作python应用从 PyPI 源中安装

[root@docker1 ~]# curl -o /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker1 ~]# yum --enablerepo=epel install python-pip python-devel gcc -y
[root@docker1 ~]# pip install -i https://mirrors.aliyun.com/pypi/simple -U pip six
#-i, --index-url <url>指定安装源,使用阿里的。-U,--upgrade
[root@docker1 ~]# pip install -i https://mirrors.aliyun.com/pypi/simple docker-compose

需要卸载的话

pip uninstall docker-compose 
.yml 文件语法
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
  • 值可以不用"或’包裹,但是含有特殊字符时需要使用,如值中包含:,(所以端口映射要用用引号)

yaml也有用来描述好几行相同结构数据的缩写语法,数组用“[]”包括起来,hash用“{}”来包括

更多参见http://www.yaml.org

1、 构建基本web-db容器集群

创建工作目录

mkdir web-db&&cd web-db

Dockerfile

FROM centos:7
MAINTAINER kdl<3049941765@qq.com>
RUN yum install httpd -y && \
sed -i -e 's/DirectoryIndex index.html/DirectoryIndex index.html index.php/g' \
-e '285a\AddType application/x-httpd-php-source .phps' \
-e '285a\AddType application/x-httpd-php .php' /etc/httpd/conf/httpd.conf
EXPOSE 80
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]

image-20200515142805384

docker-compose.yml

version: '3'
#key和value间有空格
services:
#构建db容器
#将主机/var/lib/docker/disk01目录映射到/var/lib/mysql目录
#添加变量MYSQL_ROOT_PASSWORD、MYSQL_USER、MYSQL_PASSWORD、MYSQL_DATABASE
#主机端口3306映射容器3306
  db:
    image: mysql:8.0 
    volumes:
     - /var/lib/docker/disk01:/var/lib/mysql
    environment:
       MYSQL_ROOT_PASSWORD: 123456
       MYSQL_USER: kdl
       MYSQL_PASSWORD: 123456
       MYSQL_DATABASE: kdl_db
    #简写environment: {MYSQL_ROOT_PASSWORD: 123456,MYSQL_USER: kdl,MYSQL_PASSWORD: 123456,MYSQL_DATABASE: kdl_db}注意{左边也有空格
    ports:
     - "3306:3306"
     #-后面有空格

#构建web容器
#自动利用Dockerfile构建镜像然后使用
#将主机/var/lib/docker/disk02目录映射到/var/www/html目录
#主机端口8080映射容器80
  web:
    build: .
    #Dockerfile的路径,可以是绝对路径或相对于docker-compose.yml的路径
    ports:
     - "8080:80"
    volumes:
     - /var/lib/docker/disk02:/var/www/html

image-20200515142926686

目录结构

# tree
.
├── docker-compose.yml
└── Dockerfile

0 directories, 2 files

开始构建

docker-compose up -d

image-20200515142703837

测试

image-20200515145309993

image-20200515145339426

docker exec -it web-db_db_1 mysql -ukdl -p123456 -e "show databases"

image-20200515145541271

echo "this is web-db_db_1" > /var/lib/docker/disk02/index.html
curl localhost:8080

image-20200515152645525

(以下未完成,需要配置php环境)

既然是集群,那就让web服务器访问数据库,写一个php脚本来测试,刚才在Dockerfile中已经修改默认起始(索引)页面。

rm -f /var/lib/docker/disk02/index.html && vi /var/lib/docker/disk02/index.php

index.php

<table border='1'>
<tr><th>book</th><th>price</th></tr>
<?php
    $con = mysql_connect(getenv("MYSQL_ADDR"),getenv("MYSQL_USER"),getenv("MYSQL_PASS"));  
    //设置字符集
    mysql_query($con,"SET NAMES 'utf8'");
    mysql_query($con,"SET CHARACTER SET utf8");
    if(!$con){
        die(mysql_error());
    }
    //连接数据库
    mysql_select_db("kdl_db",$con);
        //查询数据表中的数据
         $sql = mysql_query("select * from book");
         $datarow = mysql_num_rows($sql); //长度
            //循环遍历出数据表中的数据
            for($i=0;$i<$datarow;$i++){
                $sql_arr = mysql_fetch_assoc($sql);
                $name = $sql_arr['name'];
                $price = $sql_arr['price'];
               echo "<tr><td>$name</td><td>$years</td></tr>";
                }
        mysql_close($con);  
?>
</table>

数据库准备

[root@docker1 web-db]# docker exec -it web-db_db_1 bash
root@ad1731f6e4e1:/# mysql -ukdl -p123456
mysql> use kdl_db;
mysql> create table book( name char(10),price int(10));
mysql> insert into book(name,price) values('math',20),('engish',10);

web服务器中设定数据库访问环境变量

docker exec -it web-db_web_1 bash 
export MYSQL_ADDR=192.168.200.200
export MYSQL_USER=kdl
export MYSQL_PASSWORD=123456 

其它:停止和删除

[root@docker1 web-db]# docker-compose stop
Stopping web-db_db_1  ... done
Stopping web-db_web_1 ... done
[root@docker1 web-db]# docker-compose rm  
Going to remove web-db_db_1, web-db_web_1
Are you sure? [yN] y
Removing web-db_db_1  ... done
Removing web-db_web_1 ... done
2、 构建haproxy-web集群

目录结构

[root@docker1 haweb]# tree .
.
├── docker-compose.yml
└── haproxy
    └── haproxy.cfg

1 directory, 2 files

haproxy.cfg

global
    log         127.0.0.1 local0
    daemon
    nbproc              1
defaults
    mode                    http
    retries                 3
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout check           10s
frontend  www
    bind *:80
    mode http
    option httplog
    option forwardfor
    option httpclose
    log global
    default_backend             web
backend web
    mode http
    option redispatch
    option abortonclose
    balance roundrobin
    cookie SERVERID
    option httpchk GET /
    server  weba weba:80
    server  webb webb:80
    server  webc webc:80
listen admin_stats
        bind *:70
        mode http
        stats uri /
        stats realm welcome login\ Haproxy
        stats auth kdl:123456
        stats hide-version
        stats admin if TRUE

docker-compose.yml

version: '3'
services:
  weba:
    image: web-db_web:latest
    volumes:
     - /var/lib/docker/disk02:/var/www/html
  webb:
    image: web-db_web:latest
    volumes:
     - /var/lib/docker/disk02:/var/www/html
  webc:
    image: web-db_web:latest
    volumes:
     - /var/lib/docker/disk02:/var/www/html
  haproxy:
    image: haproxy:2.1
    volumes:
     - ./haproxy:/haproxy-override
     - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    links:
     - weba
     - webb
     - webc
    ports:
     - "8888:80"
     - "70:70"

开始构建

docker-compose up -d

image-20200515180125606

image-20200515180210807

轮询模式的负载均衡,多执行几次curl localhost:8888会看到访问weba、webb、webc的次数变化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9shErAs-1599788139254)(http://39.99.247.228/2020-5-15/.assets/image-20200515180309080.png)]

3、构建Spark大数据集群

docker-compose.yml

version: '3'
services:
  master:
    image: sequenceiq/spark:1.6.0
    hostname: master
    ports:
     - "4040:4040"
     - "8042:8042"
     - "8088:8088"
     - "8080:8080"
    restart: always
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 1024M
        reservations:
          cpus: '0.25'
          memory: 256M
    command: bash /usr/local/spark/sbin/start-master.sh && ping localhost > /dev/null
  worker:
    image: sequenceiq/spark:1.6.0
    links:
     - master:master
    expose:
     - "8081"
    restart: always
    command: bash /usr/local/spark/sbin/start-slave.sh spark://master:7077 && ping localhost > /dev/null
  1. 测试
docker-compose scale worker=2
  1. 计算pi值
docker exec -it spark_master_1 bash/usr/local/spark/bin/spark-submit --master spark://master:7077 --conf "spark.eventLog.enabled=true" --class org.apache.spark.examples.SparkPi
/usr/local/spark/lib/spark-examples-1.6.0-hadoop2.6.0.jar 1000

执行中会遇到一些/tmp文件夹下不存在文件的错误

其它
1.第一次运行docker-compose up -d遇到错误

iptables:No chain/target/match by that name

image-20200515141615895

查看iptables是空的image-20200515141927583

重启docker即可(设了自启动但是docker起了,网络没起。原因是 禁止了firewalld自启,docker网络要保证firewalld运行,需要nat转发功能

image-20200515142324295

2.yml语法 描述好几行相同结构数据的缩写语法

数组用“[]”包括起来,hash用“{}”来包括

试了好多次得出的总结:没有短横的用{},有短横的用[]

environment:
       MYSQL_ROOT_PASSWORD: 123456
       MYSQL_USER: kdl
       MYSQL_PASSWORD: 123456
       MYSQL_DATABASE: kdl_db

简写

environment: {MYSQL_ROOT_PASSWORD: 123456,MYSQL_USER: kdl,MYSQL_PASSWORD: 123456,MYSQL_DATABASE: kdl_db}
volumes:
     - ./haproxy:/haproxy-override
     - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    links:
     - weba
     - webb
     - webc
    ports:
     - "8888:80"
     - "70:70"

简写

    volumes: [./haproxy:/haproxy-override,./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro]
    links: [weba,webb,webc]
    ports: ["8888:80","70:70"]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值