docker虚拟机及flask部署

虚拟化部署环境的重要性

  1. 直接把程序部署在Linux操作系统上,很容易引发资源冲突(比如CentOS自带MariaDB数据库,再安装MySQL数据库会冲突)。
  2. 程序卸载不干净,导致无法安装或部署新程序。
  3. 每次部署之前要安装很多软件,修改复杂的配置文件。
  4. 无法让服务器硬件资源实现多租户服务。(可以给虚拟环境分配固定的硬件资源,则不会发生争抢硬件资源的冲突)
  5. 增大了在Linux系统上部署集群和分布式的难度。

Vmware和Docker对比:

  • Vmware是重量级虚拟机,每个虚拟实例都虚拟了完整的硬件环境(虚拟网卡、cpu、内存、硬盘),所以对硬件要求较高,虚拟实例单独使用自己的Linux内核。
  • Docker是轻量级虚拟机,只虚拟了少量的硬件设备(虚拟网卡),虚拟实例共享使用Linux内核。

Docker

是一个开源项目,为开发者和系统管理员提供了一个开放的平台,在任何地方通过打包和运行应用程序作为一个轻量级的容器。Docker在软件容器内自动部署应用程序。
Docker是跨平台的轻量级虚拟机,但是在Window和MacOS上面有部分功能无法使用(Win10有内置Linux虚拟机,故能运行Docker),所以推荐linux。

安装

安装 Docker 所需条件:需要 64 位架构的系统和Linux 3.10内核或更高版本。

# 检查 kernel 版本和操作系统架构。
uname -a
cat /etc/lsb-release
# 现在运行安装 Docker 的命令
sudo apt-get install -y docker.io
# 提示:有几个软件包无法下载,要不运行 apt-get update 或者加上 --fix-missing 的选项再试试?
apt-get update
sudo apt-get install -y docker.io
# 等待安装完毕,现在我们使用下面的命令启动Docker
systemctl start docker
# 使用下面的命令,如果看到输出docker start/running 就表示安装成功。退出时:esc:wq
sudo service docker status
# 关闭docker
systemctl stop docker
# 核对docker版本
docker version

DockerHub是Docker公共镜像仓库,为用户提供大量的镜像文件:https://hub.docker.com/,由于国内网络访问DockerHub很慢,无法下载镜像文件,可以使用

Docker加速器–DaoCloud

# 安装curl
apt install curl
# 配置DaoCloud
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://n1mngx9r.mirror.aliyuncs.com
# 查看{"registry-mirrors": ["https://n1mngx9r.mirror.aliyuncs.com"]}
vi /etc/docker/daemon.json
# 重启docker
systemctl restart docker

Docker 包含三个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。镜像是 Docker 运行容器的前提,仓库是存放镜像的场所。在镜像基础之上创建容器。

镜像:
为了快速打包和部署软件环境,Docker引入镜像机制,镜像是一个配置好的只读层软件环境,我们可以通过dockerfile文件创建出镜像,也可以从Dockerhub中下载镜像
容器:
容器是镜像基础之上创建出的虚拟实例,内容可读可写,一个Docker镜像可以创建出多个容器,而且容器直接相互隔离,部署的程序不会相互干扰, 所有的容器直接使用宿主机的Linux内核、内存和硬盘,所以容器的性能非常接近于宿主机
下载镜像 为镜像创建容器 最后在容器中部署程序

常用的docker命令

DockerFile 通过build创建docker镜像,本文是直接在浏览器搜索镜像,挑选好后通过pull命令将镜像下载到虚拟机,上传镜像用push。
镜像:
通过命令查看docker环境里的镜像:images
通过命令查看docker环境里某个镜像的文件信息:inspect
通过命令删除docker环境里的某个镜像:rmi # 前提:镜像无关联容器才可删除
导出和导入镜像:save/export --tar  load/import -- 镜像
容器:
删除docker:rm # 必须为停止状态
进入docker:exec
创建并立即启动docker:run
暂停docker:pause
恢复docker:unpause
停止docker:stop
开启docker:start

镜像

# 下载python镜像
docker pull python:3.7
# 查看所有镜像
docker images
# 查看镜像python的文件信息
docker inspect python:3.7
# 将docker中的python镜像导出成压缩文件/root/python.tar
docker save python:3.7 > /root/python.tar
cd /root/
ls # 查看是否导出成功
# 删除镜像
docker rmi python:3.7
# 查看所有镜像
docker images
# 导入镜像
docker load < /root/python.tar
# 查看所有镜像
docker images

容器

docker run -it --name=p1 python:3.7 bash
# 创建python容器p1,-it表示要和容器交互 使用python3:3.7镜像,bash命令行界面
# 自动进入容器内部
python --version
pip --version
python # 进入python shell环境
exit() # 退出到命令行
exit # run命令进入容器后 exit退出容器后关闭容器
docker ps -a # 查看容器状态 STATUS Exited (0)
docker start p1 # 开启容器
docker ps -a # STATUS Up
docker pause p1 # 暂停容器 Up 51 seconds (Paused)
docker unpause p1 # 恢复容器
docker exec -it p1 bash # 进入容器
exit # exec命令进入容器后 exit退出容器后不关闭容器 STATUS Up
docker inspect p1 # 查看容器信息 docker环境会自动为容器分配动态ip地址IPAddress,此时为docker内部虚拟的网络环境,不为外网或局域网。
# 关闭并删除容器
docker stop p1
docker rm p1
docker ps -a # 查看容器状态

