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"]
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
目录结构
# tree
.
├── docker-compose.yml
└── Dockerfile
0 directories, 2 files
开始构建
docker-compose up -d
测试
docker exec -it web-db_db_1 mysql -ukdl -p123456 -e "show databases"
echo "this is web-db_db_1" > /var/lib/docker/disk02/index.html
curl localhost:8080
(以下未完成,需要配置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
轮询模式的负载均衡,多执行几次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
- 测试
docker-compose scale worker=2
- 计算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
查看iptables是空的
重启docker即可(设了自启动但是docker起了,网络没起。原因是 禁止了firewalld自启,docker网络要保证firewalld运行,需要nat转发功能
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"]