linux中使用docker创建容器镜像并部署python项目
记录下在Linux CentOS7.6系统中如何布署python项目的步骤
1,登录到服务器(ssh root@127.***.*.*)
2,修改CentOS中的selinux安全服务程序,它在/ect/selinux/config目录下,
修改它的SELINUX=disabled属性
cd / 进入根目录
vi /ect/selinux/config i SELINUX=disabled esc :w :q reboot #重启生效
3,安装Docker服务
yum install docker -y #-y表示默认安装 service docker start service docker stop service docker restart #重启
service docker start 启动docker服务
4,在docker上安装python镜像
https://hub.docker.com/
安装镜像先需要安装DaoCloud加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io vi /etc/docker/daemon.json #修改/etc/docker/daemon.json文件,去掉结尾的逗号 I :w :q service docker restart #重启docker服务
docker restart my_sql #重启docker会导致容器也停止服务。要使用该命令重启容器
docker pull python:3.9.6 安装python镜像
docker images 查看docker中安装的所有镜像
docker inspect python:3.9.6
注意:因为要按i键使vim编辑器进入可编辑状态,如果多按了,会不小心在文件头输入一个i,这会导致后续启动和重启docker服务失败,执行安装python镜像也会报错
这个亏吃大了!!!
修改文件后,终于成功了。。
如果python版本安装错了,可以执行docker rmi python:3.9.6来删除,再重新安装
5,使用docker创建python环境容器
创建一个完整的容器需要它具有固定IP,端口映射和目录挂载
以下子目录是让我们理解如何对窗口进行设定固定IP,端口映射和目录挂载
#(1),创建固定网段 docker network create --subnet=172.18.0.0/16 mynet # 创建一个名称为mynet的网段,它有16个网络地址 docker network ls # 查看docker中的网段
docker network inspect mynet
# 查看mynet网段中分配有哪些容器
#(2),创建目录 cd root
mkdir project #(3),创建一个在后台运行的python容器 参数:-d docker run -it -d --name=py_admin -p 9500:5000 -v /root/project:/root/project --net mynet --ip 172.18.0.2 python:3.9.6 bash docker ps -a docker exec -it py_admin bash exit docker ps -a #(4)对容器的pip命令添加国内加速器以提高安装python插件速度(以下是清华大学加速器) pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
5.1, 创建容器
docker run -it --name=p1 python:3.9.6 bash #在docker中创建一个名称为p1的python3.9.6的窗口以bash命令运行 python --version exit #退出容器,但容器会停止运行 docker ps -a #查看docker下容器的运行情况 docker start p1 #启动p1容器,再次执行查看命令会发现p1容器已经在运行了 docker pause p1 #暂停p1容器 docker unpause p1 #恢复p1容器运行 docker exec -it p1 bash #进入已存在且在运行的p1容器并运行bash命令 exit #退出容器,容器不会停止运行
p1容器中的ip地址是动态的,外部网络无法访问,且目录没有挂载,容易丢失文件数据,所以这样创建的容器不是我们要使用的容器
5.2,docker网络
为docker容器创建内部网段【分配固定IP】
docker network create --subnet=172.18.0.0/16 mynet # 创建一个名称为mynet的网段,它有16个网络地址 docker network ls # 查看docker中的网段 docker network rm mynet # 删除网段(先删除与这个网段有关联的容器) docker run -it --name=p1 --net mynet --ip 172.18.0.2 python:3.9.6 bash # 创建一个名称为p1使用mynet网段中172.18.0.2的IP的python容器 ip addr # 查看容器地址
5.3,docker容器端口映射
docker run -it -p 9500:5000 --name=p1 python:3.9.6 bash # 创建一个名称为p1端口映射到主机上的python容器 exit docker ps -a docker start p1 docker ps -a docker stop p1 docker rm p1
5.4,docker目录挂载
docker run -it -v /root/test:/root/project python:3.9.6 bash #将宿主机/root/test目录挂载到python容器的/root/project上 cd / cd root mkdir test cd test touch 1.text ls docker run -it -v /root/test:root/test --name=p1 python:3.9.6 bash # 创建一个名称为p1的python容器,并将宿主机上的/root/test目录挂载到窗口上 cd /root/test ls touch 2.txt exit ls docker rm p1 cd ../ rm -rf test # 容器挂载目录中创建的文件可以显示宿主机上,也可以显示宿主机的文件 # 同样宿主机目录中也可以看到容器中的文件,它们是双向的 # 因这样创建的只有挂载目录的容器不是我们要使用的,所以需要将它删掉,最后宿主机上的text目录和下面的文件也可以删除掉
6,使用docker安装mysql容器
docker pull mysql:8.0.30
# 安装指定版本mysql镜像 # docker pull mysql
cd root
mkdir mysql
# 安装最新版本 docker run --name collect_info -p 4306:3306 --net mynet --ip 127.18.0.3 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=**密码** -d mysql:8.0.30 # 在本地使用nevcate连接这个数据库 # 地址:云主机ip # 端口:4306
创建mysql容器时分配已经创建好的网段固定IP一直报错,目前还没有发现什么原因,只能先不分配IP了,这就会导致如果docker如果重启,就无法再访问这个mysql容器了
docker run --name mysql_admin -p 3306:3306 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.30
最后在云服务器上使用docker创建成功的python和mysql容器及运行状态
7,处理python项目并部署在云服务器上且可以在本地访问
# (1)修改python项目中的连接数据库文件中的ip为mysql容器中的固定ip127.18.0.3和端口号3306 # (2)修改数据库密码 # (3)修改python项目入口文件app.py中的app.run(host='0.0.0.0'),让所有外网主机都能访问本项目 python3 -m compileall /root/project # (4)python项目使用python3命令编译python项目 tar -cvf D:project.tar D:/project # (5)删除多余非.pyc编译文件后,使用linux命令打包python项目 tar -xvf project.tar -C /root/project # (6) 使用ftp将压缩包上传入云主机,解压到root/project/目录中 docker exec -it py_admin bash # (7) 进入py_admin的python容器中 cd /root/project ls nohup python app.pyc > los.txt # (8) 后台运行app.pyc文件,并将日志写入los.txt文件中 # (9)直接关掉控制台窗口,python就在云服务器后台中运行了,打开浏览器直接输入云主机IP加端口9500就可以访问项目了
注意:docker在运行时修改防火墙状态 会导至docker中的容器创建,启动等操作失败,需要在修改防火墙后重启docker再依个重启docker中的容器,才能继续操作容器