在容器中配置 HTTPS 主要涉及到在应用层面设置 SSL/TLS 证书和适当配置 Web 服务器(如 Nginx, Apache 等)。下面我将通过一些常用的步骤和示例来说明如何在 Docker 容器中配置 HTTPS。
1: 获取 SSL/TLS 证书
你可以选择多种方式获取证书:
- 使用 Let’s Encrypt:免费获取证书,适用于公开访问的服务。
- 自签名证书:适用于开发和测试环境。
- 购买证书:从证书颁发机构购买。
2: 创建 Dockerfile 配置 HTTPS
以下是使用 Nginx 作为示例的 Dockerfile 设置过程。
示例: 使用 Nginx 和自签名证书
2.1. 创建自签名证书:
你可以在你的宿主机上使用 OpenSSL 创建自签名证书:
1 |
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx.key -out nginx.crt -subj "/C=US/ST=New York/L=Brooklyn/O=Example Company/CN=hostname" |
2.2. 编写 Dockerfile:
创建一个 Dockerfile 来设置 Nginx 和证书:
1 2 3 4 5 6 7 8 9 10 11 |
FROM nginx:alpine # 复制证书和密钥 COPY nginx.crt /etc/nginx/ssl/nginx.crt COPY nginx.key /etc/nginx/ssl/nginx.key # 替换默认的 Nginx 配置文件 COPY nginx.conf /etc/nginx/nginx.conf # 暴露 443 端口 EXPOSE 443 |
2.3. 配置 Nginx:
创建一个 nginx.conf
文件来使用 HTTPS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
server { listen 443 ssl; server_name localhost; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /usr/share/nginx/html; index index.html index.htm; } } |
2.4. 构建和运行 Docker 容器:
使用以下命令来构建和运行你的 Docker 容器:
1 2 |
docker build -t my-nginx-https . docker run -p 443:443 my-nginx-https |
2.5 注意事项
- 在生产环境中,你可能需要更高级的配置,例如更严格的加密算法和 SSL 参数。
- 使用 Docker Secrets 或其他安全机制来管理证书密钥,特别是在生产环境中。
- 确保你的应用逻辑也支持 HTTPS,包括重定向从 HTTP 到 HTTPS 的请求。
通过这些步骤,你可以在 Docker 容器中配置 HTTPS,增加通信的安全性。如果你有特定的 Web 服务器或设置需求,可以具体提出,我可以提供更详细的配置指导。
3. 给已有的 image 添加https
这里以 https://github.com/open-webui/open-webui 为例
3.1. 列表容器
命令:
1 |
sudo docker ps |
1 2 3 4 |
sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b84a21cd6430 ghcr.io/open-webui/open-webui:main "bash start.sh" 2 days ago Up 33 minutes open-webui-new bca62f7d50d0 ghcr.io/open-webui/open-webui:main "bash start.sh" 2 days ago Up 33 minutes 0.0.0.0:3000->8080/tcp, :::3000->8080/tcp open-webui |
列出您当前系统上所有的 Docker 镜像,您可以使用 docker images
命令
1 2 3 4 |
docker images REPOSITORY TAG IMAGE ID CREATED SIZE ghcr.io/open-webui/open-webui main ec67635109ac 6 days ago 2.69GB containrrr/watchtower latest c352868a1654 5 months ago 14.2MB |
3.2. 查看环境变量
命令:
1 |
docker exec open-webui env |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
docker exec open-webui env PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=bca62f7d50d0 LANG=C.UTF-8 GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D PYTHON_VERSION=3.11.9 PYTHON_PIP_VERSION=24.0 PYTHON_SETUPTOOLS_VERSION=65.5.1 PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/dbf0c85f76fb6e1ab42aa672ffca6f0a675d9ee4/public/get-pip.py PYTHON_GET_PIP_SHA256=dfe9fd5c28dc98b5ac17979a953ea550cec37ae1b47a5116007395bfacff2ab9 ENV=prod PORT=8080 USE_OLLAMA_DOCKER=false USE_CUDA_DOCKER=false USE_CUDA_DOCKER_VER=cu121 USE_EMBEDDING_MODEL_DOCKER=sentence-transformers/all-MiniLM-L6-v2 USE_RERANKING_MODEL_DOCKER= OLLAMA_BASE_URL=/ollama OPENAI_API_BASE_URL= OPENAI_API_KEY= WEBUI_SECRET_KEY= SCARF_NO_ANALYTICS=true DO_NOT_TRACK=true LITELLM_LOCAL_MODEL_COST_MAP=True WHISPER_MODEL=base WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 RAG_RERANKING_MODEL= SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models HF_HOME=/app/backend/data/cache/embedding/models HOME=/root |
3.3. 查看正在运行的进程
命令:
1 |
docker top open-webui |
1 2 3 4 |
docker top open-webui UID PID PPID C STIME TTY TIME CMD root 1108 1069 0 08:13 ? 00:00:10 /usr/local/bin/python3 /usr/local/bin/uvicorn main:app --host 0.0.0.0 --port 8080 --forwarded-allow-ips * root 1247 1108 0 08:13 ? 00:00:03 /usr/local/bin/python3 /usr/local/bin/litellm --port 14365 --host 127.0.0.1 --telemetry False --config /app/backend/data/litellm/config.yaml |
3.4. 进入容器内部
命令
1 |
docker exec -it open-webui bash |
进入容器内部后,你就可以运行很多系统命令
一旦进入容器,你可以使用如下命令来查看具体的软件安装情况:
对于 Debian 或 Ubuntu 系统,使用:
1 |
dpkg -l |
对于 CentOS 或其他基于 RPM 的系统,使用:
1 |
rpm -qa |
3.5. 查看网络配置
查看容器的网络配置,如 IP 地址、开放的端口等:
1 |
docker inspect open-webui |
3.6 查看挂载的卷
1 |
docker inspect open-webui | grep -i "mounts" |
3.7 生成自签名证书
1 |
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout nginx.key -out nginx.crt -subj "/C=US/ST=New York/L=Brooklyn/O=aqwu.net Company/CN=aqwu.net" |
3.8 创建 Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
FROM ghcr.io/open-webui/open-webui:main # 安装 Nginx RUN apt-get update && apt-get install -y nginx # 复制 SSL 证书和密钥(需要先在宿主机上准备这些文件) COPY nginx.crt /etc/ssl/certs/nginx.crt COPY nginx.key /etc/ssl/private/nginx.key # 添加自定义的 Nginx 配置文件 COPY nginx.conf /etc/nginx/sites-available/default # 确保 HTTP 服务和 Nginx 在容器启动时运行 CMD ["bash", "-c", "service nginx start && bash start.sh"] |
3.9 Nginx 配置文件 nginx.conf
这个文件应该配置为使用您的证书,并设置为监听 HTTPS 请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
server { listen 443 ssl; server_name localhost; ssl_certificate /etc/ssl/certs/nginx.crt; ssl_certificate_key /etc/ssl/private/nginx.key; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } |
3.10. 构建和运行新的 Docker 镜像
在包含 Dockerfile 和相关文件的目录中运行以下命令:
1 2 |
docker build -t my-custom-webui . docker run --name my-custom-webui -d -p 443:443 my-custom-webui |
这将构建一个包含 HTTPS 支持的新 Docker 镜像,并在端口 443 上运行它。
通过以上步骤,您可以为现有的 Docker 容器添加 HTTPS 支持。这些操作可以确保您的服务在安全的 HTTPS 连接下可用。如果您需要进一步的帮助或者有具体的问题,随时可以询问。
3.11 停止以前的容器
1 |
docker stop open-webui |
也可以停止所有的容器
1 |
docker stop $(docker ps -q) |
一旦容器停止,它们的状态将变为停止状态,但容器的数据和配置仍然保留在系统中。如果您打算删除这些停止的容器,以释放资源或清理环境,可以使用以下命令:
1 |
docker rm open-webui |
3.11 列举所有容器
要列出所有 Docker 容器,包括正在运行的和已停止的,您可以使用以下 Docker 命令:
1 |
docker ps -a |
如果您想要获取更多详细信息,如容器的大小等,您可以使用:
1 |
docker ps -a --size |
3.12 删除镜像
如果您想删除原来的 Docker 镜像文件,您可以使用 docker rmi
命令。在执行此命令之前,请确保没有容器正在使用该镜像,否则镜像无法被删除。
- 列出所有镜像:
首先,您可以使用docker images
命令列出所有镜像,以找到您想要删除的镜像的 ID 或名称:
1 |
docker images |
- 停止使用镜像的所有容器:
如果有容器正在使用该镜像,您需要先停止并删除这些容器。例如:
1 2 |
docker stop container_name_or_id docker rm container_name_or_id |
- 删除镜像:
使用镜像的 ID 或仓库名和标签来删除它。例如,如果您想删除名为my-custom-webui
的镜像:
1 |
docker rmi my-custom-webui |
如果想要删除特定版本的镜像,您可以指定标签:
1 |
docker rmi my-custom-webui:tag |
如果镜像被多个标签引用,您需要删除所有相关标签才能完全删除镜像。
- 强制删除镜像:
如果镜像无法正常删除(例如,由于某些未停止的容器依然在使用它),您可以使用-f
或--force
选项来强制删除:
1 |
docker rmi -f my-custom-webui |
注意:
使用 docker rmi
删除镜像可能会导致数据丢失,特别是如果您没有其他地方保存了该镜像或其构成部分。因此,在执行删除操作前,请确保已经保存了所有需要的数据。
通过这些步骤,您可以清理不再需要的 Docker 镜像,从而帮助管理磁盘空间和维护环境的整洁。如果您需要进一步的帮助,请随时告诉我!
4. docker配置github仓库ghcr国内镜像加速
有时候使用ghcr.io 的镜像非常慢,可以采取使用国内的镜像进行加速
4.1. 创建或是修改 daemon.json文件
1 2 3 4 |
cat /etc/docker/daemon.json { "registry-mirrors": ["https://ghcr.nju.edu.cn"] } |
4.2. 重新加载 Docker 配置
1 |
sudo systemctl daemon-reload |
4.3. 重启 Docker 服务
1 |
sudo systemctl restart docker |
4.4. 拉取镜像
1 |
sudo docker pull ghcr.nju.edu.cn/open-webui/open-webui:main |