heroku部署python-docker的web服务器
注册heroku
https://dashboard.heroku.com/
在电脑上可能有问题,无法显示验证,会注册失败
需要使用技术上网,并且在手机上操作会更流畅
登录之后创建一些的app
其实创建一个就行,那个是在Heroku中内部划分不同的步骤
命名规范要求中间有-,不是两个名字,-前后是一个整体
安装Heroku-Cli
centos-linux操作系统下
其他见官网文档
curl https://cli-assets.heroku.com/install.sh | sh
登录
登录客户端
heroku login
或者
heroku login -i
登录容器
heroku container:login
安装docker
yum -y install docker
启动docker
systemctl start docker
常见docker命令
打包
docker build -t 打包名称 -f Dockfile .
运行
docker run -p 8080:8080 -d 打包名称:latest
8080 是端口映射,如果有端口就需要写
查看容器和删除容器
查看容器
docker ps
删除容器
docker rm 刚刚dockerps出来的id号码写到这里
查看镜像和删除镜像
查看镜像
docker images
删除镜像
docker rmi 刚刚dockerimages出来的id号码写到这里
开启和结束容器
docker start dockerps出来的id号码写到这里
docker stop dockerps出来的id号码写到这里
打包docker
进入到docker文件夹下
执行命令打包
docker build -t pythondocker -f Dockfile .
注意:
Dockfile 是自己Dockerfile的名字,建议固定写成这样,Heroku可能会不识别其他符号,注意区分大小写
pythondocker 是容器的名字,自己随便起,注意和下面名称要统一
注册docker到Heroku
docker tag pythondocker:latest registry.heroku.com/***/web
pythondocker 是容器的名字,自己随便起,注意和下面名称要统一
registry.heroku.com/***/web 自己注册的应用容器服务器
*** 表示自己容器的名称
这些名称,随便写一个,注意要和下面统一
上传docker到Heroku
docker push registry.heroku.com/***/web
registry.heroku.com/***/web 这个注意要和上面的统一
上传容器到Heroku
heroku container:release web --app ***
注意要登录容器,否则会上传失败
*** 要和上面的名字统一
启动应用
进入app,点击open就可以进入了
查看日志
heroku logs --tail -a ***
*** 要和上面的名字统一
常见问题
动态绑定端口号
需要动态绑定端口号,否则会出现
heroku[web.1]: State changed from crashed to starting
heroku[web.1]: Starting process with command `python /code/server3.py`
app[api]: Release v9 created by user ***@icloud.com
app[api]: Deployed web (350d1bd5740a) by user ***@icloud.com
heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
heroku[web.1]: Stopping process with SIGKILL
heroku[web.1]: Process exited with status 137
Dockerfile书写格式
Dockerfile中要这样写,传入$POST
#基于的基础镜像
FROM python:3.4
#代码添加到code文件夹
ADD ./pythonProject /code
# 设置code文件夹是工作目录
WORKDIR /code
# 安装支持
#RUN pip install -r requirements.txt
CMD python /code/server3.py $PORT
Python文件书写格式
在server.py中要通过参数获取
serverPort = int(sys.argv[1])
完整结构如下
if __name__ == '__main__':
serverSocket = socket(AF_INET, SOCK_STREAM)
serverPort = int(sys.argv[1])
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(("", serverPort))
serverSocket.listen(5)
print('The server is running')
# Main web server loop. It simply accepts TCP connections, and get the request processed in seperate threads.
while True:
# Set up a new connection from the client
connectionSocket, addr = serverSocket.accept()
# Clients timeout after 60 seconds of inactivity and must reconnect.
connectionSocket.settimeout(600)
# start new thread to handle incoming request
_thread.start_new_thread(process, (connectionSocket,))