从0到1构建工具站
网页在线编程工具构建(php、go、python)
出于对网页在线编程网站原理的好奇,深入学习和研究了其实现过程。网页在线编程工具,特别是支持 PHP、Go 和 Python 等语言的工具,为开发者提供了极大的便利,使编程变得更加灵活和高效,简单代码不用再自行搭建环境。其中也有一些缺点,接下来是具体实现过程。
搜集其他在线编程网站
分析:
多语言环境下直接使用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无非是执行脚本
- 将运行命令转为文件使用php或者python直接执行
- 采用docker run 直接执行命令不需要文件
执行文件流程
- 因为容器启动时候已经挂载到宿主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限制资源权限