1. Docker基本介绍
2. Docker和Docker Compose安装
3. Docker启动容器
4. chatgpt私有化部署
5. docker-compose.yml文件模板
6. 结合tg的chatgpt私有化部署
Docker 是一款开源的容器化引擎,允许开发者将应用程序及其依赖项打包到一个可移植的容器中,然后在任何 Linux、Windows 或 macOS 等操作系统上运行。
以下是 Docker 的发展历史和基本情况:
目前,Docker 已成为业界标准的容器化技术,被广泛应用于各种场景,如开发、测试、部署等。Docker 镜像可以在 Docker Hub 中分享和获取,其中包括了许多常见的应用程序和开发工具,使得开发者可以更加方便地构建和部署应用程序。此外,Docker 还支持容器编排工具,如 Docker Compose 和 Kubernetes,可以帮助开发者更加高效地管理和运行容器化应用程序。
Docker Compose 是一个用于定义和运行多个容器应用程序的工具,可以通过一个 YAML 文件来定义一组服务,并通过 docker-compose
命令来管理这些服务。Docker Compose 可以让你轻松地定义和部署 Docker 应用,而无需手动编写 Dockerfile 或使用 Docker 命令来创建和启动容器。
Docker Compose 的工作原理如下:
在
docker-compose.yml
文件中定义服务,包括每个服务的容器名称、镜像、端口、环境变量等信息。使用
docker-compose
命令构建和启动服务。Docker Compose 会自动启动和管理服务之间的网络通信,并确保服务在正确的顺序下启动。
可以使用
docker-compose
命令来管理服务,如启动、停止、重启、删除等。
Docker Compose 支持多个容器的组合,可以用来构建复杂的应用程序。它还支持动态扩展,可以根据需要启动或停止多个容器实例。
Docker Compose 的基本命令包括:
docker-compose up
: 启动所有服务。
docker-compose down
: 停止并删除所有服务。
docker-compose build
: 构建镜像。
docker-compose start
: 启动服务。
docker-compose stop
: 停止服务。
docker-compose restart
: 重启服务。
docker-compose ps
: 列出所有服务。
docker-compose logs
: 查看日志。
docker-compose exec
: 进入服务容器。
docker-compose run
: 运行服务容器。
Docker Compose 的优点包括:
简化应用部署:使用 Docker Compose 可以轻松地部署多个服务应用程序,而无需手动编写 Dockerfile 或使用 Docker 命令来创建和启动容器。
提高应用可移植性:使用 Docker Compose 可以轻松地将应用程序部署到不同的环境中,如开发、测试和生产环境,而无需手动修改配置文件或重新部署。
支持动态扩展:使用 Docker Compose 可以根据需要启动或停止多个容器实例,以应对流量高峰或资源瓶颈等情况。
管理多个服务:使用 Docker Compose 可以轻松地管理多个服务之间的依赖关系和通信,确保服务在正确的顺序下启动,并提供一致的管理接口。
总之,Docker Compose 是一个非常方便的工具,可以帮助开发人员轻松地部署和管理 Docker 应用程序。
Docker是一个容器化平台,可以使用docker命令来管理和部署容器。而docker-compose则是一个用于定义和运行多容器Docker应用程序的工具。具体而言,docker-compose是基于YAML文件的,它可以在一个配置文件中定义多个服务,每个服务可以包括多个容器,同时还可以指定容器之间的依赖关系和网络配置等。
相比之下,使用docker命令只能启动一个容器,而且需要手动设置端口映射和环境变量等参数。而使用docker-compose则可以更加灵活地管理多容器应用,可以在一个配置文件中定义多个服务,容器之间的网络和依赖关系也可以更加方便地配置。此外,docker-compose还支持自动化的容器编排和扩展,可以快速地启动和停止多个容器,并进行容器间的通信。
在 CentOS 系统上安装较新版本的 Docker 可以通过以下步骤进行:
1. 卸载旧版本的 Docker(如果已安装):
sudo yum remove docker docker-common docker-selinux docker-engine
2. 安装 Docker 所需的依赖包:
yum install -y yum-utils device-mapper-persistent-data lvm2
这个命令是在 CentOS 系统上安装 Docker 所需的一些依赖包。下面是这些依赖包的简要说明:
yum-utils
:这是一个 YUM 工具集,包含了一些方便的工具,如 yum-config-manager、yumdownloader 等,用于管理和配置 YUM 软件包管理器。
device-mapper-persistent-data
:这是 Docker 使用的一个依赖库,提供了持久化存储的设备映射功能,用于在容器和宿主机之间进行数据存储的映射。
lvm2
:这是 Linux 逻辑卷管理器 (LVM) 的一个工具集,允许对物理存储设备(如硬盘)进行逻辑卷的管理,用于在 Docker 中创建和管理容器的文件系统。这些依赖包是安装 Docker CE(社区版)时需要的前置条件,通过执行该命令,可以一次性安装这些依赖包,以确保 Docker 在 CentOS 系统上能够正常运行。参数
-y
表示在安装过程中自动应答 "yes",以避免出现提示等待用户确认的情况。
3. 添加 Docker 的官方仓库:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4. 执行以下命令更新软件包缓存:
yum makecache
5. 安装 Docker CE(社区版):
yum install docker-ce
6. 启动 Docker 服务并设置开机自启动:
sudo systemctl start docker
sudo systemctl enable docker
7. 验证 Docker 是否安装成功:
sudo docker version
下面这个命令会列出在系统中已经安装的所有软件包,并通过 grep
过滤出包含 "docker" 关键字的软件包。如果输出中包含类似 "docker" 或者 "docker-engine" 等相关的软件包名称,则表示系统中安装了 Docker。
sudo yum list installed | grep docker
也可以通过以下命令检查 Docker 服务的运行状态,看是否有Docker 服务在运行:
sudo systemctl status docker
以上步骤将在 CentOS 系统上安装 Docker CE 的最新版本。你可以通过 sudo docker version
命令来验证 Docker 是否成功安装,并查看当前安装的版本信息。
sudo docker run hello-world
docker run hello-world
是一个 Docker 命令,用于在 Docker 上运行一个名为 "hello-world" 的容器。这是一个简单的 Docker 示例应用程序,用于测试 Docker 是否正确安装并能够正常工作。具体而言,
docker run
命令用于在 Docker 上运行一个容器,hello-world
是一个容器镜像的名称。当您运行这个命令时,Docker 将从 Docker Hub(Docker 的官方容器镜像仓库)中下载 "hello-world" 镜像,并在容器中运行它。"hello-world" 容器只是一个简单的示例,它并不做任何有用的工作,仅仅输出一条 "Hello from Docker!" 的消息,并显示 Docker 版本信息。通过运行
docker run hello-world
,您可以验证 Docker 是否已正确安装并能够正常运行,以及验证 Docker 容器的基本使用流程。如果一切顺利,您应该会在命令输出中看到 "Hello from Docker!" 的消息,表示 Docker 已经成功安装并可以运行容器。
注意:这只是一种安装 Docker 的方法,Docker 的版本可能会随时间变化,请确保在安装时使用了最新的官方文档或官方网站上提供的安装方法。
在 CentOS 系统上安装较新版本的 Docker Compose 可以通过以下步骤进行:
1. 下载 Docker Compose 的二进制文件:
最新的Docker Compose 的Github下载链接地址是 https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64
在您的 CentOS 系统中使用 curl
命令下载 Docker Compose 文件。例如,对于 v2.17.3 版本的 Docker Compose,可以使用以下命令:
sudo curl -L https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
上面这个命令是用于从 Docker Compose 的 GitHub 仓库下载 Docker Compose 的二进制文件,并将其保存到 /usr/local/bin
目录下。具体解释如下:
sudo curl -L "https://github.com/docker/compose/releases/download//docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo
: 使用超级用户权限执行命令,因为需要在系统的/usr/local/bin
目录下进行文件操作,需要管理员权限。curl
: 是一个用于在命令行中进行 URL 请求和数据传输的工具。-L
: 选项告诉curl
跟随重定向。"https://github.com/docker/compose/releases/download/
: 是 Docker Compose 的下载链接,其中/docker-compose-$(uname -s)-$(uname -m)" 部分应替换为你想要安装的 Docker Compose 版本号。
$(uname -s)
和$(uname -m)
是 shell 命令,用于获取当前系统的操作系统类型和处理器架构,这样下载的二进制文件会根据当前系统自动选择对应的版本。-o /usr/local/bin/docker-compose
: 指定下载的文件保存到/usr/local/bin
目录下,并命名为docker-compose
。通过执行这个命令,将会从 Docker Compose 的 GitHub 仓库下载指定版本的 Docker Compose 二进制文件,并保存到
/usr/local/bin
目录下,使其可以在系统中被执行和调用。
2. 授权二进制文件
sudo chmod +x /usr/local/bin/docker-compose
3. 创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. 验证安装
docker-compose --version
运行以上命令后,如果能够显示安装的 Docker Compose 版本号,则表示安装成功。
这样,你就在 CentOS 系统中成功安装了 Docker Compose,可以使用 docker-compose
命令来管理 Docker 容器编排。请注意,Docker Compose 是用于管理多个 Docker 容器的工具,用于简化容器编排配置和管理。在使用 Docker Compose 之前,确保已经安装并正常运行了 Docker。
1. 在 Docker 中启动一个交互式的 Ubuntu 容器,并在其中运行 Bash shell 的命令。
docker run -it ubuntu bash
具体来说,命令中的参数含义如下:
docker run
: 运行一个 Docker 容器-it
: 分别表示两个选项 -i
和 -t
,其中 -i
表示让容器的标准输入保持打开, -t
表示为容器分配一个伪终端(pseudo-tty),这两个选项结合在一起可以启动一个交互式的容器。ubuntu
: 表示要运行的容器的镜像,这里使用的是 Ubuntu 镜像。bash
: 表示在容器中要运行的命令,这里使用的是 Bash shell。因此,这个命令会启动一个交互式的 Ubuntu 容器,并在其中运行 Bash shell。启动后,您可以在容器中使用 Bash 命令行交互,并执行各种操作。在退出 Bash shell 并关闭容器时,您可以使用 exit
命令或者在容器窗口中使用 Ctrl-D
来完成。
2. 该命令用于列出所有已经创建的容器(包括已经停止的容器)。
docker ps -a
3. 当 Docker 容器被停止或退出时,您可以使用 docker start
命令重新启动它。
docker start
停止某个容器的运行
docker stop
4. 如果您想要在重新启动的容器中执行命令,可以使用 docker exec
命令。
docker exec -it bash
其中 -it
参数允许您在容器中交互式地运行一个 bash shell,这样您就可以执行您需要的命令了。
请注意,如果容器在启动时遇到问题,您可以使用 docker logs
命令查看容器的日志,以帮助您诊断问题。例如:
docker logs
这将输出容器的日志信息,您可以根据其中的提示来排除问题。
5. 在 Ubuntu 容器内创建的文件夹默认是存储在容器的文件系统中的,而不是主机的文件系统中。
如果需要将容器内的文件复制到主机上,可以使用 docker cp
命令。具体步骤如下:
(1)在主机上创建一个目录,用于存放从容器中复制出来的文件:
mkdir /path/to/host/folder
(2)最后使用以下命令将容器内的文件复制到主机上的目录中,其中
替换为步骤 1 中获取到的容器名称或 ID,/path/to/container/folder
替换为容器内的文件夹路径,/path/to/host/folder
替换为主机上的目录路径:
docker cp :/path/to/container/folder /path/to/host/folder
执行完毕后,就可以在主机上的指定目录中找到从容器中复制出来的文件夹了。
1. 在云服务器中创建一个目录用于存放docker-compose.yml文件
mkdir chatgpt
cd chatgpt
2. 在chatgpt目录下创建一个docker-compose.yml文件,并将以下内容复制到文件中:
version: '3'
services:
chatgpt:
image: miclon/chatgpt:latest
container_name: chatgpt
ports:
- "8000:8000"
environment:
# 填写你的 API_KEY
- API_KEY=sk-xxxxxx
# 填写API请求代理地址
- HTTPS_PROXY=http://192.168.1.17:7890
这个部分定义了我们要部署的应用程序及其相关配置。在这个例子中,我们只有一个服务,名为
chatgpt
,它使用了miclon/chatgpt
镜像的最新版本(latest
)。container_name
属性指定了Docker容器的名称为chatgpt
,ports
属性将Docker容器内部的8000端口映射到主机的8000端口上,以便我们可以通过主机访问该容器中的应用程序。最后,
environment
属性指定了应用程序所需要的环境变量。在这个例子中,我们需要填写API_KEY
和HTTPS_PROXY
两个环境变量,它们将在Docker容器运行时被自动设置。其中,API_KEY
环境变量需要填写我们自己的密钥,而HTTPS_PROXY
环境变量则指定了我们所使用的HTTP代理服务器的地址和端口号。
请注意,如果你没有使用HTTP代理服务器,或者你所使用的网络环境并不需要使用代理服务器,那么你可以将HTTPS_PROXY
环境变量设置为空字符串,例如:
environment:
- HTTPS_PROXY=
3. 启动docker-compose服务 在chatgpt目录下运行以下命令启动docker-compose服务:
sudo docker-compose up -d
要使用 docker-compose
命令停止一个容器,您可以使用以下命令:
该命令将会根据docker-compose.yml文件启动chatgpt服务,并将其运行在后台模式。
docker-compose stop
其中
是 Docker Compose 文件中定义的服务名称。这将会停止指定服务的容器,并保留其状态。
需要在yml文件所在的目录下执行docker-compose命令。这是因为docker-compose命令会读取当前目录下的docker-compose.yml文件,并且使用该文件来创建、启动、停止和删除容器等操作。如果不在yml文件所在的目录下执行docker-compose命令,则无法正确识别和使用yml文件。
4. 确认服务已启动 运行以下命令,确认chatgpt服务已经启动:
sudo docker-compose ps
该命令将会列出当前运行的docker-compose服务,如果chatgpt服务正在运行,将会显示服务状态为"Up"。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38f13a3ce0df miclon/chatgpt:latest "/bin/bash start.sh" 8 seconds ago Up 6 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp chatgpt-u5a1
3622f0430f39 miclon/chatgpt:latest "/bin/bash start.sh" 24 hours ago Exited (137) 3 minutes ago chatgpt
f74e6eb974b4 ubuntu "bash" 28 hours ago Exited (137) 24 hours ago busy_ganguly
9d464ee54c09 hello-world "/hello" 28 hours ago Exited (0) 24 hours ago wizardly_almeida
405719ccf04b hello-world "/hello" 41 hours ago Exited (0) 41 hours ago priceless_ritchie
docker-compose ps -a
命令将列出Docker Compose文件中定义的所有服务以及它们的容器的详细信息,包括正在运行的容器以及已经停止的容器。下面是一些可能会显示的信息:
Name
: 服务名称。Command
: 在容器内运行的命令。State
: 容器的状态,如running
、exited
、restarting
等。Ports
: 容器暴露的端口以及它们映射到主机的端口。Health
: 容器的健康状态,包括健康检查的结果和最后一次检查的时间戳。Exit Code
: 容器最后一次退出的状态代码。Image
: 服务使用的镜像名称。Created
: 容器创建的时间戳。Status
: 服务的状态,如Up
、Exited
、Restarting
等。在输出中,容器的状态用
Up
、Exited
等关键字表示,State
列中的Exit Code
列出了容器最后一次退出的状态代码。
5. 如果chatgpt服务在云服务器的本地8000端口上运行,则你可以通过在服务器的终端中输入服务器的公共IP地址或域名后加上端口号8000来访问该服务。
curl http://localhost:8000
访问结果如下
ChatGPT
6. 修改nginx配置文件实现通过域名(https://domain.com)访问
如果您想保持容器路径不变,并希望nginx代理的路径与容器路径保持一致,可以将nginx配置文件中的location
块中的路径修改为/
,例如:
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
这段代码是Nginx配置文件中的一个location块,它定义了一个反向代理服务器,将所有的请求都转发到指定的地址 http://127.0.0.1:8000/。
下面是每个指令的含义:
proxy_pass http://127.0.0.1:8000/;:将请求转发到 http://127.0.0.1:8000/ 地址。
proxy_set_header Host $host;:将客户端请求的 Host 头部信息传递给后端服务器。
proxy_set_header X-Real-IP $remote_addr;:将客户端真实 IP 地址传递给后端服务器。
proxy_set_header X-Forwarded-Proto $scheme;:将客户端请求的协议传递给后端服务器。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:将客户端请求的 IP 地址和 X-Forwarded-For 头部信息传递给后端服务器。
proxy_set_header Upgrade $http_upgrade;:将请求的升级头部信息传递给后端服务器。
proxy_set_header Connection "upgrade";:将请求的连接头部信息传递给后端服务器。
这段代码的作用是将所有的请求转发到 http://127.0.0.1:8000/,并将客户端请求的相关信息传递给后端服务器。
该项目地址:GitHub - mic1on/chatGPT-web: chatGPT私有化部署
如果您想允许 IP 地址以 162.158.63.
开头的所有 IP 段访问,您可以按照以下方式修改 location /
:
location / {
# 允许 IP 地址以 162.158.63. 开头的所有 IP 段访问
allow 162.158.63.0/24;
deny all;
# 设置反向代理
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
如果location仅为 /,则表示匹配所有请求,并将其映射到配置文件中指定的根目录下。这通常是指定根目录的默认方式,同时也可以在该location块中设置其他具体的处理方式和指令。需要注意的是,在配置文件中应该将最精确的匹配放在前面,以便尽早地处理对应的请求。
7. 如果您想要完全删除服务的容器,可以使用 docker-compose down
命令。例如,如果您要停止名为 web
的服务的容器,您可以使用以下命令:
docker-compose stop web
如果您想要停止 Docker Compose 文件中定义的所有服务的容器,您可以使用以下命令:
docker-compose stop
这将会停止 Docker Compose 文件中定义的所有服务的容器,并保留其状态。请注意,此命令仅停止容器,而不会删除它们。如果您想要完全删除服务的容器,请使用 docker-compose down
命令。
Docker Compose 中的服务名称必须是唯一的。如果您尝试创建两个名称相同的容器,则会导致启动失败,并显示一个错误消息,指示服务名称已经存在。在 Docker Compose 文件中,每个服务都必须具有唯一的名称,以便能够引用它们并在整个应用程序中进行区分。
下面是一个简单的docker-compose.yml
文件模板:
version: '3' # 版本号
services: # 定义各个服务
service1: # 服务名称
image: image1 # 服务所用镜像名称
ports: # 暴露的端口
- "8080:80"
volumes: # 挂载的卷
- ./data:/data
environment: # 环境变量
- ENV_VAR1=value1
- ENV_VAR2=value2
service2:
image: image2
ports:
- "8081:80"
volumes:
- ./logs:/logs
environment:
- ENV_VAR1=value1
- ENV_VAR3=value3
networks: # 定义各个网络
network1: # 网络名称
driver: bridge # 网络类型
volumes: # 定义各个卷
data: # 卷名称
driver: local # 卷类型
该模板包含以下主要部分:
version
: 定义Docker Compose文件格式版本号,目前最新版本是3。services
: 定义各个服务,每个服务可以包含一个或多个容器。networks
: 定义各个网络,服务可以连接到其中一个或多个网络。volumes
: 定义各个卷,服务可以挂载其中一个或多个卷。每个服务包含以下信息:
image
: 服务所使用的镜像名称。ports
: 暴露容器内部的端口,并映射到主机的端口。volumes
: 挂载宿主机上的目录或文件到容器内部的目录。environment
: 定义环境变量。此外,还可以使用其他选项来定义各种其他配置,例如restart
、healthcheck
等。
项目地址:https://github.com/karfly/chatgpt_telegram_bot
将这个GitHub项目克隆到CentOS云服务器中,可以按照以下步骤操作:
1. 在CentOS云服务器上安装Git工具,如果还没有安装的话,可以运行以下命令:
sudo yum install git
使用Git命令克隆该项目到你的CentOS云服务器中:
git clone https://github.com/karfly/chatgpt_telegram_bot.git
2. 获取 OpenAI API key
3. 获取Telegram bot token from @BotFather
- 打开Telegram并向 BotFather 发送
/start
命令- 发送
/newbot
命令,并给你的机器人起一个名字- 给你的机器人取一个唯一的用户名以
_bot
结尾- BotFather 会生成一个 Token,复制下来保存好,这个 Token 是和你的机器人绑定的密钥,不要泄露给他人!
- 稍后在yml文件的设置里 将这个 Token 填入
telegram_token
变量中
4. 编辑 config/config.example.yml
设置token,key和allowed_telegram_username, 执行下面两个命令 (if you're advanced user, you can also edit config/config.example.env
):
mv config/config.example.yml config/config.yml
mv config/config.example.env config/config.env
config.example.env
# local path where to store MongoDB
MONGODB_PATH=./mongodb
# MongoDB port
MONGODB_PORT=27017
# Mongo Express port
MONGO_EXPRESS_PORT=8081
# Mongo Express username
MONGO_EXPRESS_USERNAME=username
# Mongo Express password
MONGO_EXPRESS_PASSWORD=password
config.example.yml
telegram_token: "123456789:AAEOmlF3J6f3Dic5DaUIC8123456789" # tgChat_bot
openai_api_key: "sk-3TXXmxq9gMABqiiwpx28T3BlbkFJsEabcdefg" # u2a1
use_chatgpt_api: true
allowed_telegram_usernames: ["@Kabc123456"] # if empty, the bot is available to anyone. pass a username string to allow it and/or user ids as integers
new_dialog_timeout: 600 # new dialog starts after timeout (in seconds)
return_n_generated_images: 1
n_chat_modes_per_page: 5
enable_message_streaming: true # if set, messages will be shown to user word-by-word
# prices
chatgpt_price_per_1000_tokens: 0.002
gpt_price_per_1000_tokens: 0.02
whisper_price_per_1_min: 0.006
4. And now run:
docker-compose --env-file config/config.env up --build
要将docker-compose命令在后台运行,可以使用-d
或--detach
选项。因此,修改后的命令如下:
docker-compose --env-file config/config.env up --build -d
运行该命令后,docker-compose将在后台构建和启动容器。可以使用docker ps
命令来查看容器是否正在运行。如果需要停止容器,可以使用docker-compose down
命令。
Docker: Accelerated, Containerized Application Development
Releases · docker/compose · GitHub
GitHub - mic1on/chatGPT-web: chatGPT私有化部署
GitHub - karfly/chatgpt_telegram_bot