构建 PHP 开发环境:使用 Docker 和阿里云镜像加速器

2. ji引言

docker

Docker 是一个开源的容器化平台,它允许开发者打包应用及其依赖项到一个轻量级、可移植的容器中,然后可以在任何支持 Docker 的机器上运行这些容器。Docker 容器非常适合持续开发、测试和部署的工作流程。

主要特点:
  1. 轻量级和快速:Docker 容器共享宿主机的内核,不需要额外的操作系统,因此比传统虚拟机更轻量、启动更快。

  2. 可移植性:容器可以在任何安装了 Docker 的系统上运行,不受底层平台限制。

  3. 隔离性:每个容器都在自己的环境中运行,与其他容器和宿主系统隔离。

  4. 可重复性:Docker 容器的配置和依赖都定义在 Dockerfile 中,这确保了环境的一致性和可重复性。

  5. 易于管理:Docker 提供了强大的命令行和 API 接口,方便管理容器。

  6. 生态系统:Docker Hub和其他容器注册中心提供了大量预构建的容器镜像。

php

PHP 是一种广泛使用的开源服务器端脚本语言,特别适合于 web 开发并可嵌入 HTML 中。PHP 代码在服务器端执行,生成客户端浏览器可显示的 HTML。

主要特点:
  1. 灵活性:PHP 与 HTML 之间的无缝集成提供了高度的灵活性,允许动态内容的生成。

  2. 跨平台:PHP 可以在多种操作系统上运行,如 Windows、Linux 和 macOS。

  3. 广泛的数据库支持:PHP 支持多种数据库,如 MySQL、PostgreSQL 和 SQLite。

  4. 易于学习:对于新手来说,PHP 是一种相对容易学习的语言,具有广泛的社区支持和资源。

  5. 丰富的库和框架:PHP 拥有大量的库和开发框架,如 Laravel、Symfony 等,这些可以加快开发过程。

  6. 适用于各种规模的项目:从小型个人博客到大型企业级应用,PHP 都是一个很好的选择。

一、准备工作

1. 安装docker

详细流程参见我之前的博客:无桌面版docker在Ubuntu系统上安装-CSDN博客

2. 基础知识介绍

  • Dockerfile:这是一个文本文件,包含了一系列的指令,用于定义如何构建 Docker 镜像。例如,它可以包含从基础镜像开始、安装软件包、复制文件和设置环境变量的指令。

  • 镜像(Image):Docker 镜像是一个轻量级、独立、可执行的软件包,包含运行应用所需的一切:代码、运行时、库、环境变量和配置文件。

  • 容器(Container):当 Docker 镜像运行时,它在 Docker 引擎上运行的实例就是一个容器。容器是应用程序及其运行环境的封装。

  • 仓库(Registry):Docker Registry 是存储 Docker 镜像的地方。Docker Hub 是最常用的公共仓库,您可以从中拉取(pull)镜像,也可以将自己的镜像推送(push)到 Docker Hub 或其他 Registry。

二、创建dockerfile

1. Dockerfile基本结构

一个典型的 Dockerfile 包括以下部分:

  1. FROM: 指定基础镜像。所有的 Dockerfile 都必须从一个基础镜像开始。例如,如果您正在构建一个 PHP 应用,您可能会从一个官方的 PHP 镜像开始。

  2. RUN: 执行命令。用于在构建镜像时执行命令,比如安装软件包。

  3. COPYADD: 复制文件。将本地文件复制到镜像中。

  4. WORKDIR: 设置工作目录。指定容器内的工作目录。

  5. ENV: 环境变量。用于设置环境变量。

  6. EXPOSE: 暴露端口。指示 Docker 在运行容器时监听的端口。

  7. CMDENTRYPOINT: 定义容器启动后执行的命令。

2. 快速搭建php的docker镜像

2.1 编写Dockerfile

这里仅仅只是作为例子,可以根据自己的需求进行更改。

# 使用官方 PHP 镜像作为基础
FROM php:7.4-cli# 将 APT 源更改为阿里云源
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib" >/etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib" >>/etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/debian-security buster/updates main" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/debian-security buster/updates main" >>/etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib" >>/etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" >>/etc/apt/sources.list# 更新 APT 缓存并安装 RRDtool
RUN apt-get update && apt-get install -y rrdtool# 安装 PHP 扩展
RUN docker-php-ext-install mysqli pdo pdo_mysql# 设置容器中的工作目录
WORKDIR /usr/src/myapp# 容器启动时保持运行
CMD tail -f /dev/null

