Docker Compose 简介
Compose 是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。
使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
Compose 的使用方式非常简单,基本上就是下面的三板斧:
- 定义 Dockerfile
- 定义 docker-compose.yml
- 运行 docker-compose up
其实 compose 提供的命令可以管理应用的整个生命周期:
- Start, stop, rebuild services
- 查看运行中 service 的状态
- 输出运行中 service 的日志
- 在 service 中执行一次性的命令
本文我们通过一个简单的 demo 来介绍 Docker Compose 的基本用法。说明:本文的演示环境为 ubuntu 16.04。本文的演示代码可以从 github 上下载。
安装 Docker Compose
安装 Docker Compose 前请先在本地安装 Docker。
Docker Compose 的安装十分简单,在 ubuntu 中直接把可执行文件下载到本地就可以了。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
其中 1.22.0 是最新的版本。当然 Docker Compose 是个开源项目,你可以选择安装不同的版本,或者是自行编译。下图为笔者安装之后显示的版本信息:
注意,默认的安装并不包括命令补全功能,也就是说像 docker-compose restart 这样的命令,你输入 docker-compose re 后按 tab 键是无法自动补全的。想要这个功能还需要额外的安装,以 Bash 为例,执行下面的命令:
$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.22.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
然后重新登录 Bash,就可以通过 tab 键自动补全命令了!
创建演示 demo
下面的示例来自 docker 官网,就是一个简单的 Flask 网页应用,后端使用 redis 存储数据,其 web server 的代码如下(可以从这里下载到本文中的代码):
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
代码非常简单,就是对请求计数并显示给用户。为了增加健壮性,在访问 redis 时做了一点处理:尝试访问 5 次再报错。把上面的代码保存到文件 app.py 中。
要运行上面的代码,需要在环境中安装 flask 和 redis 包。创建 requirements.txt 文件,编辑其内容为:
flask
redis
创建一个保存项目文件的目录,比如 composecounter,把 app.py 和 requirements.txt 文件都放进去。
创建 Dockerfile 文件
接下来我们需要把上面的应用打包到容器镜像中。在 composecounter 目录下创建 Dockerfile 文件:
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
上面代码的含义为:
- 使用 python:3.4-alpine 作为基础镜像
- 把当前目录添加到镜像中的 /code 目录
- 设置容器中的工作目录为 /code
- 安装 requirements.txt 文件中指定的依赖包
- 把容器启动时的默认命令设置为 python app.py
创建 compose 配置文件
终于来到本文的重点了!我们需要创建 Docker Compose 的配置文件来定义我们的应用。
YAML 是一个可读性高,用来表达数据序列的格式。Docker Compose 使用 YAML 格式的文件作为配置文件。
在 composecounter 目录中创建 docker-compose.yml 文件,其内容如下:
version: ''
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
第一行的 version: '3' 表示当前的配置文件使用的语法版本。
services 中的内容指明该应用一共定义了多少个服务(容器镜像)。在运行时,一个服务是指从该镜像启动的一个或多个容器。
在我们的示例中一共需要两个容器镜像。web 服务由我们自己通过 build . 命令构建,映射的端口是 flask web server 默认的 5000 端口。
redis 服务则直接使用官方的镜像。
构建并运行示例程序
在 composecounter 目录下执行命令:
$ docker-compose up
跳过那些繁琐的输出,我们直接访问本机的 5000 端口:
一个 web 应用程序运行起来了,并且输出了我们访问服务器端的次数,看起来还不错!
如果要让容器安静的运行在后台,加上 -d 选项就可以了:
$ docker-compose up -d
背后的事情
分析 docker-compose up 命令的输出可以看清事情的真相,但是日志过于繁琐,我们只说重点:
- 创建名称为 composecounter_default 的网络
- 使用 Dockerfile 构建 composecounter_web 镜像
- 创建容器 composecounter_redis_1 和 composecounter_web_1 并加入相同的网络
如果你手动去执行这些操作还是挺很繁琐的,现在一个命令就搞定了,还可以把相关的代码和配置统统的用版本管理工具管理起来。
总结
虽然示例程序能够运行起来了,但我们只是来到了一个新的起点。Docker Compose 被设计来管理应用的整个生命周期,我们也可以用它来极大的提高工作效率。笔者将在接下来的文章中介绍更多 Docker Compose 相关的内容。
参考:
Get started with Docker Compose
Docker Compose 简介的更多相关文章
- 25.docker compose 简介 和 docker-compose.yml 参数介绍
1. docker compose概念 文档 https://docs.docker.com/compose/compose-file/compose-versioning 一个基于 docker ...
- Docker & ASP.NET Core (5):Docker Compose
第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 Docker Compose简介 Compose是一个用来定义和运行多容器Docker应用的工具.使用C ...
- Docker 核心技术之Docker Compose
Docker Compose 简介 Docker Compose是什么? Docker Compose是一个能一次性定义和管理多个Docker容器的工具. 详细地说: Compose中定义和启动的每一 ...
- Docker Compose 之进阶篇
笔者在前文<Docker Compose 简介>和<Dcoker Compose 原理>两篇文章中分别介绍了 docker compose 的基本概念以及实现原理.本文我们将继 ...
- Docker Compose 原理
Docker 的优势非常明显,尤其是对于开发者来说,它提供了一种全新的软件发布机制.也就是说使用 docker 镜像作为软件产品的载体,使用 docker 容器提供独立的软件运行上下文环境,使用 do ...
- 通过 Docker Compose 组合 ASP NET Core 和 SQL Server
目录 Docker Compose 简介 安装 WebApi 项目 创建项目 编写Dockfile Web MVC 项目 创建项目 编写Dockfile 编写 docker-compose.yml文件 ...
- 1.Docker Compose
一.Docker Compose 简介 概述 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.从功能上看,跟 OpenStack 中的 Heat 十 ...
- 【Docker Compose】简介与安装
1.简介 Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置 ...
- Docker Compose安装以及入门
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用. Compose 简介 Compose 项目是 Docker 官方的开源 ...
随机推荐
- Selenium 实现 Web 自动化的原理 (软件测试52讲学习笔记)
Selenium 1.0 的工作原理 Selenium 1.0,又称Selenium RC ,RC是Remote Control的缩写.Selenium RC利用的原理:JavaScript代码可以方 ...
- java常用数据类型使用Day008
1,java常用数据类型使用 package cn.edu.fhj.day008; import java.util.ArrayList; import java.util.HashMap; impo ...
- Java_集合
定义: 是一种工具,就像是容器,能存储任意数量的具有共同属性的对象. 与数组比较优点: (1)数组定义后长度不可变,集合长度可变: (2)数组只能通过下标访问,且下标类型只能是数字型,而有的集合(ma ...
- 「深度剖析」程序员因为奇葩需求暴打pm,然后被双双开除
想必大家都听说了,这两天关于中国平安一个产品经理因奇葩需求和程序员爆发肢体冲突的事件在朋友圈被刷屏,更有现场打架视频在技术群里疯传. 在这里先带大家简单文字回顾下事情经过,N次打架视频和截图就不给大家 ...
- linux操作命令之帮助命令
一.man命令的帮助: man 命令名 获取指定命令的帮助 例如man ls 查看ls的帮助 man man可以看到man有8个级别的man帮助命令使用场景 1.查看命令的帮助 2.查看可被内核调用的 ...
- RabbitMQ in Action (1): Understanding messaging
1. Consumers and producers Producers create messages and publish (send) them to a broker server (Rab ...
- 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
- CoreProfiler升级到.NetStandard 2.0
致所有感兴趣的朋友: CoreProfiler和相应的Sample项目cross-app-profiling-demo都已经升级到.NetStandrard 2.0和.NetCore 2.0. 有任何 ...
- 体验一把做黑客的感觉-IPC$入侵之远程控制
前言 一看你就是看标题进来的,我可不是标题党啊,大家往下看吧,本文章主要介绍了利用IPC共享漏洞上传并执行木马. 基础知识 一.什么是IPC 进程间通信(IPC,Inter-Process Commu ...
- 多媒体文件格式(三):M3U8 格式
一.M3U8 格式标准介绍 M3U8文件是指UTF-8编码格式的M3U文件.M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播 ...