安装Docker
关闭SELINUX服务
SELINUX是CentOS系统捆绑的安全服务程序,因为安全策略过于严格,所以建议搭建关闭这项服务
修改/etc/selinux/config文件,设置SELINUX=disabled
vim /etc/selinux/config
# 设置SELINUX=disabled
# 设置完成后重启Centos系统
reboot
安装Docker
yum install docker -y
# 常用命令
service docker start
service docker stop
service docker restart
什么是DockerHub
DockerHub是Docker公共镜像仓,为用户提供了大量的镜像文件
官方网址:https://hub.docker.com/
由于国内网络访问DockerHub很慢,我们可以使用Docker加速器
配置Docker加速器
DaoCloud加速器采用自主研发的智能路由及缓存技术,并引入了现金的协议层优化,极大提升拉取镜像的速度和体验
# 在centos终端中输入下面命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
然后,修改/etc/docker/daemon.json文件,去掉结尾的逗号(如果有)
什么是Docker镜像
为了快速打包和部署软件环境,Docker引入了镜像机制,镜像是一个配置好的只读层软件环境
我们可以通过dockerfile文件创建镜像,也可以从DockerHub中下载镜像
制作镜像的步骤:
从DockerHub下载python镜像,创建容器,在容器中安装需要的程序,再将容器转化为镜像,上传到DockerHub
什么是Docker容器
容器时在镜像基础上创建出的虚拟示例,内容可读可写
一个Docker镜像可以创建多个容器,而且容器之间相互隔离,部署的程序不会相互干扰
所有的容器直接使用宿主机的Linux内核,内存和硬盘,所以容器的性能非常接近宿主机
镜像相关命令
# 下载python3.8镜像
docker pull python:3.8
# 查看已有镜像
docker images
# 查看某个镜像的详细信息
docker inspect python:3.8
# 导出镜像:适合不能联网的服务器安装镜像
# docker save 镜像名:TAG > 压缩文件
docker save python:3.8 > /root/python.tar
# 删除镜像:docker rmi 镜像名:TAG
docker rmi python:3.8
# 从压缩包导入镜像
docker load < /root/python.tar
容器相关命令
注意:通过run命令创建容器后,执行退出exit命令容器会停止,但是通过exec命令进去容器,执行退出exit命令容器不会停止。
# 创建容器
# 用python:3.8这个镜像创建一个名为p1的容器,并进入它的bash命令界面
docker run -it --name=p1 python:3.8 bash
# 查看容器状态
docker ps -a
# 启动容器:docker start 容器名
docker start p1
# 停止容器
docker stop p1
# 暂停容器
docker pause p1
# 恢复容器运行
docker unpause p1
# 进入已经运行的容器
docker exec -it p1 bash
# 查看容器详细信息:docker inspect 容器名
docker inspect p1
# 删除容器(必须是stop状态才能删除)
docker rm p1
创建python容器必要技术
Docker网络环境
默认情况下,Docker环境会给容器分配动态的IP地址,这就导致下次启动容器的时候,IP地址就变了
Docker网络管理:为容器分配固定IP地址
我们可以单独创建一个Docker内部的网段(172.18.0.X)
# 创建网段
docker network create --subnet=172.18.0.0/16 mynet
# 查看docker环境中存在哪些网段
docker network ls
# 删除网段:注意需要将关联该网段的容器先删除了
docker network rm mynet
# 指定网段来创建容器(名为p1)
docker run -it --name=p1 --net mynet --ip 172.18.0.2 python:3.8 bash
Docker端口映射
默认情况下,除了宿主机之外,任何主机无法访问远程访问Docker容器
通过端口映射,可以把容器端口映射到宿主机的端口,这样其他主机就能访问容器了
映射到宿主机的端口,不需要设置防火墙规则,便可以使用。
# -p 宿主机端口:容器端口
docker run -it -p 9500:5000 --name=p1 python:3.8 bash
docker run -it -p 9500:5000 -p 9600:3306 --name=p1 python:3.8 bash
Docker目录挂载
为了能把一部分业务数据保存在Docker环境之外,或者把宿主机的文件传入容器,所以需要给容器挂载宿主机的目录。
这样做的一个好处是即便容器启动不了,我们的数据也不会丢失。
Docker环境只支持目录挂载,不支持文件挂载,而且一个容器可以挂载多个目录
目录挂载之后,在容器中挂载目录新创建的文件,在宿主机的挂载目录也能看到
# -v 宿主机目录:容器目录
docker run -it -v /root/test:/root/project --name=p1 python:3.8 bash
创建容器常用参数
- -it 创建和进去python容器都要加上这个参数
- -p 映射容器内端口到宿主机
- –name 容器名字
- -d 后台运行
- -v 目录挂载
- –net 指定网段
- –ip 指定ip地址
创建python容器
因为我们之前已经有了一个python:3.8的镜像,和一个我们自己创建的名为mynet的网段,所以现在我们直接创建python容器。
# 假设我们再root目录创建项目文件
cd /root/
mkdir project
docker run -it -d --name=p1 -p 3002:5000 -v /root/project:/root/project --net mynet --ip 172.18.0.2 python:3.8 bash
使用pip安装项目依赖
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:https://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install mysql-connector-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
创建mysql容器
下载mysql镜像
docker pull mysql:8.0.31
创建mysql容器:注意不要加-it参数
docker run --name=m1 -p 3001:3306 --net mynet --ip 172.18.0.3 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:8.0.31
使用客户端可视化工具连接
使用MySQL8.0报Public Key Retrieval is not allowed 错误的时候
解决办法:
1、右键编辑连接
2、点击驱动属性,找到allowPublicKeyRetrieval,把false改为true
3、最后重新启动
解决报错之后,下面我们用可视化工具来新建一个数据库
导入数据
导入结果如下:
代码连接报错:
ImportError: cannot import name ‘connector’ from partially initialized module ‘mysql’ (most likely due to a circular import)
原因:当前.py文件与库中包重名,改一下文件名就好啦!
我们之前自己创建了一个mysql.py改为mysql_data.py就好啦!
将flask项目部署到docker中
因为我们需要把项目部署在容器的内部,所以连接数据库的IP地址和端口需要更改为Docker容器的IP和端口
修改完毕push到github或者码云
cd /root/
mkdir project
##################### 假设之前还没创建容器和按照依赖(已创建可忽略)
docker run -it -d --name=p1 -p 3002:5000 -v /root/project:/root/project --net mynet --ip 172.18.0.2 python:3.8 bash
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip list # 查看是否暗装成功
######################
# 拉取项目代码
git clone https://gitee.com/asong5857229/flask_docker.git
# 进入容器
docker exec -it p1 bash
# 进入挂载目录
cd /root/project/flask_docker/
# 启动程序
python app.py
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://172.18.0.2:5000
外网访问:外网是访问Linux宿主机的IP地址192.168.0.37和python项目端口映射的3002端口
由上图可见,python项目可以成功访问并且数据库也是可以成功访问的。
正式部署的时候我们需要用后台启动的方式来运行app.py
nohup python app.py > ./flask.log 2>&1 &