目录

1、flask服务(先在编辑器上面调式成功,代码开发阶段)

1.1 sever.py

1.2 Client.py

2、下载docker

3、Dockerfile文件配置

4、构建和运行 Docker 容器

5、部署到内网的linux系统上(工厂为内网,连不到外部网络,工厂局域网)

0、确保工厂内的上位机能够访问算法服务器:

1 创建容器与网络的关系

2 如何在没有网络的情况下创建容器

2.1. 提前下载并保存 Docker 镜像

2.2.加载镜像后,创建容器:

2.3当创建好容器后,若客户端调用服务报以下错误

6. 容器/镜像查看与删除

6.1 查看

1.查看镜像

2.查看容器

6.2 删除

1、删除容器

2. 删除镜像

3. 删除所有容器和镜像


1、flask服务(先在编辑器上面调式成功,代码开发阶段)

1.1 sever.py
from flask import Flask, jsonify, request
import json

app = Flask(__name__)

@app.route('/')
def home():
    return "Flask is running"

def algo(data,key,cave_time):
    file_path='./util/json/'+str(key)+str(cave_time)+".json"
    print(file_path)
    with open(file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
        return data

@app.route('/process', methods=['POST'])
def process_data():
    data = request.get_json()  # 尝试从客户端请求中获取 JSON 数据
    if data is None:
        return jsonify({'error': 'No JSON data provided'}), 400
    for key, value in data['Params']['Inspection_result'].items():
        if value == 'NG':
            print(key)
            break
    TTime = int(data["Params"]['time']) +1
    cave_time=TTime%4
    print(cave_time)
    response = algo(data,key,cave_time)
    print(response["time"])
    response["time"]=str(TTime)
    print(response)
    return jsonify(response)

if __name__ == '__main__':
    # 监听所有网络接口,并使用端口 5000
    app.run(host='0.0.0.0', port=5000)
    #app.run(host='10.10.85.46', port=5101)

# 确保 Flask 在 0.0.0.0 上运行,以允许外部访问;这样 Flask 服务就可以接受任何主机(包括外部主机)的请求。

1.2 Client.py
import requests


# 服务端局域网 IP 地址
server_ip = '10.10.85.46'  # 替换为服务端的实际局域网 IP 地址
server_url = f'http://{server_ip}:5000/process'  # 设置访问 Flask 服务的 URL


#server_url = f'http://172.17.0.2:5010/process'  # 设置访问 Flask 服务的 URL
data_to_send = \
    {
    "Params": {
        "screen_batch":"SPQORL1",
        "screen_size":"800*600",
        "time":"7",
        "temp": "0~3"
}
   
 

response = requests.post(server_url, json=data_to_send)

# 输出服务端返回的响应
if response.status_code == 200:
    print("Server response:", response.json())
else:
    print("Failed to communicate with the server. Status code:", response.status_code)


外部主机可以通过访问flask所在的主机ip 端口来调用flask服务(同一局域网)

2、下载docker

Ubuntu 系统上安装 Docker 是一个相对简单的过程。你可以按照以下步骤进行安装:

步骤 1: 更新包索引

首先,更新系统的包列表,以确保你安装的是最新的软件包。

sudo apt update

步骤 2: 安装依赖包

为了让 apt 使用 HTTPS 下载 Docker 软件包,需要安装一些依赖包:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

步骤 3: 添加 Docker 官方 GPG 密钥

Docker 的官方包需要使用 GPG 密钥进行验证,你可以通过以下命令来添加它:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

步骤 4: 添加 Docker 仓库

现在,你需要将 Docker 官方的 APT 仓库添加到你的系统中,以便可以通过 apt 来安装 Docker。

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

步骤 5: 更新包索引

添加 Docker 仓库后,重新更新系统包索引,以确保能够安装 Docker。

sudo apt update

步骤 6: 安装 Docker

现在,你可以安装 Docker CE(Community Edition)了。使用以下命令来安装 Docker:

sudo apt install docker-ce

步骤 7: 启动 Docker 并设置开机自启

安装完成后,Docker 服务应该会自动启动。你可以检查 Docker 是否正在运行:

sudo systemctl status docker

如果 Docker 没有自动启动,你可以手动启动它:

sudo systemctl start docker

同时,为了确保 Docker 在系统启动时自动启动,可以运行以下命令:

sudo systemctl enable docker

步骤 8: 验证 Docker 安装

确保 Docker 已成功安装并正常运行,可以通过运行以下命令来验证:

docker –version

你应该看到类似如下的输出,显示 Docker 的版本信息:

Docker version 20.10.x, build xxxxxxx

3、Dockerfile文件配置

3.1创建Dockerfile文件

e672dcade0584a3fa48005038aee0a50.png

3.2 Dockerfile 介绍

  1. 基础镜像

  • FROM harbocto.boe.com.cn/public/python:3.12.7

这行代码指定了 Docker 镜像的基础镜像。在这种情况下,你使用的是 harbocto.boe.com.cn/public/python:3.12.7,这是一个 Python 3.12.7 的基础镜像。确保这个镜像是你所需要的,并且能够正常访问。如果你是在一个内网环境中使用镜像,确保镜像源可用。

  • 设置工作目录

  • WORKDIR /code

WORKDIR 指定了容器内的工作目录。在执行后续的命令(如复制文件和安装依赖)时,所有相对路径都会基于这个目录。/code 是容器内的工作目录,你可以根据需要修改成其他名称。

  • 复制文件

  • COPY . /code

这行命令将当前上下文(即 Dockerfile 所在目录)的所有文件复制到容器的 /code 目录中。确保 requirements.txt 和你的 Python 代码文件(比如 server.py)都在当前目录中。

  • 安装依赖

  • RUN pip install --no-cache-dir -r requirements.txt
    注:在主文件目录下命令行输入: pipreqs ./   会生成当前项目需要的requirements.txt (有可能会缺少包,需要生成镜像测试看看,同时生成的包版本可能会有问题,若有问题,使用传统方式把所有requirements.txt 下载下来,然后替换)

这行命令使用 pip 安装 requirements.txt 文件中列出的所有 Python 依赖。--no-cache-dir 标志确保在安装过程中不缓存下载的包,以减小镜像大小。确保 requirements.txt 文件已正确列出所有所需的 Python 包。

  • 设置默认命令

  • CMD ["python", "server.py"]

这行命令定义了容器启动时的默认命令。在容器启动时,它会运行 python server.py,启动你的 Flask 应用。如果你使用的是其他的启动脚本或入口文件,可以相应地修改这部分命令。

暴露端口

EXPOSE 5000

EXPOSE 命令告诉 Docker 容器将在 5000 端口上监听。这通常用于 Flask 或其他 Web 应用程序,默认情况下 Flask 在端口 5000 上运行。注意,EXPOSE 只是一个文档声明,它不会实际映射端口;端口映射需要在运行容器时通过 docker run -p 命令来完成。

把Dockerfile文件和requirements.txt文件放入项目文件夹里面(这个例子的文件夹名为code)

30b6bba4e2304705bdec68a3eabd024f.png

4、构建和运行 Docker 容器

4.1 构建 Docker 镜像

在项目的根目录(包含 Dockerfile 和应用代码)中,使用 docker build 命令来构建镜像:

docker build -t code .
  • -t code 指定了镜像的名称为 code

  • . 表示当前目录是 Dockerfile 的位置。

Docker 会按照 Dockerfile 中的步骤逐步构建镜像,并将其存储在本地 Docker 镜像库中。

4.2. 运行 Docker 容器

镜像构建完成后,可以通过 docker run 命令来运行容器。

docker run -d -p 5000:5000 --name flask-container  code
  • -d:后台运行容器。

  • -p 5000:5000:将宿主机的 5000 端口映射到容器的 5000 端口。这样,你就可以通过 http://localhost:5000 访问应用。

  • --name flask-container:给容器命名为 flask-container

  • code:使用刚刚构建的镜像来创建容器。

在 Docker 中,删除镜像和容器是日常管理任务的一部分。以下是如何删除 Docker 镜像和容器的详细说明:

如果你想查看某个特定容器的日志输出,可以使用:

docker logs flask-container


5、部署到内网的linux系统上(工厂为内网,连不到外部网络,工厂局域网)

0、确保工厂内的上位机能够访问算法服务器:

0.1 测试网络通不通:

互相能够ping通,单方向通不行(算法服务器和上位机是互相通讯的,ping不通:协助工厂业务人员找it解决)

0.2 上位机能不能访问算法服务器端口

上位机能够根据该端口访问算法服务器,使用 telnet 命令测试(telnet 不通:找现地it解决)

telnet 是一个常用的网络工具,可以用来测试电脑之间端口的连通性。你可以从命令行输入以下命令:

telnet [目标IP] [端口号]

例如,测试是否能连接到目标 IP 地址为 192.168.1.10 的主机的端口 8080,可以输入:

telnet 192.168.1.10 8080

1 创建容器与网络的关系

在 Docker 中,创建容器本身并不依赖于网络连接。你可以在没有网络的环境下创建和运行容器,前提是你已经在本地系统上拥有所需的 Docker 镜像。如果你已经下载了所需的镜像(通过 docker pull 或者其他方式),那么你完全可以在没有网络连接的环境下直接使用这些镜像来创建容器。

2 如何在没有网络的情况下创建容器

如果目标系统没有网络,关键问题是如何确保你有合适的镜像可用。通常有两种情况:

2.1. 提前下载并保存 Docker 镜像

如果你知道目标系统没有网络,你可以在有网络的环境下提前下载 Docker 镜像,然后将镜像导出并转移到目标系统。

步骤

  1. 在有网络的环境下,使用 docker pull 下载所需的镜像(如 ubuntunginxmysql 等):

  • docker pull ubuntu:latest
  • 使用 docker save 将镜像保存为 .tar 文件:

  • docker save -o ubuntu_latest.tar ubuntu:latest
  • .tar 文件转移到目标系统。你可以通过 USB、SCP、或者其他文件传输方式将这个文件传输到没有网络的目标机器。

  • 在目标系统上,使用 docker load 加载这个镜像:

  • docker load -i ubuntu_latest.tar
2.2.加载镜像后,创建容器:

你可以使用 docker images 命令查看本地已经存在的镜像,然后选择镜像创建容器。

docker images
docker run -d -p 5000:5000 --name flask-container  code

code是创建的镜像名,flask-container为容器名

注:若不需要端口,例如定时处罚任务可以执行以下生成镜像:docker run -d --name flask-container code

2.3当创建好容器后,若客户端调用服务报以下错误
xception occurred during processing of request from ('172.17.0.1', 46768)
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/socketserver.py", line 318, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/local/lib/python3.12/socketserver.py", line 706, in process_request
    t.start()
  File "/usr/local/lib/python3.12/threading.py", line 994, in start
    _start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread

在 Docker 中,--privileged 是一个标志,它会授予容器额外的权限,允许容器执行一些普通容器不允许的操作。例如,它可以访问宿主机的设备、修改系统配置,甚至绕过某些安全限制。

如果你想在运行容器时添加 --privileged 选项,可以将其直接添加到 docker run 命令中。

修改命令示例:

假设你已经有一个 docker run 命令:

docker run -d -p 5000:5000 --name flask-container code

要使用 --privileged 选项,可以修改命令如下:

docker run -d -p 5000:5000 --privileged --name flask-container code

解释:

  • --privileged:授予容器所有的特权权限,允许容器做一些特权操作,例如访问宿主机的设备、加载内核模块等。
  • 其余部分保持不变:映射端口 5000:5000,指定容器名称为 flask-container,并使用镜像 code 启动容器。

使用 --privileged 的场景:

  • 访问硬件设备:例如,如果容器需要访问宿主机的 USB 设备或 GPU。
  • 修改系统设置:容器可能需要修改网络配置、挂载系统设备,或者修改操作系统级别的设置。
  • 使用 Docker 内部的特权功能:一些功能或操作只能在特权模式下运行,比如在容器中运行 Docker 引擎(Docker-in-Docker)等。

注意事项:

  1. 安全风险:使用 --privileged 会让容器拥有与宿主机接近的权限,可能会带来安全隐患。仅在可信的容器和受信任的环境中使用。
  2. 不推荐随意使用:在生产环境中,除非必须,否则避免使用 --privileged,因为它会绕过 Docker 的一些安全机制。

6. 容器/镜像查看与删除

6.1 查看
1.查看镜像

要查看当前系统中所有的 Docker 镜像,可以使用以下命令:

docker images
docker image ls

这将列出所有本地存在的镜像,包括镜像的仓库名、标签、镜像ID、创建时间和大小。

2.查看容器

要查看当前系统中所有的容器,可以使用以下命令:

docker ps

该命令只会列出正在运行的容器。如果你想查看所有容器(包括已经停止的容器),可以使用:

docker ps -a
  • docker ps -a 会显示所有容器(包括已停止的容器)。
  • docker ps 只会显示正在运行的容器。
6.2 删除
1、删除容器

停止并删除容器

如果容器正在运行,首先需要停止容器。可以使用以下命令停止容器:

docker stop <容器名或容器ID>

然后,删除已停止的容器:

docker rm <容器名或容器ID>

删除所有停止的容器

如果你希望删除所有停止的容器,可以使用以下命令:

docker container prune

这个命令会删除所有处于停止状态的容器,并提示确认。

删除单个容器

如果你知道容器的名称或 ID,可以直接删除特定容器:

docker rm <容器名或容器ID>

例如:

docker rm my-flask-container

删除多个容器

你也可以一次删除多个容器,方法是指定多个容器名称或 ID:

docker rm <容器名1> <容器名2> <容器名3>

例如:

docker rm flask-container my-flask-container another-container
2. 删除镜像

删除单个镜像

要删除特定的镜像,可以使用以下命令:

docker rmi <镜像名或镜像ID>

例如,删除名为 my-flask-app 的镜像:

docker rmi my-flask-app

删除未使用的镜像

如果你有未使用的镜像(即没有容器依赖的镜像),可以删除它们。使用以下命令删除所有未使用的镜像:

docker image prune

这将删除所有没有被任何容器使用的镜像,并提示你确认。

删除所有未使用的镜像

要删除所有未使用的镜像,包括悬挂镜像,可以使用:

docker image prune -a

这将删除所有未被任何容器引用的镜像。

删除多个镜像

你也可以一次性删除多个镜像:

docker rmi <镜像ID1> <镜像ID2> <镜像ID3>

例如:

docker rmi my-flask-app postgres:13
3. 删除所有容器和镜像

如果你想删除所有容器和镜像,可以先停止并删除所有容器,再删除所有镜像。

删除所有容器

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
  • docker ps -aq 会列出所有容器的 ID。

  • docker stop 停止容器,docker rm 删除容器。

删除所有镜像

docker rmi $(docker images -q)
  • docker images -q 会列出所有镜像的 ID。

警告:这将删除所有容器和镜像,请确保你不再需要它们,或者提前备份重要的数据。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