一.Docker Compose
1.作用:
简单来说是快速部署需要多个容器联合配合的应用
通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。
2.本质是个工具:
Docker Compose是一个需要在Docker主机上进行安装的外部Python工具。
二.工作流程:
注:
Docker Compose使用YAML文件来定义多服务的应用。
Docker Compose默认使用文件名docker-compose.yml 。可以使用-f 参数指定具体文件。
-
首先编写定义多容器(多服务)应用的YAML文件
-
然后将其交由docker-compose命令处理
-
最后Docker Compose就会基于Docker引擎API完成应用的部署。
三.Compose文件
1.主干内容(一级Key)
**version:**总是位于文件的第一行,用来定义Compose文件格式(主要是API)的版本。
tip:version 并非定义Docker Compose或Docker引擎的版本号。
services:用于定义不同的应用服务,在他下面定义需要的应用服务(例如下面的就包裹了web-fe和redis两个)
- 这会将每个服务部署在各自的容器中
**networks:**用于指引Docker创建新的网络
-
默认情况下,Docker Compose会创建bridge 网络。
-
可以使用driver 属性来指定不同的网络类型(见下图)
创建一个名为over-net 的Overlay网络,允许独立的容器(非托管容器)(standalone container)连接(attachable )到该网络上。
networks: over-net: <---网络的名字 driver: overlay <---网络的类型 attachable: true <---暂时认为是让非托管容器连接到网络的设置
**volumes:**用于指引Docker来创建新的卷
2.细说Compose文件(二级Key)
1,Docker Compose会将每个服务部署为一个容器,并且会使用key作为容器名字的一部分
- key就是
services
下的二级标签,就是下面示例中的web-fe
和redis
- 因此Docker Compose会部署两个容器,一个容器的名字中会包含web-fe ,而另一个会包含redis 。
2,定义不同服务为同一网络名称,使它们连接到同一网络下,这样它们就可以通过名称解析到对方的地址,从而实现不同容器间的通信。(服务定义的网络都必须是已存在的,主干中设置好的)
-
细看下面的
web-fe
和redis
两个应用,它们的网络名称都定义为counter-net
,因此它们可以互相通信。networks: - counter-net
示例Compose文件:
定义了两个服务,一个名为counter-net 的网络和一个名为counter-vol 的卷。
version: "3.5"
services:
web-fe:
build: .
command: python app.py
ports:
- target: 5000
published: 5000
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: "redis:alpine"
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
3.细说服务定义
以web-fe服务定义为例
**build:**指定Docker基于当前目录(. )下Dockerfile中定义的指令来构建一个新镜像。该镜像会被用于启动该服务的容器。
**command:**指定Docker在容器中执行名为app.py 的Python脚本作为主程序。因此镜像中必须包含app.py文件以及Python,这一点在Dockerfile中可以得到满足。
**ports:**端口映射参数;指定Docker将容器内(-target )的5000端口映射到主机(published )的5000端口。
**networks:**使得Docker可以将服务连接到指定的网络上(指定网络必须是已存在的)
**volumes:**指定Docker将counter-vol 卷(source: )挂载到容器内的/code (target: )
综上,Docker Compose会调用Docker来为web-fe 服务部署一个独立的容器。该容器基于与Compose文件位于同一目录下的Dockerfile构建的镜像。基于该镜像启动的容器会运行app.py 作为其主程序,将5000端口暴露给宿主机,连接到counter-net 网络上,并挂载一个卷到/code 。
四.使用Docker Compose部署应用
- 通过Compose文件定义的多容器应用称为“Compose应用”
1.启动命令
启动docker-compose应用的命令:docker-compose up
-
默认情况下,会查找名为docker-compose.yml 或docker-compose.yaml 的Compose文件
-
如果Compose文件是其他文件名,则需要通过
-f
参数来指定。docker-compose -f demo.yml up
-
使用
-d
参数在后台启动应用也是常见的用法docker-compose up -d
-
使用
&
参数可以将所有的日志直接输出到终端窗口
2.容器为以目录名称为前缀
Docker Compose会使用目录名作为项目名称,每个容器的名称都以项目名称(所在目录名称)为前缀。此外,它们还都以一个数字为后缀用于标识容器实例序号——因为Docker Compose允许扩缩容
例如下面的输出(此compose应用以counter-app
为目录)
容器的名字:目录名 + 服务名 + 数字后缀
$ docker container ls
ID COMMAND STATUS PORTS NAMES
12.. "python app.py" Up 2 min 0.0.0.0:5000->5000/tcp counterapp_web-fe_1
57.. "docker-entry.." Up 2 min 6379/tcp counterapp_redis_1