使用Docker Compose能够部署多容器的应用程序。Docker Compose 和 Docker Stacks很类似。本章节,咱们主要聚焦于Docker Compose,可在运行在单引擎模式的Docker节点上部署和管理多容器应用程序。下一章节的 Docker Stacks,可在运行在集群模式的Docker节点上部署和管理多容器应用程序。前端
现代应用程序由多个相互交互的多个小服务组成,以造成一个有用的app,咱们称之为微服务。一个app也许由如下四个服务组成:web前端、订购、分类、后端数据库。python
部署和管理许多服务多是很困难。这正是Docker Compose发挥做用的地方git
做为用替换用脚本和Docker命令将全部东西粘在一块儿,Docker Compose容许在单个声明性配置文件中描述整个应用程序。而后用一个单一的命令部署它。
一旦部署应用程序后,就可使用一组简单的命令来管理它的整个生命周期。github
1、安装Composeweb
在不少平台上均可以使用Docker Compose,本节主要关注Windows和Linux。redis
(1)在Windows 10上安装Composedocker
在Windows 10 上运行Docker的推荐方式是Docker for Windows(DfW),Docker Compose是标准DfW安装的一部分,所以通常安装了DfW,你就能够运行Docker Compose。可使用命令:docker-compose --version,将会显示Docker Compose的版本。数据库
(2)在Linux上安装Docker Composevim
在Linux上安装Docker Compose须要两步。首先,使用curl命令下载二进制;其次,使用chmod使得二进制可执行。以下所示:后端
2、Compose文件
Compose 使用YAML文件定义多服务应用程序。YAML是JSON的子集。缺省的Compose YAML文件的名字是docker-compose.yml,也可使用-f标志来指定自定义的文件名。
接下来的例子显示了一个很是简单的Compose文件,定义了一个具备两个服务(web-fe and redis)的小Flask服务 。这个app是一个简单的web服务器,统计访问次数并把值存在Redis中。咱们称之为counter-app,在接下来的章节中将它做为示例应用程序。Docker Compose文件内容以下:
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:
上述文件有4个顶层关键词:
其余的顶层关键词也存在,好比secrets 和configs,但咱们暂时不关注。
version关键词是强制的,它老是文件根目录的第一行,它定义了Compose文件格式(基本上是API)的版本,一般使用 最新版本。
须要注意的是version关键字并不定义Docker Compose或者Docker引擎的版本。更多关于Docker Engine, Docker Compose,和the Compose文件格式版本之间的兼容性,请搜索“Compose file versions and upgrading”。在本章节的剩余部分将使用version 3或者更高版本。
顶层services关键字定义不用应用程序的服务,在本例子中定义了两个服务:web-fe和redis。Compose将会在他们各自的容器内部署每个服务。
networks关键字告诉Docker建立新的网络,确实状况下,Compose将会建立桥接网络,这是单主机网络,仅链接在相同主机上的容器。然而,你也可使用driver属性来指定不一样的网络类型。例如:
networks: over-net: driver: overlay attachable: true
顶层volumes关键字告诉Docker建立新的volumes。
上述文件中的services节有两个第二层级的关键字:web-fe和redis。每个都定义了一个应用程序中的服务。Compose将他们每个部署为 一个容器,并使用keys名称做为容器名称,理解这点很重要。在咱们的例子中,定义了两个关键字:web-fe和redis,这意味着Compose将部署两个容器,一个命名为:web-fe,另外一个命名为redis。
在web-fe服务的定义内,咱们向Docker提供了以下指令:
总之,Compose将会指导Docker为web-fe部署一个单个独立的容器。将基于从Dockerfile文件中构建的镜像(Dockerfile和Compose文件 在同一目录下),镜像将会启动一个 容器,并运行app.py做为主应用程序。它将会把本身暴露给主机上的5000端口。附着在counter-net网络,并挂载一个volume到/code。
在redis服务的定义内,咱们向Docker提供了以下指令:
image: redis:alpine 告诉Docker基于redis:alpine镜像启动一个叫作redis的容器。此镜像将会从Docker Hub拉取;
• networks: redis容器将会附着在counter-net 网络。
以上两个服务都部署在相同的counter-net网络,所以能彼此通讯。
3、用Compose部署app
本节,咱们将会部署在前一个小节定义在Compose文件中的app,须要从github上下载程序,包含四个文件:Dockerfile、app.py、requirements.txt、docker-compose.yml。以下图所示:
在counter-app目录下输入:docker-compose up & (&:表示在前端启动,能够再终端观看输出结果),以下图所示(省略掉了一些中间输出结果):
docker-compose up是运行Compose app最经常使用的方式,它构建所须要的镜像,建立网络和volumes,启动所须要的容器。缺省状况下,docker-compose up指望的Compose文件是docker-compose.yml或docker-compose.yaml,若是须要一个不一样的名称,则须要使用-f标志,如:docker-compose -f prod-equus-bass.yml up。也可使用-d,使其在后台运行,如docker-compose -f prod-equus-bass.yml up -d。
使用docker image ls命令显示以下:
其中python镜像是Dockerfile文件中所使用的镜像,counter-app_web-fe是用Compose文件构建的镜像,redis镜像是从Docker Hub仓库拉取的。
注意:Compose使用项目名和声明在Compose文件中的资源名的组合在命名新构建的镜像,二者之间使用下划线(_)链接。全部被Compose部署的资源都遵循这个命名规范。
使用命令:docker container ls,查看容器,Compose文件建立了两个容器,以下图:
在浏览器输入地址,出现以下界面,应用程序部署成功。
4、用Compose管理app
本小节,将学习如何启动、中止、删除和获取由Docker Compose管理的应用程序的状态。同时咱们还将了解咱们使用的容量,如何用于直接向应用程序的Web前端注入更新。
down命令:docker-compose down #执行此命令后,删除了Compose文件建立的容器,而不删除镜像
up命令:docker-compose up -d
查看app状态:docker-compose ps
查看运行在每个容器内的进程:docker-compose top
其中:PID是从Docker主机中看的PID,而不是从容器内看到的。
stop命令:docker-compose stop #仅中止而不删除容器和镜像
restart命令:docker-compose restart
在Compose文件中,咱们定义了一个volume,叫counter-vol,Compose使用项目名和volume名称来命名最终的volume。
如上图所示,查看docker-compose.yml文件中的web-fe服务,能够看到,它正在将counter-app volume挂载进服务的容器内。最终结果是,咱们的app代码驻留在Docker的volume中。这意味着,从主机侧,咱们能够更改volume中的文件。
在counter-app目录下,使用vim或其余编辑软件打开app.py文件,在22行,修改“What's up......"这一行的代码,能够随意修改。修改完成后,咱们须要将修改后的代码拷贝到Docker主机上的volume内。每个Docker volume都暴露在Docker主机文件系统中的某一个位置,使用docker volume inspect命令能够查看具体位置,而后将修改后的文件拷贝到volume目录,以下图所示:
拷贝完成后,链接应用程序,查看变化,便可查看到修改后的变化。