目的:将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具体的用法参考
- https://docs.docker.com/compose/startup-order/
- https://www.cnblogs.com/wangmo/p/13042925.html
- https://segmentfault.com/a/1190000021504344
五、编写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