TL;DR 本文使用 Docker Compose 创建和管理多个容器应用程序。这完全是亲力亲为。

Docker 使在可重现的环境中开发和打包应用程序变得更加容易。使用 Docker,您不必担心本地机器和生产环境的基础设施,而更多地担心您的代码。虽然是一款不错的产品,但有时在构建时您可能希望使用 Docker 运行应用程序的不同部分。这意味着您将创建几个 Dockerfile 并管理它们。你自己_orchestrate_容器。这使得维护它们既忙碌又耗时。

Docker Compose 是一种用于运行代表应用程序不同部分的许多 Docker 容器的工具。要使用 Compose 定义和配置服务(应用程序),您可以使用 YAML 文件。该工具创建、启动和停止这些作为 Docker 容器运行的服务。 Docker Compose 非常适合微服务和持续集成管道的快速原型设计。

开始之前

1、通过官方链接安装Docker。确保遵循本地计算机的说明。

2.使用官方链接安装docker-compose。

  1. Docker 和的基本理解 容器搭便车指南:一个万无一失的 Docker 上手教程涵盖了这一点。

示例应用程序

让我们看一个带有 MYSQL 配置的 docker-compose 文件,命名为docker-compose.yml

services:
  mysql:
    image: "mysql:8.0"
    container_name: mysql
    restart: always
    ports:
      - "3300:3306"
    volumes:
      - dbdata:/var/lib/mysql/data
    environment:
      - MYSQL_DATABASE=database
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password1212
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
volumes:
  dbdata:

解释

上面的 YAML 文件有一些需要注意的地方。

  • 创建了一个名为mysql的_service_,它依赖于 Docker Hub 上的mysql:8.0发布的镜像。

  • 本地端口_3300_映射到容器端口3306,可以从3300端口评估MySQL容器。

  • 重启策略设置为总是重启一个退出的容器。

  • 我们定义了一个 docker 卷,它确保数据是持久的,所以我们在容器关闭后保留我们的数据。这很重要,因为 Docker 数据是 ephemeral 的。

  • 还定义了环境变量来调整MySQL实例的配置(登录详情)。

网页交互

Flask 微框架用于与数据库交互。要创建它,请按照以下说明进行操作。

  • 创建一个名为python的文件夹并将目录更改到其中。

  • 创建一个名为app.py的文件,它与 MYSQL 容器连接并处理输入

from flask import Flask, render_template, request
import mysql.connector
import json

app = Flask(__name__)


config = {
    'host': 'mysql',
    'user': 'user',
    'password': 'password1212',
    'port': '3306',
    'database': 'data',
    'auth_plugin':'mysql_native_password'
}

connection = mysql.connector.connect(**config)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == "POST":
        details = request.form
        firstName = details['fname']
        lastName = details['lname']
        cur = connection.cursor()
        cur.execute("INSERT INTO MyUsers(firstName, lastName) \
        VALUES (%s, %s)", (firstName, lastName))
        mysql.connection.commit()
        cur.close()
        return 'success'
    return render_template('index.html')
  • 创建一个文件requirements.txt,其中包含 python 文件的依赖项。
Flask==1.1.2
mysql-connector-python==8.0.21
  • 创建一个名为index.html的 HTML 页面,它接受来自用户的输入。
<HTML>
    <BODY bgcolor="cyan">
    <form method="POST" action="">
        <center>
        <H1>Enter your details </H1> <br>
        First Name <input type = "text" name= "fname" /> <br>
        Last Name <input type = "text" name = "lname" /> <br>
        <input type = "submit">
        </center>
    </form>
    </BODY>
</HTML>
  • 用上面的文件创建一个Dockerfile来构建一个python镜像,Dockerfile的内容如下
FROM python:3.6-alpine3.11

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

EXPOSE 5000

ENTRYPOINT [ "python", "app.py" ]
  • 离开python文件夹,通过创建数据库和表来初始化MYSQL实例。为此,创建一个名为init.sql的文件并填写以下内容
CREATE DATABASE data;
use data;

CREATE TABLE MyUsers (
    firstName VARCHAR(20),
    lastName VARCHAR(20),
);
  • 最后,编辑docker-compose.yml文件并连接所有部分。
version: "3"
services:
  mysql:
    image: "mysql:8.0"
    container_name: mysql
    restart: always
    ports:
      - "3300:3306"
    volumes:
      - dbdata:/docker-entrypoint-initdb.d/:ro
    environment:
      - MYSQL_DATABASE=data
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password1212
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
  app:
    container_name: "flask_app"
    restart: always
    links:
      - mysql
    build:
      context: python
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
volumes:
  dbdata:
  • build 将 docker 指向文件夹(上下文)python并从文件夹中的 Dockerfile 构建 docker 映像。

  • volume 被编辑以使用我们的init.sql文件初始化 MYSQL 容器。

该项目应具有以下结构:

├── docker-compose.yml
├── init.sql
└── python
    ├── app.py
    ├── Dockerfile
    ├── index.html
    └── requirements.txt

下图显示了 docker-compose 文件的框图。

docker-compose.yml.png

执行

要执行上述代码块,请在终端上运行docker-compose up并访问localhost:5000上的 HTML。

结论

我们已经了解了 Docker Compose 的工作原理以及一些基本解释。注意事项:

  1. Docker 管理单个容器,而 Docker Compose 管理多个容器应用程序。

  2. Docker Compose 适用于开发、测试和暂存环境,但在生产环境中,最好使用 Kubernetes 或 Docker Swarm。

  3. 环境变量和机密永远不会在生产环境中检查到源代码控制中。请改用.env文件

词汇表

短暂的:持续很短的时间。这意味着没有卷,在 docker 中生成的数据是不稳定的,并且会在容器终止(重启或重建)时丢失。

编排:容器编排是基于多个集群中的微服务为应用程序管理或调度单个容器的工作的自动过程。

服务:服务是定义我们应用程序使用的所有容器的部分。

3300:连接的默认端口应该是端口 3306,但是为了更容易理解本地端口和容器端口在文件中的位置,使用 3300。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