七、使用Docker Compose部署Apps

使用Docker Compose可以部署多容器的应用程序。Docker Compose 和 Docker Stacks很相似。本章节,我们主要聚焦于Docker Compose,可在运行在单引擎模式的Docker节点上部署和管理多容器应用程序。下一章节的 Docker Stacks,可在运行在集群模式的Docker节点上部署和管理多容器应用程序。

现代应用程序由多个相互交互的多个小服务组成,以形成一个有用的app,我们称之为微服务。一个app也许由以下四个服务组成:web前端、订购、分类、后端数据库。

部署和管理许多服务可能是很困难。这正是Docker Compose发挥作用的地方

作为用替换用脚本和Docker命令将所有东西粘在一起,Docker Compose允许在单个声明性配置文件中描述整个应用程序。然后用一个单一的命令部署它。
一旦部署应用程序后,就可以使用一组简单的命令来管理它的整个生命周期。

一、安装Compose

在很多平台上都可以使用Docker Compose,本节主要关注Windows和Linux。

(1)在Windows 10上安装Compose

在Windows 10 上运行Docker的推荐方式是Docker for Windows(DfW),Docker Compose是标准DfW安装的一部分,因此一般安装了DfW,你就可以运行Docker Compose。可以使用命令:docker-compose --version,将会显示Docker Compose的版本。

(2)在Linux上安装Docker Compose

在Linux上安装Docker Compose需要两步。首先,使用curl命令下载二进制;其次,使用chmod使得二进制可执行。如下所示:

  1. curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-' uname -s'-'uname -m' -o /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose

二、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个顶层关键词:

  • version
  • services
  • networks
  • volumes

其他的顶层关键词也存在,比如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提供了如下指令:

  • build: . ,告诉Docker使用当前目录(.)中的Dockerfile文件中的指令构建一个新的镜像,新构建的镜像将用作 创建服务的容器;
  •  command: python app.py :告诉Docker运行一个叫app.py的Python应用程序,作为容器内的主应用程序。镜像必须包含app.py和Python。Dockerfile兼顾这些需求;
  • ports: 告诉Docker映射容器内(-target)的端口5000到主机上(published)的端口5000。这意味着发送到主机端口5000的流量将会定向到容器内的端口5000,容器内监听端口5000。
  • networks: 告诉Docker哪个网络将附着到服务容器上。这个网络应该已经存在或者定义在顶层的networks关键字中。
  • volumes: 告诉Docker挂载counter-vol volume (source:) to /code (‘target:’) [容器内]. counter-vol volume 需要已经存在或者定义在顶层的volumes 关键字中。

总之,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网络,因此能彼此通信。

三、用Compose部署app

本节,我们将会部署在前一个小节定义在Compose文件中的app,需要从github上下载程序,包含四个文件:Dockerfile、app.py、requirements.txt、docker-compose.yml。如下图所示:

4945ab230652ab995bd4657f6018bbbb1b8.jpg

  • app.py:应用程序代码;
  • docker-compose.yml :Docker Compose文件,描述了Docker应该如何部署app;
  • Dockerfile:描述了如何从web-fe服务构建镜像;
  • requirements.txt:列出了app所需要的Python包。

在counter-app目录下输入:docker-compose up & (&:表示在前端启动,可以再终端观看输出结果),如下图所示(省略掉了一些中间输出结果):

3478642fc5118831dca5271c7d018fdd42b.jpg

be86152d7e4cd8ac37c7cb221b31899b4ab.jpg

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命令显示如下:

6e5485e07d11d9cf801e199bfd411619c9d.jpg

其中python镜像是Dockerfile文件中所使用的镜像,counter-app_web-fe是用Compose文件构建的镜像,redis镜像是从Docker Hub仓库拉取的。

注意:Compose使用项目名和声明在Compose文件中的资源名的组合在命名新构建的镜像,两者之间使用下划线(_)连接。所有被Compose部署的资源都遵循这个命名规范。

使用命令:docker container ls,查看容器,Compose文件创建了两个容器,如下图:

ecc8805aaa88f168066dd7c86c6e462d671.jpg

在浏览器输入地址,出现如下界面,应用程序部署成功。

3e2ee8b828336d6d2d59a2be3b7afe77e43.jpg

四、用Compose管理app

本小节,将学习如何启动、停止、删除和获取由Docker Compose管理的应用程序的状态。同时我们还将了解我们使用的容量,如何用于直接向应用程序的Web前端注入更新。

down命令:docker-compose down #执行此命令后,删除了Compose文件创建的容器,而不删除镜像

25dd84a61061c2a37d48abaeb29433ddce0.jpg

up命令:docker-compose up -d

查看app状态:docker-compose ps

查看运行在每一个容器内的进程:docker-compose top

fbd7ceafdf4309f946c998f3fecc992ec80.jpg

2d65b02e06d7d3c535d5ebc14f6c3ade2b3.jpg

其中:PID是从Docker主机中看的PID,而不是从容器内看到的。
stop命令:docker-compose stop  #仅停止而不删除容器和镜像

restart命令:docker-compose restart

0025866faa8cd8119fe79db04411c4d2cf4.jpg

在Compose文件中,我们定义了一个volume,叫counter-vol,Compose使用项目名和volume名称来命名最终的volume。

b19a83bf26b0eda5a161c6c74cc93aa641d.jpg

如上图所示,查看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目录,如下图所示:

0e9d19b1a03b7087d871fb8842279e797c8.jpg

拷贝完成后,连接应用程序,查看变化,即可查看到修改后的变化。

转载于:https://my.oschina.net/niweiwei/blog/3064948

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值