文章目录
Docker Compose工具
一、Docker compose简介
docker compose将所有管理的容器分为三层,分为工程(project),服务(service)以及容器(container),docker compose运行目录下的所有文件(docker -compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,docker compose并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡,比如consul。
二、docker compose工作流程
创建docker-compose工程的核心在于定义配置文件,配hi在文件默认名称dokcer-compose.yml,也可以用其他名称,但需要修改环境变量COMPOSE_FILE或者启动时通过-f参数指定配置文件。配置我呢见定义了多个由依赖关系的服务以及每个服务运行的容器,docer启动一个工程主要经历如下步骤:
-
工程初始化-解析配置文件(包括docker-compose.yml,外包配置文件extends files,环境变量配置文件env_file),并将每个服务的配置转换成python字典,初始化docker-py客户端用于与docker engine通信。
-
根据docker compose的命令参数将命令分发给相应的处理函数,齐总启动命令为up;
-
调用project类的up函数,得到当前工程中的所有服务,并根据服务的依赖关系进行拓扑排序并去掉重复出现的服务;
-
通过工程名以及服务名从docker engine获取当前工程中处于运行中容器,从而确定当前工程中各个服务的状态,再根据当前状态为每个服务定制接下来的动作。docker compose使用labels标记启动的容器,使用docker inspect可以看到通过docker compose启动的容器都被添加了标记。
-
若容器不存在,则服务动作设置为创建(create);
-
若容器存在但设置不允许重建,则服务动作设置为启动(start);
-
若容器配置发送变化(config-hash)或者设置强制重建标记,则服务动作设置为重建(recreate);
-
若容器状态为停止,则服务动作设置为启动(start);
-
若容器状态为运行但依赖容器需要重建,则服务状态设置为重建(recreate);
-
若容器状态为运行其无配置改变则不做操作;
-
根据每个服务不同的动作执行不同的操作;
-
-
根据拓扑排序的次序,依次执行每个服务的动作。如果服务动作为创建:
- 检测镜像是否存在,若镜像不存在,则检查配置文件中关于镜像的定义。如果再配置文件中设置为build则调用docker-py build函数与docker engine通信完成docker build的功能。如果在配置文件中配置为image则通过docker-py pull函数与docker engine通信完成docker pull的功能。
- 获取当前服务中容器的配置信息,如端口,存储卷,主机名,使用镜像环境变量等配置的信息。若在配置中指定本服务必须与某个服务在同一台主机中则在环境变量中设置affinity:container=。通过docker-py与docker engine通信创建并启动容器。
-
如果服务动作为重建:
- 停止当前的容器;
- 将现有的容器重命名,这样数据卷在原容器被删除前就可以拷贝到新建的容器中了;
- 创建并启动新容器,previsous_container设置为原容器确保其运行在同一台主机(存储卷挂载);
- 删除旧容器。
-
如果服务动作为启动则启动停止的容器。
三、YAML文件格式以及编写注意事项
什么是YAML?
YAML是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数 据结构、各种配置文件等。
YAML的配置文件后缀为.yml。
YAML的作用(能干什么)?
(1)用于全局的配置文件 ( ini / yaml ):环境,数据库信息,账号信息,日志格式,报告名称。
(2)用于接口自动化里面的多一些复杂的多接口串联。
(3)用于编写接口测试用例
在运维这里主要是用于全局的配置文件。
1、YAML文件格式
- YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。
- 类似于 json数据描述语言,语法比 json简单的很多。
- YAML 数据结构通过缩进来表示,连续的项目通过“-”号来表示,键值对用冒号分隔。
- YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
- 数据结构采用键值对的形式,即 键名称: 值,注意冒号后面要有空格。
- 每个清单(数组)成员以单行表示,并用短杠+空白(- )起始。或使用方括号([]),并用逗号+空白(, )分开 成员。
- 每个散列表的成员用冒号+空白(: )分开键值和内容。或使用大括号({ }),并用逗号+空白(, )分开。
- 字符串值一般不使用引号,必要时可使用,使用双引号表示字符串时,会转义字符串中的特殊字符(例如\n)。使用单引号时不会转义字符串中的特殊字符。
- 大小写敏感 使用缩进表示层级关系,缩进不允许使用tab,只允许空格,因为有可能在不同系统下tab长度不一样
- 缩进的空格数可以任意,只要相同层级的元素左对齐即可
- 在单一文件中,可用连续三个连字号(—)区分多个文件。还有选择性的连续三个点号(…)用来表示文件结尾。
- '#'表示注释,可以出现在一行中的任何位置,单行注释
- 在使用逗号及冒号时,后面都必须接一个空白字符,所以可以在字符串或数值中自由加入分隔符号(例如:5,280或http://www.wikipedia.org)而不需要使用引号。
- 不支持制表符tab键缩进,只能使用空格缩进。
- 通常开头缩进2个空格
- 字符后缩进1个空格,如冒号:、都好,、横杠-。
- 布尔值必须用引号“”括起来
2、YAML数据结构
对象: 键值对的字典
animal: pets
数组: 一组按次序排列的列表
- cat
- dog
- goldfish
布尔值
debug: "true"
debug: "false"
#Yaml示例
languages: #序列的映射
- Java
- Golang
- Python
websites: #映射的映射
Baidu: www.baidu.com
Wangyi: www.163.com
Souhu: www.souhu.com
#或者
languages: ["Java","Golong","Python"]
websites:
Baidu:
www.baidu.com
Wangyi:
www.163.com
Souhu:
www.souhu.com
#Json格式
{
languages: [
'Java',
'Golong',
'Python',
],
websites: [
Baidu: 'www.baidu.com',
Wangyi: 'www.163.com',
Souhu: 'www.souhu.com',
]
}
四、Docker compose配置常用字段
字段 | 描述 |
---|---|
build | 指定Dockerfile文件名(要指定的Dockerfile文件需要在build标签的子级标签中用dockerfile标签指定) |
dockerfile | 构建镜像上下文路径 |
context | 可以是dockerfile路径,或者是执行git 仓库的url地址 |
image | 指定镜像(已存在) |
command | 执行命令,会覆盖容器启动后默认执行的命令(会覆盖Dockerfile的CMD指令) |
container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量 |
deploy | 指定部署和运行服务相关配置,只能在Swarm模式使用 |
environment | 添加环境变量 |
container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量 |
deploy | 指定部署和运行服务相关配置,只能在Swarm模式使用 |
environment | 添加环境变量 |
volumes | 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级volumes 定义卷名称 |
volumes_from | 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,(仅版本‘2’支持) |
hostname | hostname |
hostname | 在容器内设置内核参数 |
links | 连接到另一个容器,- 服务名称[ : ] |
privileged | 用来给容器root权限,注意是不安全的,true |
restart | 重启策略,定义是否重启容器;1.no,默认策略,在容器退出时不重启容器。2.on-failure,在容器非正常退出时(退出状态非0),才会重启容器。3.on-failure:3,在容器非正常退出时重启容器,最多重启3次。4.always,在容器退出时总是重启容器。5.unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。 |
depends_on | 此标签用于解决容器的依赖,启动先后问题。如启动应用容器,需要先启动数据库容器php:depends_on:- apache- mysql |
五、Docker compose 常用命令
字段 | 描述 |
---|---|
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示正在运行的容器进程 |
logs | 查看服务容器的输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
六、compose部署
Docker-Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose。
//安装docker compose工具
yum install docker-ce -y
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
cp -p docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
yum install -y tree
1、使用compose编排安装运行nginx容器
第一步:编辑nginx的dockerfile
cd /opt/docker
mkdir compose-nginx
cd compose-nginx
mkdir nginx
cd nginx
==拖入安装包nginx-1.12.2.tar.gz==
vim Dockerfile
FROM centos:7
MAINTAINER this is nginx images by shimeng
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local
WORKDIR /usr/local/nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
RUN echo -e "#!/bin/bash \n /usr/local/nginx/sbin/nginx" > /run.sh
RUN chmod +x /run.sh
EXPOSE 80
CMD ["/run.sh"]
//第二步,编写docker-compose.yml文件
version: '3'
services:
nginx:
container_name: web1
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1998:80
networks:
lnmp:
ipv4_address: 172.18.0.80
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
//启动docker compose管理
docker-compose -f docker-compose.yml up -d
//查看容器和compose
docker ps
docker-compose ps
2、在compose中添加一个tomcat容器与nginx容器一起编排
mkdir /opt/docker/compose-nginx/tomcat
==拖入安装包apache-tomcat-9.0.16.tar.gz、jdk-8u201-linux-x64.rpm==
vim Dockerfile
FROM centos:7 as build //这里的build表示如果centos:7镜像不存在则进行新建该进行(pull获取)
MAINTAINER create this is image by shimeng
ADD jdk-8u201-linux-x64.rpm /usr/local
WORKDIR /usr/local/
RUN rpm -ivh jdk-8u201-linux-x64.rpm
ENV JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
ENV CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
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"]
//编写docker-compose.yml文件
version: '3'
services:
nginx:
container_name: web1
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1998:80
networks:
lnmp:
ipv4_address: 172.18.0.80
volumes:
- ./wwwroot:/usr/local/nginx/html
tomcat:
container_name: web2
hostname: tomcat
build:
context: ./tomcat
dockerfile: Dockerfile
ports:
- 1999:8080
networks:
lnmp:
ipv4_address: 172.18.0.88
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
//启动docker compose管理
docker-compose -f docker-compose.yml up -d
//查看容器和compose
docker ps
docker-compose ps
docker-compse top
ubnet: 172.18.0.0/16
//启动docker compose管理
docker-compose -f docker-compose.yml up -d
//查看容器和compose
docker ps
docker-compose ps
docker-compse top
[外链图片转存中...(img-yZOlGePn-1663501670502)]
[外链图片转存中...(img-6Kwmkuan-1663501670502)]
[外链图片转存中...(img-SRqUY6Eg-1663501670503)]
[外链图片转存中...(img-EG7v0FZc-1663501670503)]