使用 Docker Compose 部署应用
Docker Compose 的背景
现在的应用都是由众多不同的小服务组成的,为解决部署和管理多个服务问题困难,才出现了Docker Compose
Docker Compose 他不是一串很长的docker命令来将应用组合起来,而是通过一个声明是的配置文件来描述一个应用,使用一条命令完成应用部署。
Docker Compose 可以通过命令行的工具进行应用部署,和应用生命周期的管理。
Docker Compose 内部实现
1: Docker Compose 是一个基于Docker的python外部工具,要自己下载
2: Docker Compose 会解析yaml文件, 并通过Docker 引擎API 进行应用的部署
在 Linux 上安装 Docker Compose
1:下载二进制文件
wget https://labfile.oss-cn-hangzhou.aliyuncs.com/courses/980/software/docker-compose-Linux-x86_64
2:添加 可执行权限
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证
docker-compose --help
Compose 文件
YAML文件是json文件组合,所以 也可以使用json文件
Docker Compose 默认使用的文件名称是 docker-compose.yaml
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 个一级 key:version、services、networks、volumes
version
是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式(主要是 API)的版本。建议使用最新版本。
注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。如果希望了解关于 Docker 引擎、Docker Compose 以及 Compose 文件之间的版本兼容性信息,请搜索“Compose file versions and upgrading”。
Compose 文件使用的是 v3.5 版本的格式,定义了两个服务,一个名为 counter-net 的网络和一个名为 counter-vol 的卷。
services
有两个服务:web-fe ,redis
Docker Compose 会为俩个不同的二级key,分别创建容器,并使用key作为容器名称的一部分。
build:. 指定 Docker 基于当前目录下 Dockerfile 中定义的指令来构建一个新镜像。该镜像会被用于启动该服务的容器。
command:python app.py 指定 Docker 在容器中执行名为 app.py 的 Python 脚本作为主程序。因此镜像中必须包含 app.py 文件以及 Python,这一点在 Dockerfile 中可以得到满足。
ports:指定 Docker 将容器内 target 的 5000 端口映射到主机 published 的 5000 端口。这意味着发送到 Docker 主机 5000 端口的流量会被转发到容器的 5000 端口对应的应用上。容器中的应用监听端口 5000 。
networks:使得 Docker 可以将服务连接到指定的网络上。这个网络应该是已经存在的,或者是在 networks 一级 key 中定义的网络。对于 Overlay 网络来说,它还需要定义一个 attachable 标志,这样独立的容器才可以连接上它(这时 Docker Compose 会部署独立的容器而不是 Docker 服务)。
volumes:指定 Docker 将 counter-vol 卷也就是 source 的值挂载到容器内的 /code 目录下也就是 target 的值。counter-vol 卷应该是已存在的,或者是在文件下方的 volumes 一级 key 中定义的。
networks
用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不同的网络类型。
volumes
用于指引 Docker 来创建新的卷。
综上,Docker Compose 会调用 Docker 来为 web-fe 服务部署一个独立的容器。该容器基于与 Compose 文件位于同一目录下的 Dockerfile 构建的镜像。基于该镜像启动的容器会运行 app.py 作为其主程序,将 5000 端口暴露给宿主机,连接到 counter-net 网络上,并挂载一个卷到 /code 。
注:
从技术上讲,本例并不需要配置 command: python app.py 。因为镜像的 Dockerfile 已经将 python app.py 定义为了默认的启动程序。但是,本例主要是为了展示其如何执行,因此也可用于覆盖 Dockerfile 中配置的 CMD 指令。
redis 服务的定义相对比较简单。
image: ‘redis:alpine’ 使得 Docker 可以基于 redis:alpine 镜像启动一个独立的名为 redis 的容器。这个镜像会被从 Docker Hub 上拉取下来。
networks:配置 redis 容器连接到 counter-net 网络。
由于两个服务都连接到 counter-net 网络,因此它们可以通过名称解析到对方的地址。了解这一点很重要,本例中上层应用被配置为通过名称与 Redis 服务通信。
使用 Docker Compose 部署应用
准备工作
$ cd ~/Code
$ git clone https://github.com/nigelpoulton/counter-app
$ cd counter-app
$ ls
文件介绍如下:
app.py 是应用程序代码(一个 Python Flask 应用)。
docker-compose.yml 是 Compose 文件,其中定义了 Docker 如何部署应用。
Dockerfile 定义了如何构建 web-fe 服务所使用的镜像。
requirements.txt 列出了应用所依赖的 Python 包。
== & -d 后台启动==
docker-compose up &
docker-compose -f prod-equus-bass.yml up
-f 指定特定的yaml文件
$ docker-compose up -d
--OR--
$ docker-compose -f prod-equus-bass.yml up -d
读者可以用 Docker 主机的浏览器连接 5000 端口来查看应用的运行效果,
使用 Docker Compose 管理应用
接下来会介绍如何使用 Docker Compose 启动、停止和删除应用,以及获取应用状态。还会演示如何使用挂载的卷来实现对 Web 前端的更新
关闭
docker-compose down
查看进程
docker-compose ps
docker-compose top
停止
docker-compose stop
重启
docker-compose restart
查看卷
docker volume ls
终端执行
docker volume ls -q | xargs docker volume rm
命令清除全部 volume
总结
通过上面一个Docker compose例子 我们可以感觉到它在多服务组合应用部署和管理方面带来的巨大的优势!
通过它我们可以使用一条语句便完成了应用组合的事情十分方便!也方便多服务组合应用的管理和维护!
Docker Compose 部署和管理命令小结
docker-compose up 命令用于部署一个 Compose 应用。默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件,当然用户也可以使用 -f 指定其他文件名。通常情况下,会使用-d 参数令应用在后台启动。
docker-compose stop 命令会停止 Compose 应用相关的所有容器,但不会删除它们。被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。
docker-compose rm 命令用于删除已停止的 Compose 应用。它会删除容器和网络,但是不会删除卷和镜像。
docker-compose restart 命令会重启已停止的 Compose 应用。如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。
docker-compose ps 命令用于列出 Compose 应用中的各个容器。输出内容包括当前状态、容器运行的命令以及网络端口。
docker-compose down 会停止并删除运行中的 Compose 应用。它会删除容器和网络,但是不会删除卷和镜像。