从0到1构建工具站 - day6 (在线编程工具-docker)

从0到1构建工具站

网页在线编程工具构建(php、go、python)

出于对网页在线编程网站原理的好奇,深入学习和研究了其实现过程。网页在线编程工具,特别是支持 PHP、Go 和 Python 等语言的工具,为开发者提供了极大的便利,使编程变得更加灵活和高效,简单代码不用再自行搭建环境。其中也有一些缺点,接下来是具体实现过程。

搜集其他在线编程网站

  1. https://www.bejson.com/runcode/php/
  2. https://www.json.cn/run/python3/

分析:

多语言环境下直接使用docker构建好环境,然后执行指定文件或者直接执行命令的方式比较符合特征。因为Docker 容器隔离了运行时环境,确保了不同项目之间不会发生冲突。多个版本的同一应用或服务可以在不同的容器中并行运行,互不干扰。

构建php8运行环境

Dockerfile

yaml 复制代码
FROM php:8.4-fpm
# 创建用户并添加到 sudo 组  
RUN useradd --create-home --no-log-init --shell /bin/bash www \
  && adduser www sudo
# 切换到新用户  
USER www  

docker-compose.yaml

注意文件夹下创建data目录

bash 复制代码
services:
  php8.4:
    container_name: php8.4
    volumes:
      - ./data:/home/user
    working_dir: /home/user
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 9110:9000
    deploy:
      resources:  
        limits:  
          cpus: '2'         # 设置最大 CPU 限制为 0.5 个 CPU  
          memory: 512M        # 设置最大内存限制为 512 MB  
        reservations:  
          cpus: '1'         # 设置保留 CPU 资源为 0.2 个 CPU(可选)  
          memory: 500M        # 设置保留内存资源为 256 MB(可选) 

构建python运行环境

Dockerfile

注意requirements.txt .中写自己想要安装的库

bash 复制代码
FROM python:3.12-slim

# 创建用户并添加到 sudo 组  
RUN useradd --create-home --no-log-init --shell /bin/bash www \
  && adduser www sudo

# 切换到新用户  
USER www
WORKDIR /home/user

COPY requirements.txt .

# 安装 Python 依赖  
RUN pip install -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com -r requirements.txt

# 允许进入容器时执行 Python 代码  
CMD ["python3"]

docker-compose.yml

bash 复制代码
services:
  python3.12:
    container_name: python3.12
    build:
      context: .
      dockerfile: Dockerfile
    volumes:  
      - ./data:/home/user  # 将当前目录挂载到容器的 /app 目录
    working_dir: /home/user  # 设置容器内的工作目录
    environment:  # 配置环境变量
      - TZ=Asia/Shanghai  # 设置时区
    # command: pip install -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com -r requirements.txt
    tty: true   # 允许交互式终端
    deploy:
      resources:  
        limits:  
          cpus: '2'         # 设置最大 CPU 限制为 0.5 个 CPU  
          memory: 512M        # 设置最大内存限制为 512 MB  
        reservations:  
          cpus: '1'         # 设置保留 CPU 资源为 0.2 个 CPU(可选)  
          memory: 500M        # 设置保留内存资源为 256 MB(可选)  

核心调用python的docker-sdk包执行命令

博主基于django开发调用,原理相同

安装docker包

bash 复制代码
pip install docker

分析:

执行php以及python无非是执行脚本

  1. 将运行命令转为文件使用php或者python直接执行
  2. 采用docker run 直接执行命令不需要文件

执行文件流程

  1. 因为容器启动时候已经挂载到宿主data目录,直接在宿主创建文件然后再容器内执行