2.2 构建和运行Dockerfile

一旦您编写了 Dockerfile,可以使用以下命令来构建镜像:

docker build -t my-php-app .

这里,my-php-app 是您给镜像指定的名字,. 指定了 Dockerfile 和上下文的路径(当前目录)。

在命令行输入

docker images

查看docker镜像是否搭建成功。

三、运行Docker容器

构建完镜像后,使用以下命令启动一个容器:

docker run -it --rm --name my-php-container -v $(pwd):/usr/src/myapp php-dev-env

这个命令会启动一个名为 my-php-container 的容器,并将当前目录挂载到容器中的 /usr/src/myapp。这样,你就可以在本地编辑文件,而改动会实时反映到容器内。

四、测试php环境

1. 创建php脚本

在您项目的根目录下($(pwd)),创建一个名为 main.php 的新文件,然后添加以下内容之一:

main.php

这个脚本会输出一个简单的文本消息,验证 PHP 脚本是否能正确运行。


<?php
echo "Hello, World!";

2. 进入容器

sudo docker exec -it my-php-container bash

3. 运行程序

在命令行输入:

php main.php

可以看到会在命令行输出:Hello, World!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用js让用户输入一个数累加和

需求&#xff1a;用户输入一个数&#xff0c; 计算 1 到这个数的和。 比如 用户输入的是 5&#xff0c; 则计算 1~5 之间的累加和 并且输出到控制台 <body><script>let numprompt(请输入一个数)let sum0for(let i1;i<num;i){sumi}console.log(sum)</script…

进程终结之道:kill与pskill的神奇战斗

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 进程终结之道&#xff1a;kill与pskill的神奇战斗 前言基本用法kill命令&#xff1a;基础语法&#xff1a;选项&#xff1a;示例&#xff1a; pskill命令&#xff1a;基础语法&#xff1a;选项&#x…

【算法与数据结构】763、LeetCode划分字母区间

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题要求为&#xff1a; 1.尽可能多的划分片段2.字母只能出现在一个片段中3.片段连接起来仍然是s&…

pytorch04:网络模型创建

目录 一、模型创建过程1.1 以LeNet网络为例1.2 LeNet结构1.3 nn.Module 二、网络层容器(Containers)2.1 nn.Sequential2.1.1 常规方法实现2.1.2 OrderedDict方法实现 2.2 nn.ModuleList2.3 nn.ModuleDict2.4 三种容器构建总结 三、AlexNet网络构建 一、模型创建过程 1.1 以LeNe…

如何使用内网穿透工具实现远程SSH访问Deepin系统

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

LeetCode 32:最长有效括号

一、题目描述 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()"示例 2&…

leetcode递归算法题总结

递归本质是找重复的子问题 本章目录 1.汉诺塔2.合并两个有序链表3.反转链表4.两两交换链表中的节点5.Pow(x,n) 1.汉诺塔 汉诺塔 //面试写法 class Solution { public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {dfs(a,b…

踩坑记录-安装nuxt3报错:Error: Failed to download template from registry: fetch failed;

报错复现 安装nuxt3报错&#xff1a;Error: Failed to download template from registry: fetch failednpx nuxi init nuxt-demo 初始化nuxt 项目 报错 Error: Failed to download template from registry: fetch faile 解决方法 配置hosts Mac电脑&#xff1a;/etc/hostswin电…

众和策略:中一签最多赚超2万元!又有新股大涨

A股商场整体低位轰动 今天上午A股商场整体低位轰动。 板块和赛道方面&#xff0c;煤炭板块再度领涨&#xff0c;板块涨幅逾越1%&#xff0c;云煤动力涨停。 公用事业、钢铁、传媒、石油石化等板块涨幅居前。电子、计算机、通讯等板块跌幅居前。 概念板块方面&#xff0c;化…

深入探索小红书笔记详情API:解锁内容创新的无尽潜力

