Docker 入门到实战教程(十三)Docker Compose
文章目录
- 一. Docker Compose 概述与使用
- 二. 安装 Docker Compose
- 三. 使用Docker Compose
- 四. 更新Docker Compose
- 五. 更新应用程序测试
一. Docker Compose 概述与使用
1.1 概述
- Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务
- 我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定 义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某 项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后 端的数据库服务容器,甚至还包括负载均衡容器等。Compose 恰好满足了这样的需求。它允许用户通过一个单独的
docker-compose.yml
模板文件 (YAML 格式)来定义一组相关联的应用容器为一个项目(project)。有了Compose,我们就不需要再一个个组件去写一份Dockerfile,只需要将整体环境同一起来,写在一份docker-compose.yml文件即可
1.2 使用步骤
使用Compose基本上是一个三步过程:
- 使用定义您的应用环境,Dockerfile以便可以在任何地方复制。
- 定义组成应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行。 - 运行
docker-compose up
Compose启动并运行您的整个应用程序。
一个docker-compose.yml
看起来像这样:
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
有关Compose
文件的更多信息,请参见 Compose
文件参考。
https://docs.docker.com/compose/compose-file
Compose
具有用于管理应用程序整个生命周期的命令:
- 启动,停止和重建服务
- 查看正在运行的服务的状态
- 运行服务的日志输出
- 在服务上运行一次性命令
1.3 Docker-Compose使用命令
创建并启动容器
docker-compose up
创建并后台启动容器
docker-compose up -d
查看当前compose进程
docker-compose ps
启动容器
docker-compose start
关闭容器
docker-compose stop # 关闭容器
关闭并移除容器
docker-compose down # 关闭并移除容器
查看日志
docker-compose logs
关闭并移除容器并删除容器清除存储
docker-compose down --volumes
二. 安装 Docker Compose
两种最新的docker安装方式
- 下载docker-compose二进制文件安装
- pip安装(将 Compose 当作一个 Python 应用来从 pip 源中安装)
2.1. 下载docker-compose二进制文件安装
运行以下命令以下载Docker Compose的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
file
使用官方github下载很慢,采用换源
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
file
- 要安装其他版本的Compose,请替换1.25.4 为要使用的Compose版本。
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
查看版本:
docker-compose --version
file
2.2. pip安装
udo pip install docker-compose
2.3. 卸载
二进制包方式安装的,删除二进制文件即可
sudo rm /usr/local/bin/docker-compose
pip 安装的,则执行如下命令即可删除
sudo pip uninstall docker-compose
三. 使用Docker Compose
上面说到使用的三个步骤
这里构建一个运行在Docker Compose
上的简单Python Web
应用程序。该应用程序使用Flask
框架,并在Redis中维护一个计数器。尽管该示例使用Python
,但即使您不熟悉此处演示的概念,也应可以理解。
3.1 项目创建目录
mkdir composetest
cd composetest
file
3.2 项目目录中创建一个名为app.py
的文件
将以下内容粘贴
touch app.py
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)
在此示例中,redis是应用程序网络上的redis容器的主机名。我们为Redis使用默认端口6379
3.3 在项目目录中创建一个名为requirements.txt
的文件
内容如下:
touch requirements.txt
内容如下:
flask
redis
file
3.4 创建Dockerfile
在此步骤中,编写一个构建Docker映像的Dockerfile。该图像包含Python应用程序所需的所有依赖关系,包括Python本身。
粘贴以下内容:
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && apk add -U tzdata && ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo "${TIMEZONE}" > /etc/timezone
RUN apk add -U tzdata && ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo "${TIMEZONE}" > /etc/timezone
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
- 从Python 3.7映像开始构建映像
- 将工作目录设置为/code
- 设置flask命令使用的环境变量
- 修改源为了快速下载 -安装gcc,以便诸如MarkupSafe和SQLAlchemy之类的Python包可以编译加速
- 复制requirements.txt并安装Python依赖项
- 将.项目中的当前目录复制到.映像中的工作目录
- 将容器的默认命令设置为flask run。
3.5 在compose中定义服务
在项目目录中创建一个名为docker-compose.yml
的文件,然后粘贴以下内容:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:latest"
该Compose文件定义了两个服务:web
和redis
网络服务
该web服务使用从Dockerfile当前目录中构建的映像。然后,它将容器和主机绑定到暴露的端口5000。此示例服务使用Flask Web服务器的默认端口5000。
Redis服务
该redis服务使用从Docker Hub注册表中提取的公共Redis映像,如果存在最新版则不拉取
注: compose 版本对应关系
https://docs.docker.com/compose/compose-file/compose-file-v2/
3.6 生成和运行与撰写你的应用程序
在项目目录中,运行来启动应用程序
docker-compose up
完成以后可以通过浏览器确认结果
打开浏览器输入: http://ip:5000/
应该在浏览器中看到一条消息,内容为:
Hello World! I have been seen 1 times.
file
3.7 关闭并移除该应用
通过docker-compose down
从第二个终端的项目目录中运行,或在启动该应用的原始终端中按CTRL + C来停止该应用
file
四. 更新Docker Compose
4.1 重新构建docker-compose.yml
文件
将宿主机包含代码的目录挂载到服务,本质就是容器实例与宿主机共享文件。
内容如下:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:latest"
volumes
将主机上的项目目录(当前目录)/code安装到容器内部,可以即时修改代码,而不必重建映像。该environment键设置了 FLASK_ENV环境变量,该变量指示flask run要在开发模式下运行并在更改时重新加载代码。此模式仅应在开发中使用。
4.2 重新构建并运行应用程序
在项目目录中,键入docker-compose up以使用更新的Compose文件构建应用程序,然后运行它
docker-compose up -d
file
查看进程
docker-compose ps
file
查看日志
docker-compose logs
file
查看单个服务日志
docker-compose logs web
file
再次打开浏览器输入: http://ip:5000/
Hello World再次出现,然后刷新以查看计数增量
file
五. 更新应用程序测试
因为现在应用程序代码是使用卷安装到容器中的,所以您可以对其代码进行更改并立即查看更改,而无需重建映像。
更改问候语app.py
并保存。例如,将Hello World!
消息更改为Hello from Dong!
:
file
再次打开浏览器输入: http://ip:5000/
在浏览器中刷新应用。问候语应更新,并且计数器应仍在增加。
file
参考链接:
http://suo.im/6xZyQs
http://suo.im/6qxxYv
- 崔立鹏:腾讯云为知识竞技游戏提供解决方案
- Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
- 常用的AJAX弹出层代码
- Linux下检测IP地址冲突及解决方法
- linux如何挂载windows下的共享文件
- silverlight2中的定时器,以及如何动态改变控件的坐标
- 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
- jQuery1.3以上版本"@"的问题
- 龚宏绩:三七互娱游戏上云的现状与未来
- Android 程序打包及签名
- 韩伟:解谜腾讯游戏海量服务架构
- Message和handler传递对象
- MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
- 结构struct(值类型)在实际应用要注意的二点:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Egg.js试水 - 文章增删改查【前后端分离】
- Flutter基础widgets教程-Offstage篇
- 一份礼物.apk - o泡果奶-的逆向分析
- 代码审计-.NET下的序列化与反序列化(BinaryFormatter)
- 02.视频播放器整体结构
- Spring中@Component和@Bean
- HTTP对接方式
- 使用ShardingSphere 过程中遇到的关于spring boot 版本的问题
- 腾讯云TKE-Pod案例: 容器内crontab问题
- iOS音视频接入 - TRTC多人视频会议
- Spring系列 SpringMVC的请求与数据响应
- codeforces 1349A(数学)
- leetcode之找不同
- 太强了,这居然是19年双非本科开发一年的Android面筋!开发几年的老程序员自叹不如
- Kotlin Vocabulary | Reified: 类型擦除后再生计划