Docker介绍及项目部署

安装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 & 

猜你喜欢

转载自blog.csdn.net/qq_34184505/article/details/128224343