Docker Compose使用实例
Docker Compose 是 Docker 官方推出的一个用于定义和运行多个 Docker 容器的工具。它使用 YAML 文件来配置多个容器之间的关系和依赖,并且可以通过简单的命令来启动、停止和重新构建这些容器。
本文将以一个简单的web应用为例,使用 Docker Compose 来管理容器的部署和运行。通过这个示例,你将了解到 Docker Compose 的基本用法和常用命令。
准备工作
在开始之前,我们需要安装 Docker 和 Docker Compose。
安装 Docker
首先,我们需要安装 Docker。请根据你的操作系统类型,选择对应的安装方式。你可以在 Docker 官方网站上找到相应的安装指南。安装完成后,通过运行以下命令来验证安装是否成功:
docker version
如果安装成功,你将看到 Docker 客户端和服务器的版本信息。
安装 Docker Compose
接下来,我们需要安装 Docker Compose。你可以在 Docker Compose 的官方 GitHub 页面上找到安装指南。根据你的操作系统类型,选择对应的安装方式进行安装。安装完成后,通过运行以下命令来验证安装是否成功:
docker-compose version
如果安装成功,你将看到 Docker Compose 的版本信息。
创建示例应用
我们的示例应用是一个简单的 web 服务,由两个容器组成:一个用于运行 web 服务器的容器,一个用于运行数据库的容器。我们使用 Python 和 Flask 来实现 web 服务器,使用 MySQL 来作为数据库。
创建项目目录
首先,我们需要创建一个项目目录,用于存放应用的所有文件。在终端中运行以下命令:
mkdir myapp
cd myapp
创建 Dockerfile
在项目目录中,我们创建一个名为 Dockerfile 的文件,用于构建 web 服务器容器。Dockerfile 是一个文本文件,包含了一系列的指令,告诉 Docker 如何构建一个镜像。以下是一个简单的 Dockerfile 示例:
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "app.py" ]
上述 Dockerfile 文件的内容解释如下:
FROM
指令指定了一个基础镜像,本示例中使用的是 Python 3.8 的 slim-buster 版本。WORKDIR
指令设置了容器的工作目录。COPY
指令将本地的 requirements.txt 文件复制到容器中。RUN
指令执行了 pip install 命令,安装了 requirements.txt 中指定的所有依赖。COPY
指令将当前目录中的所有文件都复制到容器中。CMD
指令定义了容器启动时要执行的命令。
创建 requirements.txt
在项目目录中,我们创建一个名为 requirements.txt 的文件,用于指定应用的依赖。在本示例中,我们只需要 Flask 和 pymysql 两个依赖。requirements.txt 的内容如下:
Flask==2.0.1
pymysql==1.0.2
创建 app.py
在项目目录中,我们创建一个名为 app.py 的文件,用于实现 web 服务器。以下是一个简单的示例:
from flask import Flask
from flask import jsonify
import pymysql
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
@app.route('/')
def hello():
return 'Hello, Docker Compose!'
@app.route('/users')
def get_users():
conn = pymysql.connect(host='db', user='root', password='password', db='mydb')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
users = cursor.fetchall()
cursor.close()
conn.close()
return jsonify(users)
if __name__ == '__main__':
app.run(host='0.0.0.0')
上述 app.py 文件使用 Flask 构建了一个简单的 web 服务器,并提供了两个路由。/
路由返回一个简单的欢迎消息,`/users