目录
- 安装配置 Docker Compose
- 方法一:
- 方法二:
- 进行服务编排
- 使用手动方式部署应用
- 1、使用 Python 创建 Web 应用(创建文件“app.py”),文件内容如下:
- 2、创建 “requirements.txt” 文件,由于在应用中使用了 Flask 和 Redis,因此在文件中输入以下内容:
- 3、创建 “Dockerfile” 文件,并输入以下内容。
- 4、使用 “docker build” 命令编译 Dockerfile 文件。
- 5、由于应用中需要Redis 的支持,所以先启动一个 Redis 容器。
- 6、使用 “docker run” 命令启动 Web 应用,并使用 --link 参数连接到 Redis 容器。
- 7、打开浏览器访问宿主机的 5000 端口并刷新网页,便可以观察到计数器的自增效果,如图所示:
- 使用 Docker Compose 部署应用
- 1、在当前目录下创建 “docker-compose.yml” 文件,输入以下内容。
- 2、通过 “docker-compose up ” 命令启动应用。
- 3、打开浏览器访问宿主机的 5000 端口。这时可以观察到与上一节一样的效果。
- 4、执行 “docker-compose ps” 命令查看此时启动的容器信息。
- 5、执行 “docker-compose images” 命令可以
- 使用 Docker Compose 进行服务的在线扩容/缩容
- 1、扩容
- 2、缩容
- Docker Compose 中的网络
- Docker Compose 中的默认网络环境
- 在 Docker Compose 中自定义模块的网络环境
在使用 Docker 部署应用时,可以通过定义 Dockerfile 文件来完成对应用服务的描述,之后使用 “docker build” “docker run” 等命令操作容器。
但是,随着应用架构的不断复杂和微服务的应用,通常在一个系统中需要包含多个模块,而一般情况下这些模块都会被部署到不同的 Docker 容器中。如果每一个模块都通过手动方式来完成部署,则效率是非常低的,且也不利于系统的维护和扩展。
使用 Docker Compose 可以非常方便地定义和运行复杂应用,他是 Docker 提供的一个服务编排工具。Docker Compose 不是通过 shell 脚本命令,而是通过 YML 描述文件来完成对 Docker 容器的管理。
安装配置 Docker Compose
Docker Compose 依赖 Docker 的引擎来完成服务的编排,因此,在安装配置 Docker Compose 之前需要先安装好 Docker 引擎。
方法一:
登录官网地址下载指定版本,官网地址
方法二:
使用软件包方式安装
sudo apt search docker-compose
sudo apt install docker-compose
sudo docker-compose --version
进行服务编排
Docker Compose 通过 YML 文件来管理一个复杂系统中的多个容器。在该文件中,所有的容器都是通过 Service 来定义的。Docker Compose 使用 docker-compose 脚本来完成服务的启动、停止、管理和扩容等。因此,Docker Compose 非常适合使用多个容器来应对复杂的应用场景。
使用手动方式部署应用
使用手动方式部署应用,需要创建 Dockerfile 文件来描述应用。下面是具体操作步骤。
1、使用 Python 创建 Web 应用(创建文件“app.py”),文件内容如下:
from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
其中,
• 第 01 行,基于轻量级 Web 框架 Flask 来使用 python 语言快速实现一个网站或者 Web 服务。
• 第 02 行,使用python Redis 模块在 Python Web 模块中访问 Redis 数据库,将用户在 Web 界面上的刷新次数保存到 Redis 中。
• 第 06行,指定 Redis 数据库的地址信息,这里指定了运行 Redis 的主机名和端口号。
• 第 11 行,通过变量 “redis” 访问 Redis 数据库完成计数功能。
• 第 12行,是Web 界面上显示的内容,即用户刷新 Web 网页的次数。
2、创建 “requirements.txt” 文件,由于在应用中使用了 Flask 和 Redis,因此在文件中输入以下内容:
flask
redis
3、创建 “Dockerfile” 文件,并输入以下内容。
FROM python
ADD . /code
WORKDIR /code
COPY app.py /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]
4、使用 “docker build” 命令编译 Dockerfile 文件。
sudo docker build -t myapplication .
5、由于应用中需要Redis 的支持,所以先启动一个 Redis 容器。
sudo docker run --name myredis -d -p 6379:6379 redis
6、使用 “docker run” 命令启动 Web 应用,并使用 --link 参数连接到 Redis 容器。
sudo docker run --name myapp_using_redis -p 5000:5000 --link myredis:redis -d myapplication
7、打开浏览器访问宿主机的 5000 端口并刷新网页,便可以观察到计数器的自增效果,如图所示:
使用 Docker Compose 部署应用
在上一节中,使用手动的方式完成了应用的部署和启动,实现了计数器的自增功能。在该应用中只包含了两个模块。
随着系统架构的不断复杂和模块的不断增多,这样的手动方式会变得越来越不方便。并且,如果要实现扩容/缩容等操作,则手动方式无法很好的解决这样的问题。
而使用 Docker Compose 则可以非常方便地解决这样的问题,其核心是定义一个 YML 文件来对即将部署的应用进行描述。此时的目录结构如下。
下面演示如何使用 Docker Compose 。
1、在当前目录下创建 “docker-compose.yml” 文件,输入以下内容。
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis"
其中:
• 从第02行开始,定义了该应用中所有包含的模块。这里定义应用包含两个模块——第03行的web 模块和第07行的 redis 模块。
• 第03-06行,定义了 web 模块。通过使用 build 命令在当前目录下编译 Dockerfile 文件,将生成的镜像保存到本地;并且在启动容器时,将宿主机的 5000 端口映射到容器的 5000 端口。
• 第 07 和 08 行定义了 redis 模块。通过参数 “image” 指定在启动容器时使用 “redis” 镜像。如果本地没有该镜像,则从镜像仓库中拉取该镜像。
2、通过 “docker-compose up ” 命令启动应用。
sudo docker-compose up -d
3、打开浏览器访问宿主机的 5000 端口。这时可以观察到与上一节一样的效果。
4、执行 “docker-compose ps” 命令查看此时启动的容器信息。
5、执行 “docker-compose images” 命令可以
使用 Docker Compose 进行服务的在线扩容/缩容
使用 Docker Compose 可以非常方便地实现服务的在线扩容/缩容。
1、扩容
以上一节中部署的引用为例,来演示如何使用 “docker-compose scale” 命令完成对服务的在线扩容/缩容。
执行下面的命令将服务中的 redis 模块扩展到3个容器中。
sudo docker-compose scale redis=3
sudo docker-compose ps
如图所示:这时 Docker Compose 启动了 3 个容器来运行 redis 模块,从而实现了负载均衡功能,以达到分摊请求压力的目的。
2、缩容
sudo docker-compose scale redis=2
sudo docker-compose ps
Docker Compose 中的网络
在 Docker Compose 中提供了默认的网络环境,也可以在 docker-compose.yml 文集自定义网络环境。
Docker Compose 中的默认网络环境
以上一节定义的 docker-compose.yml 文件为例,在执行 “docker-compose up” 命令启动应用时,会对 Docker Compose 网络环境执行以下的操作:
(1)使用 bridge 模式创建一个名为 “compose_default” 网络,如图所示:
(2)使用 web 模块的配置信息创建一个容器,并使用 “web” 作为容器的主机名加入 “compose_default” 网络。
(3)使用 redis 模块的配置信息创建一个容器,并使用 “redis” 作为容器的主机名加入 “compose_default” 网络。
完成上述步骤后,运行应用的所有容器,便可以通过主机名 “web” 和 “redis” 实现在 “compose_default” 网络环境中的容器相互访问了。例如,Python Web 应用 app.py 中的第 06 行代码,通过主机名 “redis” 访问 redis 模块。
由于 Docker Compose 会使用 docker-compose.yml 文件中模块的名字作为容器的主机名,因此,在 docker-compose.yml 文件中模块的名字必须唯一。
如果想在 Docker Compose 中覆盖默认的网络配置,则可以在 docker-compose.yml 文件中通过指定参数 “networks” 的值来实现,如以下代码所示:
在 Docker Compose 中自定义模块的网络环境
Docker Compose 除提供默认的网络环境外,也允许用户自定义各个模块的网络环境,这样用户可以实现更加复杂的网络。每一个模块也可以通过参数 “networks” 连接到网络环境中。
以下 docker-compose.yml 是 Docker 官网提供的一个示例。
在这个文件中一共包含 3 个模块:proxy、app 和 db。其中,proxy 和 db 模块属于不同的网络环境,即 proxy 模块属于 “frontend” 网络,而 db 属于 “backend” 网络。这两个网络彼此隔离,不能进行相互访问。但是,在 app 模块中通过参数networks 指定了 “frontend” 网络和 “backend” 网络,即 app 模块及可以访问 proxy 模块,也可以访问 db 模块。