文章目录
-
一. 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
使用官方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
-
要安装其他版本的Compose,请替换1.25.4 为要使用的Compose版本。
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
查看版本:
docker-compose --version
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
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
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.
3.7 关闭并移除该应用
通过docker-compose down
从第二个终端的项目目录中运行,或在启动该应用的原始终端中按CTRL + C来停止该应用
四. 更新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
查看进程
docker-compose ps
查看日志
docker-compose logs
查看单个服务日志
docker-compose logs web
再次打开浏览器输入: http://ip:5000/
Hello World再次出现,然后刷新以查看计数增量
五. 更新应用程序测试
因为现在应用程序代码是使用卷安装到容器中的,所以您可以对其代码进行更改并立即查看更改,而无需重建映像。
更改问候语app.py
并保存。例如,将Hello World!
消息更改为Hello from Dong!
:
再次打开浏览器输入: http://ip:5000/
在浏览器中刷新应用。问候语应更新,并且计数器应仍在增加。
参考链接:
http://suo.im/6xZyQs
http://suo.im/6qxxYv
往期推荐
????
Docker入门到实战教程(十)部署Spring Boot项目
Docker入门到实战教程(十一)部署Vue+SpringBoot 前后端分离项目
Docker入门到实战教程(十二)ELK+Filebeat搭建日志分析系统