bash 复制代码
    def execute_php_code(code):
        filename = MyDockerClient.generate_filename()
        print("filename:", filename)
        # 注意自己启动时候容器名
        container_name = "php8.4"
        docker_volume_path = 'E:\\Project\\docker-compose\\runcode\\php8.4\\data'
        # 容器挂载的路径
        docker_file_path = f'{docker_volume_path}\\{filename}.php'
		# 注意python写入时encoding使用
        with open(docker_file_path, 'w', encoding='utf-8') as file:
            file.write(code)
        # 容器内部代码路径
        docker_work_path = '/home/user'
        command = f'php /{docker_work_path}/{filename}.php'
        return MyDockerClient.docker_exec_code(docker_volume_path, docker_file_path, container_name, command) 
   	# 执行函数  
    def docker_exec_code(docker_volume_path, docker_file_path, container_name, command):
        client = docker.from_env()  # 从环境变量创建 Docker 客户端  
        container = client.containers.get(container_name)  # 获取指定容器  
        try:  
            # 在容器中执行 PHP 代码  
            exec_command = container.exec_run(command, stderr=True, stdout=True)  
            # 打印输出和错误信息
            output = exec_command.output
            # 二进制转字符串
            output = output.decode('utf-8')
            # 删除文件
            import os
            os.remove(docker_file_path)
            print("STDOUT:\n", output)
            if exec_command.exit_code != 0:  
                # print("STDERR:\n", exec_command)  
                return output
            return output
        except Exception as e:  
            print(f"Error executing command: {e}")
            return f"Error executing command: {e}"

执行命令流程

python

bash 复制代码
    container_name = 'python3.12'  # 替换为您的实际容器名称
    client = docker.from_env()
    # MyDockerClient.execute_py312_code(python_code)
    # 在容器内执行 PHP 代码  
    try:  
        exec_result = client.containers.get(container_name).exec_run(  
            "python -c 'print(\"你好,世界!\")'",
            workdir="/tmp",  # 可选:指定工作目录  
        )  
        print(exec_result.output.decode('utf-8'))  # 输出执行结果  
    except docker.errors.NotFound:  
        print(f"容器 {container_name} 不存在!")  
    except docker.errors.APIError as e:  
        print(f"Docker API 错误: {e}")  
        print(result.decode('utf-8'))  # 输出: Hello from PHP! 

php

bash 复制代码
	client = docker.from_env()
    container = client.containers.get("php8.4")
    exec_result = container.exec_run(["php", "-r", "echo 'Running inside container!';"])
    print(exec_result.output.decode('utf-8'))

最终参考站

https://www.hyperfind.cn/web/run/python/

总结

通过上述方案,我们完成了PHP和Python多语言运行环境的容器化集成。基于Django框架可快速开发通用执行API,Go等环境的集成方法完全一致,只需替换基础镜像和执行命令即可实现多语言支持。

关键优势:

环境隔离 - 各语言运行在独立容器

扩展性强 - 新增语言只需添加容器配置

安全控制 - 通过Docker限制资源权限

相关推荐
that's boy1 小时前
字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎
运维·人工智能·gpt·自动化·midjourney·gpt-4o·deepseek
laimaxgg2 小时前
Dockerfile
linux·运维·服务器·ubuntu·docker
GalaxyPokemon2 小时前
LINUX基础 [四] - Linux工具
linux·运维
xxx郑三刀xxx2 小时前
https证书自动续期,不消耗腾讯云ssl证书免费次数
运维·后端
与passion共存2 小时前
Linux系统下Docker安装
linux·docker
西伯利亚猹2 小时前
Windows系统docker desktop安装(学习记录)
运维·docker·容器
曼岛_3 小时前
若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)
运维·服务器·框架搭建
LCY1333 小时前
centOS 安装和配置docker
linux·docker·centos
Linux运维老纪4 小时前
Linux系统常见磁盘扩容操作(Common Disk Expansion Operations in Linux Systems)
linux·运维·服务器·前端·数据库·云计算·运维开发
遇见火星4 小时前
基于Docker容器的CICD项目Jenkins/gitlab/harbor/Maven实战
docker·容器·gitlab·jenkins·maven·harbor·cicd