docker compose将所有管理的容器分为三层,分为工程(project),服务(service)以及容器(container),docker compose运行目录下的所有文件(docker -compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,docker compose并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡,比如consul。
创建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);
若容器状态为运行其无配置改变则不做操作;
根据每个服务不同的动作执行不同的操作;
根据拓扑排序的次序,依次执行每个服务的动作。如果服务动作为创建:
如果服务动作为重建:
如果服务动作为启动则启动停止的容器。
YAML是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数 据结构、各种配置文件等。
YAML的配置文件后缀为.yml。
(1)用于全局的配置文件 ( ini / yaml ):环境,数据库信息,账号信息,日志格式,报告名称。
(2)用于接口自动化里面的多一些复杂的多接口串联。
(3)用于编写接口测试用例
在运维这里主要是用于全局的配置文件。
对象: 键值对的字典
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',
]
}
| 字段 | 描述 |
|---|---|
| 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 |
| 字段 | 描述 |
|---|---|
| build | 重新构建服务 |
| ps | 列出容器 |
| up | 创建和启动容器 |
| exec | 在容器里面执行命令 |
| scale | 指定一个服务容器启动数量 |
| top | 显示正在运行的容器进程 |
| logs | 查看服务容器的输出 |
| down | 删除容器、网络、数据卷和镜像 |
| stop/start/restart | 停止/启动/重启服务 |
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
第一步:编辑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


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)]