一、引言 在当今信息爆炸的时代&#xff0c;内容创新已经成为品牌和个人脱颖而出的关键。小红书&#xff0c;作为全球最大的消费类口碑库之一&#xff0c;每天产生大量的用户生成内容。而小红书笔记详情API&#xff0c;作为一个强大的工具&#xff0c;能够为内容创作者提供深入…

fpga xvc 调试实现,支持多端口同时调试多颗FPGA芯片

xilinx 推荐的实现结构方式如下&#xff1a; 通过一个ZYNQ运行xvc服务器&#xff0c;然后通过zynq去配置其他的FPGA&#xff0c;具体参考设计可以参考手册xapp1251&#xff0c;由于XVC运行的协议是标准的TCP协议&#xff0c;这种方式需要ZYNQ运行TCP协议&#xff0c;也就需要运…

uView Form 表单

此组件一般用于表单场景&#xff0c;可以配置Input输入框&#xff0c;Select弹出框&#xff0c;进行表单验证等。 注意&#xff1a; 由于在nvue下&#xff0c;u-form名称被uni-app官方占用&#xff0c;在nvue页面中请使用u--form名称&#xff0c;在vue页面中使用u--form或者u-…

【普中开发板】基于51单片机音乐盒LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

【普中开发板】基于51单片机音乐盒LCD1602显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P08 1. 主要功能&#xff1a; 基于51单片机AT89C51/52&#…

LLVM(简介)

历史 LLVM(low level virtual machine)起源于伊利诺伊大学的一个编译器实验项目&#xff0c;目前已经发展成一个集编译器和工具链为一体的商业开源项目&#xff0c;因此其英文名称的含义被扩大&#xff0c;不再仅仅是字面意思。其创始人为 Chris Lattner。LLVM项目遵循的开源许…

计算机软件考试试题——附答案

计算机软件考试试题 选择题 在面向对象编程中&#xff0c;继承的主要作用是&#xff1a; A. 提高代码的可读性B. 隐藏对象的实现细节C. 实现多重继承D. 复用已有代码 数据库中&#xff0c;以下哪个操作用于删除表中的所有数据&#xff0c;但保留表的结构&#xff1f; A. DELET…

Go语言命令行参数及cobra使用教程

Go语言命令行参数及cobra使用教程 1.原生命令行参数2.使用CIL框架Cobra创建 rootCmd创建你的 main.go创建其他命令子命令返回和处理错误 3.cobra使用标志4.Cobra位置参数和自定义参数5.Cobra PreRun和PostRun钩子 1.原生命令行参数 os 包以跨平台的方式&#xff0c;提供了一些…

Spring Boot 整合 MinIO自建对象存储服务

GitHub 地址&#xff1a;GitHub - minio/minio: The Object Store for AI Data Infrastructure 另外&#xff0c;MinIO 可以用来作为云原生应用的主要存储服务&#xff0c;因为云原生应用往往需要更高的吞吐量和更低的延迟&#xff0c;而这些都是 MinIO 的优势。安装过程跳过。…

CSS Grid 和 Flexbox

1.使用示例 CSS Grid&#xff1a; CSS Grid 是一种二维网格布局系统&#xff0c;可以用于创建复杂的网格布局。它允许你将元素放置到网格的行和列上&#xff0c;并通过设置网格属性来控制元素的位置和大小。 创建一个简单的 CSS Grid 布局&#xff0c;可以按照以下步骤进行&a…

Numpy基础

目录&#xff1a; 一、简介:二、array数组ndarray&#xff1a;1.array( )创建数组&#xff1a;2.数组赋值和引用的区别&#xff1a;3.arange( )创建区间数组&#xff1a;4.linspace( )创建等差数列&#xff1a;5.logspace( )创建等比数列&#xff1a;6.zeros( )创建全0数组&…

半导体设备系列:半导体制造产能扩张,设备零部件需求旺盛

近年来国内半导体制造产能不断扩张&#xff0c;半导体设备厂商加速成长。我们认为下游发展将拉动上游本地化配套需求&#xff0c;半导体设备零部件迎来高增长阶段。 摘要 半导体设备零部件包含密封圈、EFEM、射频电源、静电吸盘、硅电极、真空泵、气体流量计、喷淋头等产品&a…