前言:
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
会重启容器。
3次。
考虑在 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协议查看节点信息的端口