1、创建虚拟环境: python3 -m venv myenv
进入虚拟环境:source myenv/bin/activate
2、docker 国内镜像教程:https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea#google_vignette
永久配置:# 创建目录
sudo mkdir -p /etc/docker
# 写入配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.unsee.tech",
"https://dockerpull.org",
"https://docker.1panel.live",
"https://dockerhub.icu"
]
}
EOF
# 重启docker服务
sudo systemctl daemon-reload && sudo systemctl restart docker
3、构建 Docker 镜像:
在包含Dockerfile的项目根目录下,执行以下命令构建镜像(假设镜像名称为myfastapi_gunicorn):
sudo docker build -t myfastapi_gunicorn.
运行 Docker 容器:
以守护进程模式运行并映射端口(用于生产环境等):
执行以下命令启动容器,将容器内的 8000 端口映射到宿主机的 8000 端口,容器在后台运行:
sudo docker run -d -p 8000:8000 myfastapi_gunicorn
启动容器并进入内部(用于调试等):
如果要启动容器并进入内部,例如查看日志或者调试,可以使用以下命令:
sudo docker run -it myfastapi_gunicorn /bin/bash
进入容器后,可以使用docker logs <容器ID或容器名称>来查看容器内服务的运行日志。例如,如果容器名称是myfastapi_gunicorn_container,可以在宿主机的另一个终端中执行以下命令:
sudo docker logs myfastapi_gunicorn_container
停止和删除容器(后续操作):
要停止运行的容器,假设容器名称是myfastapi_gunicorn_container,使用以下命令:
sudo docker stop myfastapi_gunicorn_container
要删除已经停止的容器,使用:
sudo docker rm myfastapi_gunicorn_container
删除 Docker 镜像(后续操作):
如果想删除之前构建的myfastapi_gunicorn镜像,在确保相关容器已经停止并删除后,使用以下命令:
sudo docker rmi myfastapi_gunicorn
4、在容器中,127.0.0.1(或localhost)表示容器内部的本地回环地址。当gunicorn监听127.0.0.1:8000时,它只能接收来自容器内部的连接请求,而无法从外部(如宿主机的浏览器)访问。
你需要将gunicorn绑定到0.0.0.0:8000,这样它就能接收来自任何网络接口(包括容器外部)的请求。在容器内的命令应该是gunicorn main:app - - workers 4 - - bind 0.0.0.0:8000。
5、一、再次确认容器内配置及端口映射情况
容器内监听地址检查
确保在容器内运行 gunicorn 时确实绑定到了 0.0.0.0:8000,可以通过以下方式确认:
进入容器后,使用 netstat -tln(如果容器内有该命令工具,一般基于 Linux 的容器都会有)查看监听的网络端口情况,应该能看到类似如下输出(表示在 0.0.0.0 的 8000 端口监听):
bash
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN
如果看到是绑定在 127.0.0.1:8000,那就需要重新启动 gunicorn 并正确绑定到 0.0.0.0:8000,命令如 gunicorn main:app --workers 4 --bind 0.0.0.0:8000。
Docker 端口映射复查
如果你是通过 docker run 启动容器并做了端口映射,仔细核对端口映射命令是否正确执行。例如,通过 docker ps 命令查看正在运行的容器信息,确认端口映射那一项显示类似 0.0.0.0:8000->8000/tcp,表示宿主机的 8000 端口正确映射到了容器内的 8000 端口。
如果端口映射不正确,可以停止当前容器(使用 docker stop <容器名称或ID>),然后重新启动容器并正确配置端口映射,比如 docker run -p 8000:8000 <容器对应的镜像名称>。
6、pip install "uvicorn[standard]" gunicorn
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
加上日志:
gunicorn -k uvicorn.workers.UvicornWorker --bind "0.0.0.0:8080" --log-level debug main:app
7、查找占用端口的进程并关闭它
使用 netstat 命令(适用于 Linux 系统)
在终端中输入以下命令来查找占用 8080 端口的进程:
bash
sudo netstat -tlnp | grep 8080
这个命令中,-t 表示显示 TCP 连接,-l 表示只显示监听状态的连接,-n 表示以数字形式显示地址和端口(而不是解析成域名等形式),-p 表示显示对应的进程信息。
命令执行后,会输出类似这样的结果:
plaintext
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12345/python
其中最后的数字(示例中的 12345)就是占用该端口的进程 ID(PID)。
然后使用以下命令来终止该进程(将 12345 替换为实际查找到的 PID):
bash
sudo kill -9 12345
不过要注意,kill -9 是强制终止进程的操作,可能会导致正在运行的程序数据丢失等情况,如果可以的话,优先尝试使用 kill (不带 -9 参数,发送正常的终止信号让进程正常退出)。
使用 lsof 命令(适用于 Linux、macOS 等系统)
输入以下命令查找占用 8080 端口的进程:
bash
sudo lsof -i :8080
它会列出占用该端口的相关进程信息,示例输出可能如下:
plaintext
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 12345 user1 3u IPv4 12345 0t0 TCP *:8080 (LISTEN)
同样,从输出中获取到进程的 PID(示例中的 12345),然后可以使用 kill 命令来终止该进程(如上面介绍的那样)。
更改 Gunicorn 要绑定的端口
如果不想关闭占用 8080 端口的现有程序,也可以修改 Gunicorn 的配置,让它绑定到其他未被占用的端口。比如,修改启动 Gunicorn 的命令或者配置文件(如果有配置文件的话),将绑定的端口从 8080 改成比如 8081 等其他可用端口。
例如,如果是通过命令行启动 Gunicorn,原本的启动命令可能类似:
bash
gunicorn app:app -b 0.0.0.0:8080
可以改成:
bash
gunicorn app:app -b 0.0.0.0:8081
这样 Gunicorn 就会尝试绑定到新的端口上运行,避免和已占用 8080 端口的程序冲突了。
sudo: netstat: command not found
出现 sudo: netstat: command not found 这样的提示,说明你的系统中可能没有安装 netstat 这个工具,不同的操作系统解决方式有所不同:
对于 Ubuntu、Debian 等基于 Debian 的 Linux 系统
可以通过以下命令来安装 netstat 所属的包:
bash
sudo apt-get update
sudo apt-get install net-tools
第一条命令 sudo apt-get update 是用来更新软件包索引列表,确保能获取到最新的软件包信息,第二条命令 sudo apt-get install net-tools 则是实际安装包含 netstat 工具的 net-tools 包。安装完成后,就可以正常使用 netstat 命令去查找端口占用情况了。
对于 CentOS、RHEL 等基于 Red Hat 的 Linux 系统
使用以下命令来安装:
bash
sudo yum install net-tools
这条命令会从 yum 软件源中查找并安装 net-tools 包,安装好之后就能使用 netstat 命令了。
对于 macOS 系统
netstat 命令在较新的 macOS 版本中默认是有的,但如果你的系统提示找不到该命令,也可以尝试通过安装 netcat 等其他网络工具包来查看端口相关信息,比如可以使用 brew 包管理器(如果已经安装了 brew )来安装 netcat :
bash
brew install netcat
然后使用 nc 命令结合一些参数来查看端口占用情况,例如:
bash
sudo nc -vz 0.0.0.0 8080
这个命令可以查看指定的 0.0.0.0 地址的 8080 端口是否被占用以及相关连接情况等(虽然和 netstat 的输出格式不太一样,但能起到类似查看端口占用的作用)。
(myenv) lipeng@ubuntu:~/Documents/FastApiLearning/FastApiLearning$ sudo netstat -tlnp | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 9966/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 9971/docker-proxy
如何关闭
使用 kill 命令关闭进程
从 netstat 命令的输出结果来看,进程 ID(PID)分别是 9966 和 9971,并且这些进程是由 docker - proxy 启动的。
可以使用 kill 命令来尝试正常关闭这些进程。在终端中输入以下命令:
plaintext
sudo kill 9966 9971
如果这些进程能够正常响应终止信号,它们就会关闭。不过有时候进程可能不会响应 kill 命令(例如进程处于一种不正常的状态),这时可以使用更强制的方式。
使用 kill -9 命令强制关闭进程(谨慎使用)
如果正常的 kill 命令没有起作用,可以使用 kill -9 命令来强制终止进程。在终端中输入:
plaintext
sudo kill -9 9966 9971
但是要注意,kill -9 会强制终止进程,可能导致数据丢失或者系统不稳定等问题。如果这些进程是重要的系统服务或者正在处理重要的数据,应该先尝试找出这些进程存在的原因,再考虑是否要强制终止。
通过 docker 命令来处理(如果这些进程是由 docker 启动的)
因为这些进程看起来像是 docker 相关的代理进程,你可以尝试通过 docker 命令来停止相关的容器。首先,需要找出与这些代理进程相关的容器。可以使用以下命令查看正在运行的容器信息:
plaintext
docker ps
这个命令会列出正在运行的容器的详细信息,包括容器 ID、镜像名称、创建时间等。查看容器的端口映射信息,尝试找出与 8080 端口相关的容器。
一旦找到相关容器,例如容器 ID 是 abcdef,可以使用以下命令来停止该容器:
plaintext
docker stop abcdef
这样就可以通过 docker 的方式来停止占用 8080 端口的相关进程。