Docker-Compose部署Flask+MySQL+OpenLDAP练习


目的:将Flask、MySQL、OpenLDAP分别装在三个容器中,使用docker-compose命令进行启动和关闭。

系统环境:Ubuntu20.04、Docker19.03.13、 Docker-Compose1.27.4

一、创建Docker-Compose部署目录

mkdir docker_compose_exercise

二、编写Flask应用

先进入到docker-compose部署目录

cd docker_compose_exercise

编写Flask代码app.py

from flask import Flask
import pymysql
from ldap3 import Server
from ldap3 import Connection

app = Flask(__name__)

@app.route('/')
def index():
    print('index')
    return 'index'

@app.route('/connect_mysql')
def connect_mysql():
    try:
        conn = pymysql.connect(host='mysql',user='root',password='123456',port=8888)
        print(conn)
          return 'connect_mysql_success'
    except:
      return 'connect_mysql_fail'

@app.route('/connect_ldap')
def connect_ldap():
    LDAP_SERVER_HOST = 'openldap'
    LDAP_SERVER_PORT = 389
    ADMIN_DN = 'cn=admin,dc=example,dc=com'
    ADMIN_PWD = '123456'
    # 查找user_dn
    server = Server(LDAP_SERVER_HOST, LDAP_SERVER_PORT)
    conn = Connection(server, ADMIN_DN, ADMIN_PWD)
    try:
        res = conn.bind()
        return 'connect_ldap_success'
    except:
      return 'connect_ldap_fail'

if __name__ == '__main__':
    app.run(debug=False,port=5000,host='0.0.0.0')

三、生成requirements.txt文件

requirements.txt放在部署目录里

pip freeze > requirements.txt

四、安装wait-for-it

github源码地址:https://github.com/vishnubob/wait-for-it

Ubuntu下安装:

apt-get install -y wait-for-it

关于wait-for-it具体的用法参考

五、编写Dockerfile文件

编写Dockerfile文件(为了打包Flask应用成镜像),放在部署目录里

vim Dockerfile

内容如下:

# 指定所创建镜像的基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER="xinglingyingxue"

# 编译镜像时运行的脚本
RUN apt-get update 

# 安装Python3环境,所有选项选y(注意:以后运行程序时要使用Python3而不是Python)
RUN apt-get install python3 -y
RUN apt-get install python3-pip -y

# 设置容器运行时的工作目录(后续的RUN、CMD COPY、ADD的工作目录)
WORKDIR /docker_compose_demo

# 将容器部署目录中的所有文件添加到容器运行时的工作目录
ADD . /docker_compose_demo

# 为容器运行时的脚本添加可执行权限(这个脚本后续是为了解决容器服务启动的顺序问题)
RUN chmod a+x wait-for-it.sh

# 安装依赖(注意:要使用pip3而不是pip)
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

# 声明镜像内服务监听的端口
EXPOSE 5000

六、打包Flask应用镜像

在部署目录中,执行如下命令

sudo docker build -t flask_demo:1.0 .

-t:添加镜像名称:标签名称

.:默认表示Dockerfile文件

-f:可以自定义Dockerfile文件名称

七、编写Docker-Compose文件

在部署目录中,创建容器数据卷同步目录(后续为了使用docker的volumes,当容器被删除时,保存容器中的数据和配置信息)

mkdir -p flask_data mysql_data/conf mysql_data/data  openldap_data/config openldap_data/data

在部署目录中,执行如下命令

vim docker-compose.yml

内容如下:

# docker-compose版本
version: '3'
# 容器服务
services:
  flask:
    # 本地打包的镜像
    image: "flask_demo:1.0"
    # 运行时的容器名称
    container_name: "flask_demo1.0"
    ports:
     - "5000:5000"
    # 容器启动顺序
    depends_on:
     - mysql
     - openldap
    # 容器间通信
    links:
     - mysql
     - openldap
    volumes:
     - "./flask_data:/docker_compose_demo/flask_data"
    # 当mysql容器服务启动后,再运行flask应用
    command: ["./wait-for-it.sh", "mysql:8888", "--", "python3", "app.py"]

  mysql:
    image: "mysql:5.7"
    container_name: "mysql5.7"
    ports:
     - "8888:3306"
    volumes:
     - "./mysql_data/conf:/etc/mysql/conf.d"(没有特殊配置的时候可以不用写这行)
     - "./mysql_data/data:/var/lib/mysql"(MySQL的数据文件,防止容器删除后数据丢失)
    # 设置mysql的root密码,默认账号为root
    environment:
     MYSQL_ROOT_PASSWORD: "123456"# MySQL的root密码「必填」

      #以下皆为选填
      - MYSQL_DATABASE=test_db  # 如指定,则在容器生成时创建该数据库
      - MYSQL_USER=test_user  # 新用户名
      - MYSQL_PASSWORD=test_passwd # 新用户的密码
      - MYSQL_ALLOW_EMPTY_PASSWORD=no # 不允许使用空密码
      - MYSQL_RANDOM_ROOT_PASSWORD=no # 不适用随机密码(为yes时会随机生成一个密码并输出)
      - MYSQL_ONETIME_PASSWORD=onetime_passwd # 一次性密码(使用时,第一次登录会强制要求修改密码)

  openldap:
    image: "osixia/openldap"
    container_name: "my_openldap"
    ports:
     - "389:389"
    volumes:
     - "./openldap_data./data:/var/lib/ldap"(openldap的数据文件,防止容器删除后数据丢失)
     - "./openldap_data./config:/etc/ldap/slapd.d"(没有特殊配置的时候可以不用写这行)
    environment:
     LDAP_ORGANISATION: "admin"
     LDAP_DOMAIN: "example.com"
     LDAP_ADMIN_PASSWORD: "123456"

八、Docker-Compose启动

在部署目录中,执行如下命令

sudo docker-compose up

可以看出设置了depends_on,mysql容器和openldap容器先启动,flask应用后启动

注意:depends_on只能设置容器的启动顺序,不能设置容器内的服务的启动顺序

我这里使用了wait-for-it.sh脚本来设置容器内的服务的启动顺序

 # 当mysql容器服务启动后,再运行flask应用
    command: ["./wait-for-it.sh", "mysql:8888", "--", "python3", "app.py"]

成功访问每个容器

PS:加上-d参数可以使容器后台运行

​ 只需要运行某个容器时,加上容器服务名即可,例:只启动mysql

sudo docker-compose up mysql

参考链接


文章作者: 星凌映雪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 星凌映雪 !
评论
 上一篇
Docker学习笔记 Docker学习笔记
一、Docker简介Docker是基于Go语言实现的云开源项目 Docker的主要目标是“Build, Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的AP
2021-02-24
下一篇 
Flask项目对接钉钉第三方扫码登录 Flask项目对接钉钉第三方扫码登录
一、注册钉钉开放平台通过https://oa.dingtalk.com/register_new.htm注册钉钉开放平台 注册成功后,可以自己创建个公司团队 二、创建扫码登录应用官方文档如下:https://ding-doc.dingta
2020-12-22
  目录