网络分配技术、端口映射技术和目录挂载技术

由于docker环境会自动为容器分配动态ip地址,且为docker内部虚拟的网络环境,不为外网或局域网。会导致下次启动容器时候IP地址发生变化,因此可以创建一个Docker内部网段,需要网络分配技术。
由于默认情况下只有宿主机可以访问容器,需要端口映射技术,将容器的端口映射到宿主机上。这样其他主机就可以通过端口访问容器,映射到宿主机的端口,不需要设置防火墙规则就可以使用。
将python项目放入docker容器中,因为docker容器对于宿主机来说是一个隔离的环境,不可直接将文件放入容器或拷贝出来,Docker只支持目录挂载,不支持文件挂载。所以需要目录挂载技术。

# 创建网段名称为mynet
docker network create --subnet=172.18.0.0/16 mynet 
docker network rm mynet # 删除mynet网段
docker run -it --name=p1 --net mynet --ip 172.18.0.2 python:3.7 bash
python --version
exit
docker rm p1
# 端口映射-p端口5000映射宿主机9500端口
docker run -it --name=p1 -p 9500:5000 --net mynet --ip 172.18.0.2 python:3.7 bash
python --version
exit
docker rm p1
# 目录挂载
cd /root/
mkdir test
cd test 
touch 1.txt
docker run -it --name=p1 -v /root/test:/root/test python:3.7 bash
cd /root/test
ls
touch 2.txt
exit
# 关闭并删除容器
docker stop p1
docker rm p1
# 发现宿主机上的test文件内也有2.txt,实现文件传递
cd ..
rm -rf test # 删除test

总体流程

# 安装镜像
# 创建容器示例(容器使用端口映射/目录挂载/网络分配技术)
docker run -it -d --name=p1 -p 9500:5000 -v /root/project:/root/project --net mynet --ip 172.18.0.2 python:3.7 bash
# 创建容器,-it表示要和容器交互 -d后台默认运行 exit不停止容器,--name容器名称p1,-p端口5000映射宿主机9500端口,-v目录挂载,-net使用mynet网络并分配ip,使用python3:3.7镜像,bash命令行界面
docker ps -a # STATUS Up
docker exec -it p1 bash # 进入容器
# 为了加快pip命令安装扩展程序的速度,可以使用国内镜像加快速度
# 容器安装flask,可以使用国内镜像加快速度
pip install flask -i https://pypi.tuna.tsinghua.edu.cn.simple/#清华大学镜像 但是此时报错,所以我继续尝试pip install flask
pip install flask
# 安装mysql-connector实现python程序和数据库的连接
pip install mysql-connector-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 
# 安装sqlalchemy
pip install sqlalchemy -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 
# 在windows平台也安装
pip install mysql-connector-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 
pip install sqlalchemy -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 
# 下载mysql
exit
docker pull mysql
# 创建MySQL容器:为了外界可以远程访问mysql数据库 需要进行端口映射
docker run --name m1 -p 4306:3306 --net mynet --ip 172.18.0.3 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zxy******** -d mysql
# 创建MySQL容器不需要加-it,--name容器名称,--net分配网络 -v目录挂载(数据库挂了文件仍能提取数据),-e用户密码 ,-d该容器创建即后台运行 自动启动
docker images # 此时有两个容器
# 查看虚拟机ip
ifconfig -a # 192.168.112.128

打开navicat
连接 ip:192.168.112.128 端口号:4306
链接后右键新建数据库test 表user 字段 id name age 加入几个数据

python 创建Session类(用来连接数据库)

from sqlalchemy.orm import sessionmaker # 用以创建session类
from sqlalchemy import create_engine # 保存数据库连接信息

url = "mysql+mysqlconnector://root:zxy19981013@192.168.112.128:4306/test" # 数据库用户名密码地址端口及库名 本地连接 
engin = create_engine(url,pool_size=5)  # 数据库连接池对象个数
Session = sessionmaker(bind=engin) # 创建session类

执行查询语句:先创建Session对象,然后才可以执行SQL语句,最后还要关闭数据库连接

session = Session()
sql = "select * from user"
cursor = session.execute(sql)
result = cursor.fetchall()
session.close()

部署Python项目

部署Python项目的时候,由于flask项目部署到容器中,python和mysql均在同一个容器中,所以ip用docker内部的ip端口用内部端口即可。
url = "mysql+mysqlconnector://root:zxy19981013@172.18.0.3:3306/test",运行python -m py_compile app.pypython app.py编译出字节码。
为了不泄露Python程序代码,所有我们只要编译的Python程序,将项目复制一份,删除py文件,只留下pyc文件(pycharm项目文件夹会自动生成pyc文件),在本地压缩到D:/project.tar路径上,将所有的pyc文件移动到上一级目录。
tar -cvf D:/project.tar project,使用D:\wendang\filezilla\FileZilla FTP Client上传文件到虚拟机的挂载目录/root/project上
解压缩:
cd /root/project/
tar -xvf project.tar -C /root/project/
进入docker
docker exec -it p1 bash
cd /root/project/
cd project
运行程序
python app.pyc
若想退出容器 并且希望容器中的程序也运行,则改变代码后直接关闭窗口即可
nohup python app.pyc >logs.txt
本地浏览器输入http://192.168.112.128:9500/显示页面

https://github.com/zxy1013/flask_docker

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值